From 5997b0416af48d77f22ef6115e375362d13afb33 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 4 Jul 2026 23:32:24 +0000 Subject: [PATCH 1/2] ogar-from-rails: DO arm mirrors controllers verbatim + re-export (no singulariser) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delete the singulariser entirely. It was inventing a namespace out of string-munged controller names — arbitrary, lossy (English plurals aren't invertible by heuristic: `Searches → searche`, `Capabilities → capabilitie`), and irreversible. The controller's own name IS the faithful identity; the semantics live in the classid, not in a prettified string. The DO arm is now a faithful `controllers` module that mirrors `app/controllers/` 1:1: - `container_of` snake-cases the controller stem **verbatim**, no singularisation: `NodesController → nodes`, `MapsController → maps`, `SearchesController → searches`, `ChangesetCommentsController → changeset_comments`. Reversible; matches Rails' own resource routes. - `controller_to_model` likewise stops singularising (returns `Nodes`). - render_osm emits `generated/controllers.rs` (was `actions.rs`); osm-domain does `#[path=…] pub mod controllers;` + `pub use controllers::*;`, so both `osm_domain::controllers::nodes::show(input)` and the re-exported `osm_domain::nodes::show(input)` resolve. The (part_of:is_a) rail + the `is_a` archetype axis (index→list, …) are unchanged — only the invented singular container naming is gone. Regenerated the parked snapshot; osm-domain builds; `container_of` verbatim test replaces the deleted singulariser test. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP --- .../generated/{actions.rs => controllers.rs} | 1006 +++++++++-------- .../crates/osm-domain/src/lib.rs | 18 +- .../osm-website-rs/harvest/osm_actions.rail | 598 +++++----- .../ogar-from-rails/examples/harvest_osm.rs | 5 +- crates/ogar-from-rails/src/lib.rs | 128 ++- .../ogar-render-askama/examples/render_osm.rs | 34 +- 6 files changed, 934 insertions(+), 855 deletions(-) rename .claude/harvest/osm-website-rs/crates/osm-domain/src/generated/{actions.rs => controllers.rs} (65%) diff --git a/.claude/harvest/osm-website-rs/crates/osm-domain/src/generated/actions.rs b/.claude/harvest/osm-website-rs/crates/osm-domain/src/generated/controllers.rs similarity index 65% rename from .claude/harvest/osm-website-rs/crates/osm-domain/src/generated/actions.rs rename to .claude/harvest/osm-website-rs/crates/osm-domain/src/generated/controllers.rs index 0d06983..25b700d 100644 --- a/.claude/harvest/osm-website-rs/crates/osm-domain/src/generated/actions.rs +++ b/.claude/harvest/osm-website-rs/crates/osm-domain/src/generated/controllers.rs @@ -1,6 +1,8 @@ -//! @generated DO-arm — OSM controller actions as `osm::::(input)`. -//! part_of = container module, is_a = action fn (standalone, not methods on the -//! data struct, per OGAR's ActionDef rule). Call: `osm::map::render(Input::default())`. +//! @generated DO arm — a faithful `controllers` mirror. Each module is a +//! source controller by its own verbatim (snake) name; each fn is an `is_a` +//! action (standalone, not methods on the record). osm-domain re-exports this +//! module (`pub use controllers::*`), so `controllers::nodes::show(input)` and +//! the re-exported `nodes::show(input)` both resolve. No singularisation. #![allow(clippy::all, dead_code, unused_variables)] @@ -13,37 +15,37 @@ pub struct Input; #[derive(Debug, Default)] pub struct Output; -pub mod account { +pub mod accounts { use super::{Input, Output}; - /// `account:delete` — DO arm. Source: `AccountsController#destroy`. + /// `accounts:delete` — DO arm. Source: `AccountsController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port AccountsController#destroy") } - /// `account:show` — DO arm. Source: `AccountsController#show`. + /// `accounts:show` — DO arm. Source: `AccountsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port AccountsController#show") } - /// `account:update` — DO arm. Source: `AccountsController#update`. + /// `accounts:update` — DO arm. Source: `AccountsController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port AccountsController#update") } } -pub mod active_list { +pub mod active_lists { use super::{Input, Output}; - /// `active_list:show` — DO arm. Source: `Api::UserBlocks::ActiveListsController#show`. + /// `active_lists:show` — DO arm. Source: `Api::UserBlocks::ActiveListsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::UserBlocks::ActiveListsController#show") } } -pub mod advanced_preference { +pub mod advanced_preferences { use super::{Input, Output}; - /// `advanced_preference:update_preferences` — DO arm. Source: `Preferences::AdvancedPreferencesController#update_preferences`. + /// `advanced_preferences:update_preferences` — DO arm. Source: `Preferences::AdvancedPreferencesController#update_preferences`. pub fn update_preferences(input: Input) -> Output { let _ = input; todo!("port Preferences::AdvancedPreferencesController#update_preferences") @@ -233,191 +235,191 @@ pub mod application { } } -pub mod basic_preference { +pub mod basic_preferences { use super::{Input, Output}; - /// `basic_preference:update_preferences` — DO arm. Source: `Preferences::BasicPreferencesController#update_preferences`. + /// `basic_preferences:update_preferences` — DO arm. Source: `Preferences::BasicPreferencesController#update_preferences`. pub fn update_preferences(input: Input) -> Output { let _ = input; todo!("port Preferences::BasicPreferencesController#update_preferences") } } -pub mod capabilitie { +pub mod capabilities { use super::{Input, Output}; - /// `capabilitie:show` — DO arm. Source: `Api::CapabilitiesController#show`. + /// `capabilities:show` — DO arm. Source: `Api::CapabilitiesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::CapabilitiesController#show") } } -pub mod changeset { +pub mod changeset_comments { use super::{Input, Output}; - /// `changeset:conditions_bbox` — DO arm. Source: `Api::ChangesetsController#conditions_bbox`. + /// `changeset_comments:create` — DO arm. Source: `Api::ChangesetCommentsController#create`. + pub fn create(input: Input) -> Output { + let _ = input; + todo!("port Api::ChangesetCommentsController#create") + } + /// `changeset_comments:list` — DO arm. Sources (canonical tile): `Api::ChangesetCommentsController#index`, `Users::ChangesetCommentsController#index`. + pub fn list(input: Input) -> Output { + let _ = input; + todo!("port Api::ChangesetCommentsController#index") + } + /// `changeset_comments:rate_limit_exceeded?` — DO arm. Source: `Api::ChangesetCommentsController#rate_limit_exceeded?`. + pub fn rate_limit_exceeded(input: Input) -> Output { + let _ = input; + todo!("port Api::ChangesetCommentsController#rate_limit_exceeded?") + } +} + +pub mod changeset_subscriptions { + use super::{Input, Output}; + /// `changeset_subscriptions:create` — DO arm. Sources (canonical tile): `Api::ChangesetSubscriptionsController#create`, `ChangesetSubscriptionsController#create`. + pub fn create(input: Input) -> Output { + let _ = input; + todo!("port Api::ChangesetSubscriptionsController#create") + } + /// `changeset_subscriptions:delete` — DO arm. Sources (canonical tile): `Api::ChangesetSubscriptionsController#destroy`, `ChangesetSubscriptionsController#destroy`. + pub fn delete(input: Input) -> Output { + let _ = input; + todo!("port Api::ChangesetSubscriptionsController#destroy") + } + /// `changeset_subscriptions:show` — DO arm. Source: `ChangesetSubscriptionsController#show`. + pub fn show(input: Input) -> Output { + let _ = input; + todo!("port ChangesetSubscriptionsController#show") + } +} + +pub mod changesets { + use super::{Input, Output}; + /// `changesets:conditions_bbox` — DO arm. Sources (canonical tile): `Api::ChangesetsController#conditions_bbox`, `ChangesetsController#conditions_bbox`. pub fn conditions_bbox(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#conditions_bbox") } - /// `changeset:conditions_closed` — DO arm. Source: `Api::ChangesetsController#conditions_closed`. + /// `changesets:conditions_closed` — DO arm. Source: `Api::ChangesetsController#conditions_closed`. pub fn conditions_closed(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#conditions_closed") } - /// `changeset:conditions_ids` — DO arm. Source: `Api::ChangesetsController#conditions_ids`. + /// `changesets:conditions_ids` — DO arm. Source: `Api::ChangesetsController#conditions_ids`. pub fn conditions_ids(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#conditions_ids") } - /// `changeset:conditions_nonempty` — DO arm. Source: `ChangesetsController#conditions_nonempty`. + /// `changesets:conditions_nonempty` — DO arm. Source: `ChangesetsController#conditions_nonempty`. pub fn conditions_nonempty(input: Input) -> Output { let _ = input; todo!("port ChangesetsController#conditions_nonempty") } - /// `changeset:conditions_open` — DO arm. Source: `Api::ChangesetsController#conditions_open`. + /// `changesets:conditions_open` — DO arm. Source: `Api::ChangesetsController#conditions_open`. pub fn conditions_open(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#conditions_open") } - /// `changeset:conditions_time` — DO arm. Source: `Api::ChangesetsController#conditions_time`. + /// `changesets:conditions_time` — DO arm. Source: `Api::ChangesetsController#conditions_time`. pub fn conditions_time(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#conditions_time") } - /// `changeset:conditions_user` — DO arm. Source: `Api::ChangesetsController#conditions_user`. + /// `changesets:conditions_user` — DO arm. Source: `Api::ChangesetsController#conditions_user`. pub fn conditions_user(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#conditions_user") } - /// `changeset:create` — DO arm. Source: `Api::ChangesetsController#create`. + /// `changesets:create` — DO arm. Source: `Api::ChangesetsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#create") } - /// `changeset:feed` — DO arm. Source: `ChangesetsController#feed`. + /// `changesets:feed` — DO arm. Source: `ChangesetsController#feed`. pub fn feed(input: Input) -> Output { let _ = input; todo!("port ChangesetsController#feed") } - /// `changeset:list` — DO arm. Source: `Api::ChangesetsController#index`. + /// `changesets:list` — DO arm. Sources (canonical tile): `Api::ChangesetsController#index`, `ChangesetsController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#index") } - /// `changeset:load_nodes` — DO arm. Source: `ChangesetsController#load_nodes`. + /// `changesets:load_nodes` — DO arm. Source: `ChangesetsController#load_nodes`. pub fn load_nodes(input: Input) -> Output { let _ = input; todo!("port ChangesetsController#load_nodes") } - /// `changeset:load_relations` — DO arm. Source: `ChangesetsController#load_relations`. + /// `changesets:load_relations` — DO arm. Source: `ChangesetsController#load_relations`. pub fn load_relations(input: Input) -> Output { let _ = input; todo!("port ChangesetsController#load_relations") } - /// `changeset:load_ways` — DO arm. Source: `ChangesetsController#load_ways`. + /// `changesets:load_ways` — DO arm. Source: `ChangesetsController#load_ways`. pub fn load_ways(input: Input) -> Output { let _ = input; todo!("port ChangesetsController#load_ways") } - /// `changeset:show` — DO arm. Source: `Api::ChangesetsController#show`. + /// `changesets:show` — DO arm. Sources (canonical tile): `Api::ChangesetsController#show`, `ChangesetsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#show") } - /// `changeset:update` — DO arm. Source: `Api::ChangesetsController#update`. + /// `changesets:update` — DO arm. Source: `Api::ChangesetsController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetsController#update") } - /// `changeset:wrap_lon` — DO arm. Source: `ChangesetsController#wrap_lon`. + /// `changesets:wrap_lon` — DO arm. Source: `ChangesetsController#wrap_lon`. pub fn wrap_lon(input: Input) -> Output { let _ = input; todo!("port ChangesetsController#wrap_lon") } } -pub mod changeset_comment { - use super::{Input, Output}; - /// `changeset_comment:create` — DO arm. Source: `Api::ChangesetCommentsController#create`. - pub fn create(input: Input) -> Output { - let _ = input; - todo!("port Api::ChangesetCommentsController#create") - } - /// `changeset_comment:list` — DO arm. Source: `Api::ChangesetCommentsController#index`. - pub fn list(input: Input) -> Output { - let _ = input; - todo!("port Api::ChangesetCommentsController#index") - } - /// `changeset_comment:rate_limit_exceeded?` — DO arm. Source: `Api::ChangesetCommentsController#rate_limit_exceeded?`. - pub fn rate_limit_exceeded(input: Input) -> Output { - let _ = input; - todo!("port Api::ChangesetCommentsController#rate_limit_exceeded?") - } -} - -pub mod changeset_subscription { +pub mod closes { use super::{Input, Output}; - /// `changeset_subscription:create` — DO arm. Source: `Api::ChangesetSubscriptionsController#create`. - pub fn create(input: Input) -> Output { - let _ = input; - todo!("port Api::ChangesetSubscriptionsController#create") - } - /// `changeset_subscription:delete` — DO arm. Source: `Api::ChangesetSubscriptionsController#destroy`. - pub fn delete(input: Input) -> Output { - let _ = input; - todo!("port Api::ChangesetSubscriptionsController#destroy") - } - /// `changeset_subscription:show` — DO arm. Source: `ChangesetSubscriptionsController#show`. - pub fn show(input: Input) -> Output { - let _ = input; - todo!("port ChangesetSubscriptionsController#show") - } -} - -pub mod close { - use super::{Input, Output}; - /// `close:update` — DO arm. Source: `Api::Changesets::ClosesController#update`. + /// `closes:update` — DO arm. Source: `Api::Changesets::ClosesController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Api::Changesets::ClosesController#update") } } -pub mod companie { +pub mod companies { use super::{Input, Output}; - /// `companie:update_profile` — DO arm. Source: `Profiles::CompaniesController#update_profile`. + /// `companies:update_profile` — DO arm. Source: `Profiles::CompaniesController#update_profile`. pub fn update_profile(input: Input) -> Output { let _ = input; todo!("port Profiles::CompaniesController#update_profile") } } -pub mod confirmation { +pub mod confirmations { use super::{Input, Output}; - /// `confirmation:confirm` — DO arm. Source: `ConfirmationsController#confirm`. + /// `confirmations:confirm` — DO arm. Source: `ConfirmationsController#confirm`. pub fn confirm(input: Input) -> Output { let _ = input; todo!("port ConfirmationsController#confirm") } - /// `confirmation:confirm_email` — DO arm. Source: `ConfirmationsController#confirm_email`. + /// `confirmations:confirm_email` — DO arm. Source: `ConfirmationsController#confirm_email`. pub fn confirm_email(input: Input) -> Output { let _ = input; todo!("port ConfirmationsController#confirm_email") } - /// `confirmation:confirm_resend` — DO arm. Source: `ConfirmationsController#confirm_resend`. + /// `confirmations:confirm_resend` — DO arm. Source: `ConfirmationsController#confirm_resend`. pub fn confirm_resend(input: Input) -> Output { let _ = input; todo!("port ConfirmationsController#confirm_resend") } - /// `confirmation:gravatar_status_message` — DO arm. Source: `ConfirmationsController#gravatar_status_message`. + /// `confirmations:gravatar_status_message` — DO arm. Source: `ConfirmationsController#gravatar_status_message`. pub fn gravatar_status_message(input: Input) -> Output { let _ = input; todo!("port ConfirmationsController#gravatar_status_message") } } -pub mod dashboard { +pub mod dashboards { use super::{Input, Output}; - /// `dashboard:show` — DO arm. Source: `DashboardsController#show`. + /// `dashboards:show` — DO arm. Source: `DashboardsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port DashboardsController#show") @@ -436,170 +438,170 @@ pub mod data { let _ = input; todo!("port Traces::DataController#offline_redirect") } - /// `data:show` — DO arm. Source: `Api::Traces::DataController#show`. + /// `data:show` — DO arm. Sources (canonical tile): `Api::Traces::DataController#show`, `Traces::DataController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::Traces::DataController#show") } } -pub mod deletion { +pub mod deletions { use super::{Input, Output}; - /// `deletion:show` — DO arm. Source: `Accounts::DeletionsController#show`. + /// `deletions:show` — DO arm. Source: `Accounts::DeletionsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Accounts::DeletionsController#show") } } -pub mod description { +pub mod descriptions { use super::{Input, Output}; - /// `description:update_profile` — DO arm. Source: `Profiles::DescriptionsController#update_profile`. + /// `descriptions:update_profile` — DO arm. Source: `Profiles::DescriptionsController#update_profile`. pub fn update_profile(input: Input) -> Output { let _ = input; todo!("port Profiles::DescriptionsController#update_profile") } } -pub mod diary_comment { +pub mod diary_comments { use super::{Input, Output}; - /// `diary_comment:comment_params` — DO arm. Source: `DiaryCommentsController#comment_params`. + /// `diary_comments:comment_params` — DO arm. Source: `DiaryCommentsController#comment_params`. pub fn comment_params(input: Input) -> Output { let _ = input; todo!("port DiaryCommentsController#comment_params") } - /// `diary_comment:create` — DO arm. Source: `DiaryCommentsController#create`. + /// `diary_comments:create` — DO arm. Source: `DiaryCommentsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port DiaryCommentsController#create") } - /// `diary_comment:hide` — DO arm. Source: `DiaryCommentsController#hide`. + /// `diary_comments:hide` — DO arm. Source: `DiaryCommentsController#hide`. pub fn hide(input: Input) -> Output { let _ = input; todo!("port DiaryCommentsController#hide") } - /// `diary_comment:list` — DO arm. Source: `Users::DiaryCommentsController#index`. + /// `diary_comments:list` — DO arm. Source: `Users::DiaryCommentsController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Users::DiaryCommentsController#index") } - /// `diary_comment:unhide` — DO arm. Source: `DiaryCommentsController#unhide`. + /// `diary_comments:unhide` — DO arm. Source: `DiaryCommentsController#unhide`. pub fn unhide(input: Input) -> Output { let _ = input; todo!("port DiaryCommentsController#unhide") } } -pub mod diary_entrie { +pub mod diary_entries { use super::{Input, Output}; - /// `diary_entrie:create` — DO arm. Source: `DiaryEntriesController#create`. + /// `diary_entries:create` — DO arm. Source: `DiaryEntriesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#create") } - /// `diary_entrie:edit` — DO arm. Source: `DiaryEntriesController#edit`. + /// `diary_entries:edit` — DO arm. Source: `DiaryEntriesController#edit`. pub fn edit(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#edit") } - /// `diary_entrie:entry_params` — DO arm. Source: `DiaryEntriesController#entry_params`. + /// `diary_entries:entry_params` — DO arm. Source: `DiaryEntriesController#entry_params`. pub fn entry_params(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#entry_params") } - /// `diary_entrie:hide` — DO arm. Source: `DiaryEntriesController#hide`. + /// `diary_entries:hide` — DO arm. Source: `DiaryEntriesController#hide`. pub fn hide(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#hide") } - /// `diary_entrie:list` — DO arm. Source: `DiaryEntriesController#index`. + /// `diary_entries:list` — DO arm. Source: `DiaryEntriesController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#index") } - /// `diary_entrie:new_form` — DO arm. Source: `DiaryEntriesController#new`. + /// `diary_entries:new_form` — DO arm. Source: `DiaryEntriesController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#new") } - /// `diary_entrie:rss` — DO arm. Source: `DiaryEntriesController#rss`. + /// `diary_entries:rss` — DO arm. Source: `DiaryEntriesController#rss`. pub fn rss(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#rss") } - /// `diary_entrie:set_map_location` — DO arm. Source: `DiaryEntriesController#set_map_location`. + /// `diary_entries:set_map_location` — DO arm. Source: `DiaryEntriesController#set_map_location`. pub fn set_map_location(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#set_map_location") } - /// `diary_entrie:show` — DO arm. Source: `DiaryEntriesController#show`. + /// `diary_entries:show` — DO arm. Source: `DiaryEntriesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#show") } - /// `diary_entrie:subscribe` — DO arm. Source: `DiaryEntriesController#subscribe`. + /// `diary_entries:subscribe` — DO arm. Source: `DiaryEntriesController#subscribe`. pub fn subscribe(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#subscribe") } - /// `diary_entrie:unhide` — DO arm. Source: `DiaryEntriesController#unhide`. + /// `diary_entries:unhide` — DO arm. Source: `DiaryEntriesController#unhide`. pub fn unhide(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#unhide") } - /// `diary_entrie:unsubscribe` — DO arm. Source: `DiaryEntriesController#unsubscribe`. + /// `diary_entries:unsubscribe` — DO arm. Source: `DiaryEntriesController#unsubscribe`. pub fn unsubscribe(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#unsubscribe") } - /// `diary_entrie:update` — DO arm. Source: `DiaryEntriesController#update`. + /// `diary_entries:update` — DO arm. Source: `DiaryEntriesController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port DiaryEntriesController#update") } } -pub mod direction { +pub mod directions { use super::{Input, Output}; - /// `direction:show` — DO arm. Source: `DirectionsController#show`. + /// `directions:show` — DO arm. Source: `DirectionsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port DirectionsController#show") } } -pub mod download { +pub mod downloads { use super::{Input, Output}; - /// `download:show` — DO arm. Source: `Api::Changesets::DownloadsController#show`. + /// `downloads:show` — DO arm. Source: `Api::Changesets::DownloadsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::Changesets::DownloadsController#show") } - /// `download:show_redactions?` — DO arm. Source: `Api::Changesets::DownloadsController#show_redactions?`. + /// `downloads:show_redactions?` — DO arm. Source: `Api::Changesets::DownloadsController#show_redactions?`. pub fn show_redactions(input: Input) -> Output { let _ = input; todo!("port Api::Changesets::DownloadsController#show_redactions?") } } -pub mod error { +pub mod errors { use super::{Input, Output}; - /// `error:bad_request` — DO arm. Source: `ErrorsController#bad_request`. + /// `errors:bad_request` — DO arm. Source: `ErrorsController#bad_request`. pub fn bad_request(input: Input) -> Output { let _ = input; todo!("port ErrorsController#bad_request") } - /// `error:forbidden` — DO arm. Source: `ErrorsController#forbidden`. + /// `errors:forbidden` — DO arm. Source: `ErrorsController#forbidden`. pub fn forbidden(input: Input) -> Output { let _ = input; todo!("port ErrorsController#forbidden") } - /// `error:internal_server_error` — DO arm. Source: `ErrorsController#internal_server_error`. + /// `errors:internal_server_error` — DO arm. Source: `ErrorsController#internal_server_error`. pub fn internal_server_error(input: Input) -> Output { let _ = input; todo!("port ErrorsController#internal_server_error") } - /// `error:not_found` — DO arm. Source: `ErrorsController#not_found`. + /// `errors:not_found` — DO arm. Source: `ErrorsController#not_found`. pub fn not_found(input: Input) -> Output { let _ = input; todo!("port ErrorsController#not_found") @@ -620,906 +622,906 @@ pub mod export { } } -pub mod feature_querie { +pub mod feature_queries { use super::{Input, Output}; - /// `feature_querie:show` — DO arm. Source: `FeatureQueriesController#show`. + /// `feature_queries:show` — DO arm. Source: `FeatureQueriesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port FeatureQueriesController#show") } } -pub mod feed { +pub mod feeds { use super::{Input, Output}; - /// `feed:show` — DO arm. Source: `ChangesetComments::FeedsController#show`. + /// `feeds:show` — DO arm. Sources (canonical tile): `ChangesetComments::FeedsController#show`, `Traces::FeedsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port ChangesetComments::FeedsController#show") } } -pub mod follow { +pub mod follows { use super::{Input, Output}; - /// `follow:create` — DO arm. Source: `FollowsController#create`. + /// `follows:create` — DO arm. Source: `FollowsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port FollowsController#create") } - /// `follow:delete` — DO arm. Source: `FollowsController#destroy`. + /// `follows:delete` — DO arm. Source: `FollowsController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port FollowsController#destroy") } - /// `follow:show` — DO arm. Source: `FollowsController#show`. + /// `follows:show` — DO arm. Source: `FollowsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port FollowsController#show") } } -pub mod heatmap { +pub mod heatmaps { use super::{Input, Output}; - /// `heatmap:show` — DO arm. Source: `Users::HeatmapsController#show`. + /// `heatmaps:show` — DO arm. Source: `Users::HeatmapsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Users::HeatmapsController#show") } - /// `heatmap:update_profile` — DO arm. Source: `Profiles::HeatmapsController#update_profile`. + /// `heatmaps:update_profile` — DO arm. Source: `Profiles::HeatmapsController#update_profile`. pub fn update_profile(input: Input) -> Output { let _ = input; todo!("port Profiles::HeatmapsController#update_profile") } } -pub mod home { +pub mod homes { use super::{Input, Output}; - /// `home:show` — DO arm. Source: `Accounts::HomesController#show`. + /// `homes:show` — DO arm. Source: `Accounts::HomesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Accounts::HomesController#show") } } -pub mod icon { +pub mod icons { use super::{Input, Output}; - /// `icon:show` — DO arm. Source: `Traces::IconsController#show`. + /// `icons:show` — DO arm. Source: `Traces::IconsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Traces::IconsController#show") } } -pub mod image { +pub mod images { use super::{Input, Output}; - /// `image:update_profile` — DO arm. Source: `Profiles::ImagesController#update_profile`. + /// `images:update_profile` — DO arm. Source: `Profiles::ImagesController#update_profile`. pub fn update_profile(input: Input) -> Output { let _ = input; todo!("port Profiles::ImagesController#update_profile") } } -pub mod inboxe { +pub mod inboxes { use super::{Input, Output}; - /// `inboxe:show` — DO arm. Source: `Api::Messages::InboxesController#show`. + /// `inboxes:show` — DO arm. Sources (canonical tile): `Api::Messages::InboxesController#show`, `Messages::InboxesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::Messages::InboxesController#show") } } -pub mod issue { +pub mod issue_comments { use super::{Input, Output}; - /// `issue:find_issue` — DO arm. Source: `IssuesController#find_issue`. + /// `issue_comments:create` — DO arm. Source: `IssueCommentsController#create`. + pub fn create(input: Input) -> Output { + let _ = input; + todo!("port IssueCommentsController#create") + } + /// `issue_comments:issue_comment_params` — DO arm. Source: `IssueCommentsController#issue_comment_params`. + pub fn issue_comment_params(input: Input) -> Output { + let _ = input; + todo!("port IssueCommentsController#issue_comment_params") + } + /// `issue_comments:reassign_issue` — DO arm. Source: `IssueCommentsController#reassign_issue`. + pub fn reassign_issue(input: Input) -> Output { + let _ = input; + todo!("port IssueCommentsController#reassign_issue") + } +} + +pub mod issued_blocks { + use super::{Input, Output}; + /// `issued_blocks:show` — DO arm. Source: `Users::IssuedBlocksController#show`. + pub fn show(input: Input) -> Output { + let _ = input; + todo!("port Users::IssuedBlocksController#show") + } +} + +pub mod issues { + use super::{Input, Output}; + /// `issues:find_issue` — DO arm. Source: `IssuesController#find_issue`. pub fn find_issue(input: Input) -> Output { let _ = input; todo!("port IssuesController#find_issue") } - /// `issue:ignore` — DO arm. Source: `IssuesController#ignore`. + /// `issues:ignore` — DO arm. Source: `IssuesController#ignore`. pub fn ignore(input: Input) -> Output { let _ = input; todo!("port IssuesController#ignore") } - /// `issue:list` — DO arm. Source: `IssuesController#index`. + /// `issues:list` — DO arm. Source: `IssuesController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port IssuesController#index") } - /// `issue:reopen` — DO arm. Source: `IssuesController#reopen`. + /// `issues:reopen` — DO arm. Source: `IssuesController#reopen`. pub fn reopen(input: Input) -> Output { let _ = input; todo!("port IssuesController#reopen") } - /// `issue:resolve` — DO arm. Source: `IssuesController#resolve`. + /// `issues:resolve` — DO arm. Source: `IssuesController#resolve`. pub fn resolve(input: Input) -> Output { let _ = input; todo!("port IssuesController#resolve") } - /// `issue:show` — DO arm. Source: `IssuesController#show`. + /// `issues:show` — DO arm. Source: `IssuesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port IssuesController#show") } } -pub mod issue_comment { +pub mod languages_panes { use super::{Input, Output}; - /// `issue_comment:create` — DO arm. Source: `IssueCommentsController#create`. - pub fn create(input: Input) -> Output { - let _ = input; - todo!("port IssueCommentsController#create") - } - /// `issue_comment:issue_comment_params` — DO arm. Source: `IssueCommentsController#issue_comment_params`. - pub fn issue_comment_params(input: Input) -> Output { - let _ = input; - todo!("port IssueCommentsController#issue_comment_params") - } - /// `issue_comment:reassign_issue` — DO arm. Source: `IssueCommentsController#reassign_issue`. - pub fn reassign_issue(input: Input) -> Output { - let _ = input; - todo!("port IssueCommentsController#reassign_issue") - } -} - -pub mod issued_block { - use super::{Input, Output}; - /// `issued_block:show` — DO arm. Source: `Users::IssuedBlocksController#show`. - pub fn show(input: Input) -> Output { - let _ = input; - todo!("port Users::IssuedBlocksController#show") - } -} - -pub mod languages_pane { - use super::{Input, Output}; - /// `languages_pane:show` — DO arm. Source: `LanguagesPanesController#show`. + /// `languages_panes:show` — DO arm. Source: `LanguagesPanesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port LanguagesPanesController#show") } } -pub mod latlon_querie { +pub mod latlon_queries { use super::{Input, Output}; - /// `latlon_querie:create` — DO arm. Source: `Searches::LatlonQueriesController#create`. + /// `latlon_queries:create` — DO arm. Source: `Searches::LatlonQueriesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Searches::LatlonQueriesController#create") } } -pub mod layers_pane { +pub mod layers_panes { use super::{Input, Output}; - /// `layers_pane:show` — DO arm. Source: `LayersPanesController#show`. + /// `layers_panes:show` — DO arm. Source: `LayersPanesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port LayersPanesController#show") } } -pub mod legend_pane { +pub mod legend_panes { use super::{Input, Output}; - /// `legend_pane:show` — DO arm. Source: `LegendPanesController#show`. + /// `legend_panes:show` — DO arm. Source: `LegendPanesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port LegendPanesController#show") } } -pub mod link { +pub mod links { use super::{Input, Output}; - /// `link:update_profile` — DO arm. Source: `Profiles::LinksController#update_profile`. + /// `links:update_profile` — DO arm. Source: `Profiles::LinksController#update_profile`. pub fn update_profile(input: Input) -> Output { let _ = input; todo!("port Profiles::LinksController#update_profile") } } -pub mod list { +pub mod lists { use super::{Input, Output}; - /// `list:show` — DO arm. Source: `Users::ListsController#show`. + /// `lists:show` — DO arm. Source: `Users::ListsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Users::ListsController#show") } - /// `list:update` — DO arm. Source: `Users::ListsController#update`. + /// `lists:update` — DO arm. Source: `Users::ListsController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Users::ListsController#update") } } -pub mod location { +pub mod locations { use super::{Input, Output}; - /// `location:show` — DO arm. Source: `Profiles::LocationsController#show`. + /// `locations:show` — DO arm. Source: `Profiles::LocationsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Profiles::LocationsController#show") } - /// `location:update_profile` — DO arm. Source: `Profiles::LocationsController#update_profile`. + /// `locations:update_profile` — DO arm. Source: `Profiles::LocationsController#update_profile`. pub fn update_profile(input: Input) -> Output { let _ = input; todo!("port Profiles::LocationsController#update_profile") } } -pub mod mailboxe { +pub mod mailboxes { use super::{Input, Output}; - /// `mailboxe:show_messages` — DO arm. Source: `Api::Messages::MailboxesController#show_messages`. + /// `mailboxes:show_messages` — DO arm. Source: `Api::Messages::MailboxesController#show_messages`. pub fn show_messages(input: Input) -> Output { let _ = input; todo!("port Api::Messages::MailboxesController#show_messages") } } -pub mod map { +pub mod maps { use super::{Input, Output}; - /// `map:show` — DO arm. Source: `Api::MapsController#show`. + /// `maps:show` — DO arm. Source: `Api::MapsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::MapsController#show") } } -pub mod message { +pub mod messages { use super::{Input, Output}; - /// `message:create` — DO arm. Source: `Api::MessagesController#create`. + /// `messages:create` — DO arm. Sources (canonical tile): `Api::MessagesController#create`, `MessagesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::MessagesController#create") } - /// `message:delete` — DO arm. Source: `Api::MessagesController#destroy`. + /// `messages:delete` — DO arm. Sources (canonical tile): `Api::MessagesController#destroy`, `MessagesController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::MessagesController#destroy") } - /// `message:message_params` — DO arm. Source: `MessagesController#message_params`. + /// `messages:message_params` — DO arm. Source: `MessagesController#message_params`. pub fn message_params(input: Input) -> Output { let _ = input; todo!("port MessagesController#message_params") } - /// `message:new_form` — DO arm. Source: `MessagesController#new`. + /// `messages:new_form` — DO arm. Source: `MessagesController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port MessagesController#new") } - /// `message:show` — DO arm. Source: `Api::MessagesController#show`. + /// `messages:show` — DO arm. Sources (canonical tile): `Api::MessagesController#show`, `MessagesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::MessagesController#show") } - /// `message:update` — DO arm. Source: `Api::MessagesController#update`. + /// `messages:update` — DO arm. Source: `Api::MessagesController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Api::MessagesController#update") } } -pub mod mute { +pub mod muted_inboxes { use super::{Input, Output}; - /// `mute:delete` — DO arm. Source: `Messages::MutesController#destroy`. - pub fn delete(input: Input) -> Output { + /// `muted_inboxes:show` — DO arm. Source: `Messages::MutedInboxesController#show`. + pub fn show(input: Input) -> Output { let _ = input; - todo!("port Messages::MutesController#destroy") + todo!("port Messages::MutedInboxesController#show") } } -pub mod muted_inboxe { +pub mod mutes { use super::{Input, Output}; - /// `muted_inboxe:show` — DO arm. Source: `Messages::MutedInboxesController#show`. - pub fn show(input: Input) -> Output { + /// `mutes:delete` — DO arm. Source: `Messages::MutesController#destroy`. + pub fn delete(input: Input) -> Output { let _ = input; - todo!("port Messages::MutedInboxesController#show") + todo!("port Messages::MutesController#destroy") } } -pub mod node { +pub mod nodes { use super::{Input, Output}; - /// `node:create` — DO arm. Source: `Api::NodesController#create`. + /// `nodes:create` — DO arm. Source: `Api::NodesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::NodesController#create") } - /// `node:delete` — DO arm. Source: `Api::NodesController#destroy`. + /// `nodes:delete` — DO arm. Source: `Api::NodesController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::NodesController#destroy") } - /// `node:list` — DO arm. Source: `Api::NodesController#index`. + /// `nodes:list` — DO arm. Source: `Api::NodesController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Api::NodesController#index") } - /// `node:show` — DO arm. Source: `Api::NodesController#show`. + /// `nodes:show` — DO arm. Sources (canonical tile): `Api::NodesController#show`, `NodesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::NodesController#show") } - /// `node:update` — DO arm. Source: `Api::NodesController#update`. + /// `nodes:update` — DO arm. Source: `Api::NodesController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Api::NodesController#update") } } -pub mod nominatim_querie { +pub mod nominatim_queries { use super::{Input, Output}; - /// `nominatim_querie:create` — DO arm. Source: `Searches::NominatimQueriesController#create`. + /// `nominatim_queries:create` — DO arm. Source: `Searches::NominatimQueriesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Searches::NominatimQueriesController#create") } } -pub mod nominatim_reverse_querie { +pub mod nominatim_reverse_queries { use super::{Input, Output}; - /// `nominatim_reverse_querie:create` — DO arm. Source: `Searches::NominatimReverseQueriesController#create`. + /// `nominatim_reverse_queries:create` — DO arm. Source: `Searches::NominatimReverseQueriesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Searches::NominatimReverseQueriesController#create") } } -pub mod note { +pub mod note_subscriptions { + use super::{Input, Output}; + /// `note_subscriptions:create` — DO arm. Source: `Api::NoteSubscriptionsController#create`. + pub fn create(input: Input) -> Output { + let _ = input; + todo!("port Api::NoteSubscriptionsController#create") + } + /// `note_subscriptions:delete` — DO arm. Source: `Api::NoteSubscriptionsController#destroy`. + pub fn delete(input: Input) -> Output { + let _ = input; + todo!("port Api::NoteSubscriptionsController#destroy") + } +} + +pub mod notes { use super::{Input, Output}; - /// `note:add_comment` — DO arm. Source: `Api::NotesController#add_comment`. + /// `notes:add_comment` — DO arm. Source: `Api::NotesController#add_comment`. pub fn add_comment(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#add_comment") } - /// `note:author_info` — DO arm. Source: `Api::NotesController#author_info`. + /// `notes:author_info` — DO arm. Source: `Api::NotesController#author_info`. pub fn author_info(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#author_info") } - /// `note:bbox_condition` — DO arm. Source: `Api::NotesController#bbox_condition`. + /// `notes:bbox_condition` — DO arm. Source: `Api::NotesController#bbox_condition`. pub fn bbox_condition(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#bbox_condition") } - /// `note:close` — DO arm. Source: `Api::NotesController#close`. + /// `notes:close` — DO arm. Source: `Api::NotesController#close`. pub fn close(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#close") } - /// `note:closed_condition` — DO arm. Source: `Api::NotesController#closed_condition`. + /// `notes:closed_condition` — DO arm. Source: `Api::NotesController#closed_condition`. pub fn closed_condition(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#closed_condition") } - /// `note:comment` — DO arm. Source: `Api::NotesController#comment`. + /// `notes:comment` — DO arm. Source: `Api::NotesController#comment`. pub fn comment(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#comment") } - /// `note:create` — DO arm. Source: `Api::NotesController#create`. + /// `notes:create` — DO arm. Source: `Api::NotesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#create") } - /// `note:delete` — DO arm. Source: `Api::NotesController#destroy`. + /// `notes:delete` — DO arm. Source: `Api::NotesController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#destroy") } - /// `note:feed` — DO arm. Source: `Api::NotesController#feed`. + /// `notes:feed` — DO arm. Source: `Api::NotesController#feed`. pub fn feed(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#feed") } - /// `note:list` — DO arm. Source: `Api::NotesController#index`. + /// `notes:list` — DO arm. Sources (canonical tile): `Api::NotesController#index`, `NotesController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#index") } - /// `note:new_form` — DO arm. Source: `NotesController#new`. + /// `notes:new_form` — DO arm. Source: `NotesController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port NotesController#new") } - /// `note:reopen` — DO arm. Source: `Api::NotesController#reopen`. + /// `notes:reopen` — DO arm. Source: `Api::NotesController#reopen`. pub fn reopen(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#reopen") } - /// `note:search` — DO arm. Source: `Api::NotesController#search`. + /// `notes:search` — DO arm. Source: `Api::NotesController#search`. pub fn search(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#search") } - /// `note:show` — DO arm. Source: `Api::NotesController#show`. + /// `notes:show` — DO arm. Sources (canonical tile): `Api::NotesController#show`, `NotesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::NotesController#show") } } -pub mod note_subscription { - use super::{Input, Output}; - /// `note_subscription:create` — DO arm. Source: `Api::NoteSubscriptionsController#create`. - pub fn create(input: Input) -> Output { - let _ = input; - todo!("port Api::NoteSubscriptionsController#create") - } - /// `note_subscription:delete` — DO arm. Source: `Api::NoteSubscriptionsController#destroy`. - pub fn delete(input: Input) -> Output { - let _ = input; - todo!("port Api::NoteSubscriptionsController#destroy") - } -} - -pub mod notification_preference { +pub mod notification_preferences { use super::{Input, Output}; - /// `notification_preference:update_preferences` — DO arm. Source: `Preferences::NotificationPreferencesController#update_preferences`. + /// `notification_preferences:update_preferences` — DO arm. Source: `Preferences::NotificationPreferencesController#update_preferences`. pub fn update_preferences(input: Input) -> Output { let _ = input; todo!("port Preferences::NotificationPreferencesController#update_preferences") } } -pub mod oauth2_application { +pub mod oauth2_applications { use super::{Input, Output}; - /// `oauth2_application:application_params` — DO arm. Source: `Oauth2ApplicationsController#application_params`. + /// `oauth2_applications:application_params` — DO arm. Source: `Oauth2ApplicationsController#application_params`. pub fn application_params(input: Input) -> Output { let _ = input; todo!("port Oauth2ApplicationsController#application_params") } - /// `oauth2_application:list` — DO arm. Source: `Oauth2ApplicationsController#index`. + /// `oauth2_applications:list` — DO arm. Source: `Oauth2ApplicationsController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Oauth2ApplicationsController#index") } - /// `oauth2_application:set_application` — DO arm. Source: `Oauth2ApplicationsController#set_application`. + /// `oauth2_applications:set_application` — DO arm. Source: `Oauth2ApplicationsController#set_application`. pub fn set_application(input: Input) -> Output { let _ = input; todo!("port Oauth2ApplicationsController#set_application") } } -pub mod old_element { +pub mod old_elements { use super::{Input, Output}; - /// `old_element:list` — DO arm. Source: `Api::OldElementsController#index`. + /// `old_elements:list` — DO arm. Source: `Api::OldElementsController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Api::OldElementsController#index") } - /// `old_element:require_moderator_for_unredacted_history` — DO arm. Source: `OldElementsController#require_moderator_for_unredacted_history`. + /// `old_elements:require_moderator_for_unredacted_history` — DO arm. Source: `OldElementsController#require_moderator_for_unredacted_history`. pub fn require_moderator_for_unredacted_history(input: Input) -> Output { let _ = input; todo!("port OldElementsController#require_moderator_for_unredacted_history") } - /// `old_element:show` — DO arm. Source: `Api::OldElementsController#show`. + /// `old_elements:show` — DO arm. Source: `Api::OldElementsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::OldElementsController#show") } - /// `old_element:show_redactions?` — DO arm. Source: `Api::OldElementsController#show_redactions?`. + /// `old_elements:show_redactions?` — DO arm. Source: `Api::OldElementsController#show_redactions?`. pub fn show_redactions(input: Input) -> Output { let _ = input; todo!("port Api::OldElementsController#show_redactions?") } } -pub mod old_node { +pub mod old_nodes { use super::{Input, Output}; - /// `old_node:list` — DO arm. Source: `OldNodesController#index`. + /// `old_nodes:list` — DO arm. Source: `OldNodesController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port OldNodesController#index") } - /// `old_node:lookup_old_element` — DO arm. Source: `Api::OldNodesController#lookup_old_element`. + /// `old_nodes:lookup_old_element` — DO arm. Source: `Api::OldNodesController#lookup_old_element`. pub fn lookup_old_element(input: Input) -> Output { let _ = input; todo!("port Api::OldNodesController#lookup_old_element") } - /// `old_node:lookup_old_element_versions` — DO arm. Source: `Api::OldNodesController#lookup_old_element_versions`. + /// `old_nodes:lookup_old_element_versions` — DO arm. Source: `Api::OldNodesController#lookup_old_element_versions`. pub fn lookup_old_element_versions(input: Input) -> Output { let _ = input; todo!("port Api::OldNodesController#lookup_old_element_versions") } - /// `old_node:show` — DO arm. Source: `OldNodesController#show`. + /// `old_nodes:show` — DO arm. Source: `OldNodesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port OldNodesController#show") } } -pub mod old_relation { +pub mod old_relation_members { + use super::{Input, Output}; + /// `old_relation_members:show` — DO arm. Source: `OldRelationMembersController#show`. + pub fn show(input: Input) -> Output { + let _ = input; + todo!("port OldRelationMembersController#show") + } +} + +pub mod old_relations { use super::{Input, Output}; - /// `old_relation:list` — DO arm. Source: `OldRelationsController#index`. + /// `old_relations:list` — DO arm. Source: `OldRelationsController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port OldRelationsController#index") } - /// `old_relation:lookup_old_element` — DO arm. Source: `Api::OldRelationsController#lookup_old_element`. + /// `old_relations:lookup_old_element` — DO arm. Source: `Api::OldRelationsController#lookup_old_element`. pub fn lookup_old_element(input: Input) -> Output { let _ = input; todo!("port Api::OldRelationsController#lookup_old_element") } - /// `old_relation:lookup_old_element_versions` — DO arm. Source: `Api::OldRelationsController#lookup_old_element_versions`. + /// `old_relations:lookup_old_element_versions` — DO arm. Source: `Api::OldRelationsController#lookup_old_element_versions`. pub fn lookup_old_element_versions(input: Input) -> Output { let _ = input; todo!("port Api::OldRelationsController#lookup_old_element_versions") } - /// `old_relation:show` — DO arm. Source: `OldRelationsController#show`. + /// `old_relations:show` — DO arm. Source: `OldRelationsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port OldRelationsController#show") } } -pub mod old_relation_member { - use super::{Input, Output}; - /// `old_relation_member:show` — DO arm. Source: `OldRelationMembersController#show`. - pub fn show(input: Input) -> Output { - let _ = input; - todo!("port OldRelationMembersController#show") - } -} - -pub mod old_way { +pub mod old_ways { use super::{Input, Output}; - /// `old_way:list` — DO arm. Source: `OldWaysController#index`. + /// `old_ways:list` — DO arm. Source: `OldWaysController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port OldWaysController#index") } - /// `old_way:lookup_old_element` — DO arm. Source: `Api::OldWaysController#lookup_old_element`. + /// `old_ways:lookup_old_element` — DO arm. Source: `Api::OldWaysController#lookup_old_element`. pub fn lookup_old_element(input: Input) -> Output { let _ = input; todo!("port Api::OldWaysController#lookup_old_element") } - /// `old_way:lookup_old_element_versions` — DO arm. Source: `Api::OldWaysController#lookup_old_element_versions`. + /// `old_ways:lookup_old_element_versions` — DO arm. Source: `Api::OldWaysController#lookup_old_element_versions`. pub fn lookup_old_element_versions(input: Input) -> Output { let _ = input; todo!("port Api::OldWaysController#lookup_old_element_versions") } - /// `old_way:show` — DO arm. Source: `OldWaysController#show`. + /// `old_ways:show` — DO arm. Source: `OldWaysController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port OldWaysController#show") } } -pub mod outboxe { +pub mod outboxes { use super::{Input, Output}; - /// `outboxe:show` — DO arm. Source: `Api::Messages::OutboxesController#show`. + /// `outboxes:show` — DO arm. Sources (canonical tile): `Api::Messages::OutboxesController#show`, `Messages::OutboxesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::Messages::OutboxesController#show") } } -pub mod password { +pub mod passwords { use super::{Input, Output}; - /// `password:create` — DO arm. Source: `PasswordsController#create`. + /// `passwords:create` — DO arm. Source: `PasswordsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port PasswordsController#create") } - /// `password:edit` — DO arm. Source: `PasswordsController#edit`. + /// `passwords:edit` — DO arm. Source: `PasswordsController#edit`. pub fn edit(input: Input) -> Output { let _ = input; todo!("port PasswordsController#edit") } - /// `password:new_form` — DO arm. Source: `PasswordsController#new`. + /// `passwords:new_form` — DO arm. Source: `PasswordsController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port PasswordsController#new") } - /// `password:update` — DO arm. Source: `PasswordsController#update`. + /// `passwords:update` — DO arm. Source: `PasswordsController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port PasswordsController#update") } } -pub mod pd_declaration { +pub mod pd_declarations { use super::{Input, Output}; - /// `pd_declaration:create` — DO arm. Source: `Accounts::PdDeclarationsController#create`. + /// `pd_declarations:create` — DO arm. Source: `Accounts::PdDeclarationsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Accounts::PdDeclarationsController#create") } - /// `pd_declaration:show` — DO arm. Source: `Accounts::PdDeclarationsController#show`. + /// `pd_declarations:show` — DO arm. Source: `Accounts::PdDeclarationsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Accounts::PdDeclarationsController#show") } } -pub mod permission { +pub mod permissions { use super::{Input, Output}; - /// `permission:show` — DO arm. Source: `Api::PermissionsController#show`. + /// `permissions:show` — DO arm. Source: `Api::PermissionsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::PermissionsController#show") } } -pub mod picture { +pub mod pictures { use super::{Input, Output}; - /// `picture:show` — DO arm. Source: `Traces::PicturesController#show`. + /// `pictures:show` — DO arm. Source: `Traces::PicturesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Traces::PicturesController#show") } } -pub mod preference { +pub mod preferences { use super::{Input, Output}; - /// `preference:show` — DO arm. Source: `Preferences::PreferencesController#show`. + /// `preferences:show` — DO arm. Source: `Preferences::PreferencesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Preferences::PreferencesController#show") } - /// `preference:update` — DO arm. Source: `Preferences::PreferencesController#update`. + /// `preferences:update` — DO arm. Source: `Preferences::PreferencesController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Preferences::PreferencesController#update") } } -pub mod profile_section { +pub mod profile_sections { use super::{Input, Output}; - /// `profile_section:show` — DO arm. Source: `Profiles::ProfileSectionsController#show`. + /// `profile_sections:show` — DO arm. Source: `Profiles::ProfileSectionsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Profiles::ProfileSectionsController#show") } - /// `profile_section:update` — DO arm. Source: `Profiles::ProfileSectionsController#update`. + /// `profile_sections:update` — DO arm. Source: `Profiles::ProfileSectionsController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Profiles::ProfileSectionsController#update") } } -pub mod querie { +pub mod queries { use super::{Input, Output}; - /// `querie:fetch_text` — DO arm. Source: `Searches::QueriesController#fetch_text`. + /// `queries:fetch_text` — DO arm. Source: `Searches::QueriesController#fetch_text`. pub fn fetch_text(input: Input) -> Output { let _ = input; todo!("port Searches::QueriesController#fetch_text") } - /// `querie:fetch_xml` — DO arm. Source: `Searches::QueriesController#fetch_xml`. + /// `queries:fetch_xml` — DO arm. Source: `Searches::QueriesController#fetch_xml`. pub fn fetch_xml(input: Input) -> Output { let _ = input; todo!("port Searches::QueriesController#fetch_xml") } } -pub mod read_mark { +pub mod read_marks { use super::{Input, Output}; - /// `read_mark:create` — DO arm. Source: `Messages::ReadMarksController#create`. + /// `read_marks:create` — DO arm. Source: `Messages::ReadMarksController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Messages::ReadMarksController#create") } - /// `read_mark:delete` — DO arm. Source: `Messages::ReadMarksController#destroy`. + /// `read_marks:delete` — DO arm. Source: `Messages::ReadMarksController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Messages::ReadMarksController#destroy") } - /// `read_mark:mark` — DO arm. Source: `Messages::ReadMarksController#mark`. + /// `read_marks:mark` — DO arm. Source: `Messages::ReadMarksController#mark`. pub fn mark(input: Input) -> Output { let _ = input; todo!("port Messages::ReadMarksController#mark") } } -pub mod received_block { +pub mod received_blocks { use super::{Input, Output}; - /// `received_block:delete` — DO arm. Source: `Users::ReceivedBlocksController#destroy`. + /// `received_blocks:delete` — DO arm. Source: `Users::ReceivedBlocksController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Users::ReceivedBlocksController#destroy") } - /// `received_block:edit` — DO arm. Source: `Users::ReceivedBlocksController#edit`. + /// `received_blocks:edit` — DO arm. Source: `Users::ReceivedBlocksController#edit`. pub fn edit(input: Input) -> Output { let _ = input; todo!("port Users::ReceivedBlocksController#edit") } - /// `received_block:show` — DO arm. Source: `Users::ReceivedBlocksController#show`. + /// `received_blocks:show` — DO arm. Source: `Users::ReceivedBlocksController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Users::ReceivedBlocksController#show") } } -pub mod redaction { +pub mod redactions { use super::{Input, Output}; - /// `redaction:create` — DO arm. Source: `Api::OldElements::RedactionsController#create`. + /// `redactions:create` — DO arm. Sources (canonical tile): `Api::OldElements::RedactionsController#create`, `RedactionsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::OldElements::RedactionsController#create") } - /// `redaction:delete` — DO arm. Source: `Api::OldElements::RedactionsController#destroy`. + /// `redactions:delete` — DO arm. Sources (canonical tile): `Api::OldElements::RedactionsController#destroy`, `RedactionsController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::OldElements::RedactionsController#destroy") } - /// `redaction:edit` — DO arm. Source: `RedactionsController#edit`. + /// `redactions:edit` — DO arm. Source: `RedactionsController#edit`. pub fn edit(input: Input) -> Output { let _ = input; todo!("port RedactionsController#edit") } - /// `redaction:list` — DO arm. Source: `RedactionsController#index`. + /// `redactions:list` — DO arm. Source: `RedactionsController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port RedactionsController#index") } - /// `redaction:lookup_old_element` — DO arm. Source: `Api::OldNodes::RedactionsController#lookup_old_element`. + /// `redactions:lookup_old_element` — DO arm. Sources (canonical tile): `Api::OldNodes::RedactionsController#lookup_old_element`, `Api::OldRelations::RedactionsController#lookup_old_element`, `Api::OldWays::RedactionsController#lookup_old_element`. pub fn lookup_old_element(input: Input) -> Output { let _ = input; todo!("port Api::OldNodes::RedactionsController#lookup_old_element") } - /// `redaction:lookup_redaction` — DO arm. Source: `RedactionsController#lookup_redaction`. + /// `redactions:lookup_redaction` — DO arm. Source: `RedactionsController#lookup_redaction`. pub fn lookup_redaction(input: Input) -> Output { let _ = input; todo!("port RedactionsController#lookup_redaction") } - /// `redaction:new_form` — DO arm. Source: `RedactionsController#new`. + /// `redactions:new_form` — DO arm. Source: `RedactionsController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port RedactionsController#new") } - /// `redaction:show` — DO arm. Source: `RedactionsController#show`. + /// `redactions:show` — DO arm. Source: `RedactionsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port RedactionsController#show") } - /// `redaction:update` — DO arm. Source: `RedactionsController#update`. + /// `redactions:update` — DO arm. Source: `RedactionsController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port RedactionsController#update") } } -pub mod relation { +pub mod relation_members { + use super::{Input, Output}; + /// `relation_members:show` — DO arm. Source: `RelationMembersController#show`. + pub fn show(input: Input) -> Output { + let _ = input; + todo!("port RelationMembersController#show") + } +} + +pub mod relations { use super::{Input, Output}; - /// `relation:create` — DO arm. Source: `Api::RelationsController#create`. + /// `relations:create` — DO arm. Source: `Api::RelationsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::RelationsController#create") } - /// `relation:delete` — DO arm. Source: `Api::RelationsController#destroy`. + /// `relations:delete` — DO arm. Source: `Api::RelationsController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::RelationsController#destroy") } - /// `relation:list` — DO arm. Source: `Api::Nodes::RelationsController#index`. + /// `relations:list` — DO arm. Sources (canonical tile): `Api::Nodes::RelationsController#index`, `Api::Relations::RelationsController#index`, `Api::RelationsController#index`, `Api::Ways::RelationsController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Api::Nodes::RelationsController#index") } - /// `relation:show` — DO arm. Source: `Api::RelationsController#show`. + /// `relations:show` — DO arm. Sources (canonical tile): `Api::RelationsController#show`, `RelationsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::RelationsController#show") } - /// `relation:update` — DO arm. Source: `Api::RelationsController#update`. + /// `relations:update` — DO arm. Source: `Api::RelationsController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Api::RelationsController#update") } } -pub mod relation_member { +pub mod replies { use super::{Input, Output}; - /// `relation_member:show` — DO arm. Source: `RelationMembersController#show`. - pub fn show(input: Input) -> Output { + /// `replies:new_form` — DO arm. Source: `Messages::RepliesController#new`. + pub fn new_form(input: Input) -> Output { let _ = input; - todo!("port RelationMembersController#show") + todo!("port Messages::RepliesController#new") } } -pub mod replie { +pub mod reporters { use super::{Input, Output}; - /// `replie:new_form` — DO arm. Source: `Messages::RepliesController#new`. - pub fn new_form(input: Input) -> Output { + /// `reporters:list` — DO arm. Source: `Issues::ReportersController#index`. + pub fn list(input: Input) -> Output { let _ = input; - todo!("port Messages::RepliesController#new") + todo!("port Issues::ReportersController#index") } } -pub mod report { +pub mod reports { use super::{Input, Output}; - /// `report:create` — DO arm. Source: `ReportsController#create`. + /// `reports:create` — DO arm. Source: `ReportsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port ReportsController#create") } - /// `report:create_new_report_params` — DO arm. Source: `ReportsController#create_new_report_params`. + /// `reports:create_new_report_params` — DO arm. Source: `ReportsController#create_new_report_params`. pub fn create_new_report_params(input: Input) -> Output { let _ = input; todo!("port ReportsController#create_new_report_params") } - /// `report:default_assigned_role` — DO arm. Source: `ReportsController#default_assigned_role`. + /// `reports:default_assigned_role` — DO arm. Source: `ReportsController#default_assigned_role`. pub fn default_assigned_role(input: Input) -> Output { let _ = input; todo!("port ReportsController#default_assigned_role") } - /// `report:issue_params` — DO arm. Source: `ReportsController#issue_params`. + /// `reports:issue_params` — DO arm. Source: `ReportsController#issue_params`. pub fn issue_params(input: Input) -> Output { let _ = input; todo!("port ReportsController#issue_params") } - /// `report:new_form` — DO arm. Source: `ReportsController#new`. + /// `reports:new_form` — DO arm. Source: `ReportsController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port ReportsController#new") } - /// `report:report_params` — DO arm. Source: `ReportsController#report_params`. + /// `reports:report_params` — DO arm. Source: `ReportsController#report_params`. pub fn report_params(input: Input) -> Output { let _ = input; todo!("port ReportsController#report_params") } - /// `report:required_new_report_params_present?` — DO arm. Source: `ReportsController#required_new_report_params_present?`. + /// `reports:required_new_report_params_present?` — DO arm. Source: `ReportsController#required_new_report_params_present?`. pub fn required_new_report_params_present(input: Input) -> Output { let _ = input; todo!("port ReportsController#required_new_report_params_present?") } } -pub mod reporter { +pub mod searches { use super::{Input, Output}; - /// `reporter:list` — DO arm. Source: `Issues::ReportersController#index`. - pub fn list(input: Input) -> Output { - let _ = input; - todo!("port Issues::ReportersController#index") - } -} - -pub mod searche { - use super::{Input, Output}; - /// `searche:dms_regexp` — DO arm. Source: `SearchesController#dms_regexp`. + /// `searches:dms_regexp` — DO arm. Source: `SearchesController#dms_regexp`. pub fn dms_regexp(input: Input) -> Output { let _ = input; todo!("port SearchesController#dms_regexp") } - /// `searche:normalize_params` — DO arm. Source: `SearchesController#normalize_params`. + /// `searches:normalize_params` — DO arm. Source: `SearchesController#normalize_params`. pub fn normalize_params(input: Input) -> Output { let _ = input; todo!("port SearchesController#normalize_params") } - /// `searche:show` — DO arm. Source: `SearchesController#show`. + /// `searches:show` — DO arm. Source: `SearchesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port SearchesController#show") } - /// `searche:to_decdeg` — DO arm. Source: `SearchesController#to_decdeg`. + /// `searches:to_decdeg` — DO arm. Source: `SearchesController#to_decdeg`. pub fn to_decdeg(input: Input) -> Output { let _ = input; todo!("port SearchesController#to_decdeg") } } -pub mod session { +pub mod sessions { use super::{Input, Output}; - /// `session:create` — DO arm. Source: `SessionsController#create`. + /// `sessions:create` — DO arm. Source: `SessionsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port SessionsController#create") } - /// `session:delete` — DO arm. Source: `SessionsController#destroy`. + /// `sessions:delete` — DO arm. Source: `SessionsController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port SessionsController#destroy") } - /// `session:new_form` — DO arm. Source: `SessionsController#new`. + /// `sessions:new_form` — DO arm. Source: `SessionsController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port SessionsController#new") } - /// `session:password_authentication` — DO arm. Source: `SessionsController#password_authentication`. + /// `sessions:password_authentication` — DO arm. Source: `SessionsController#password_authentication`. pub fn password_authentication(input: Input) -> Output { let _ = input; todo!("port SessionsController#password_authentication") } } -pub mod share_pane { +pub mod share_panes { use super::{Input, Output}; - /// `share_pane:show` — DO arm. Source: `SharePanesController#show`. + /// `share_panes:show` — DO arm. Source: `SharePanesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port SharePanesController#show") @@ -1600,371 +1602,371 @@ pub mod site { } } -pub mod statuse { +pub mod statuses { use super::{Input, Output}; - /// `statuse:lookup_user_by_name` — DO arm. Source: `Users::StatusesController#lookup_user_by_name`. + /// `statuses:lookup_user_by_name` — DO arm. Source: `Users::StatusesController#lookup_user_by_name`. pub fn lookup_user_by_name(input: Input) -> Output { let _ = input; todo!("port Users::StatusesController#lookup_user_by_name") } - /// `statuse:update` — DO arm. Source: `Users::StatusesController#update`. + /// `statuses:update` — DO arm. Source: `Users::StatusesController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Users::StatusesController#update") } } -pub mod term { +pub mod terms { use super::{Input, Output}; - /// `term:show` — DO arm. Source: `Accounts::TermsController#show`. + /// `terms:show` — DO arm. Source: `Accounts::TermsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Accounts::TermsController#show") } - /// `term:update` — DO arm. Source: `Accounts::TermsController#update`. + /// `terms:update` — DO arm. Source: `Accounts::TermsController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Accounts::TermsController#update") } } -pub mod trace { +pub mod tracepoints { + use super::{Input, Output}; + /// `tracepoints:list` — DO arm. Source: `Api::TracepointsController#index`. + pub fn list(input: Input) -> Output { + let _ = input; + todo!("port Api::TracepointsController#index") + } +} + +pub mod traces { use super::{Input, Output}; - /// `trace:create` — DO arm. Source: `Api::TracesController#create`. + /// `traces:create` — DO arm. Sources (canonical tile): `Api::TracesController#create`, `TracesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::TracesController#create") } - /// `trace:default_visibility` — DO arm. Source: `TracesController#default_visibility`. + /// `traces:default_visibility` — DO arm. Source: `TracesController#default_visibility`. pub fn default_visibility(input: Input) -> Output { let _ = input; todo!("port TracesController#default_visibility") } - /// `trace:delete` — DO arm. Source: `Api::TracesController#destroy`. + /// `traces:delete` — DO arm. Sources (canonical tile): `Api::TracesController#destroy`, `TracesController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::TracesController#destroy") } - /// `trace:do_create` — DO arm. Source: `Api::TracesController#do_create`. + /// `traces:do_create` — DO arm. Sources (canonical tile): `Api::TracesController#do_create`, `TracesController#do_create`. pub fn do_create(input: Input) -> Output { let _ = input; todo!("port Api::TracesController#do_create") } - /// `trace:edit` — DO arm. Source: `TracesController#edit`. + /// `traces:edit` — DO arm. Source: `TracesController#edit`. pub fn edit(input: Input) -> Output { let _ = input; todo!("port TracesController#edit") } - /// `trace:list` — DO arm. Source: `Api::Users::TracesController#index`. + /// `traces:list` — DO arm. Sources (canonical tile): `Api::Users::TracesController#index`, `TracesController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Api::Users::TracesController#index") } - /// `trace:mine` — DO arm. Source: `TracesController#mine`. + /// `traces:mine` — DO arm. Source: `TracesController#mine`. pub fn mine(input: Input) -> Output { let _ = input; todo!("port TracesController#mine") } - /// `trace:new_form` — DO arm. Source: `TracesController#new`. + /// `traces:new_form` — DO arm. Source: `TracesController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port TracesController#new") } - /// `trace:offline_error` — DO arm. Source: `Api::TracesController#offline_error`. + /// `traces:offline_error` — DO arm. Source: `Api::TracesController#offline_error`. pub fn offline_error(input: Input) -> Output { let _ = input; todo!("port Api::TracesController#offline_error") } - /// `trace:offline_redirect` — DO arm. Source: `TracesController#offline_redirect`. + /// `traces:offline_redirect` — DO arm. Source: `TracesController#offline_redirect`. pub fn offline_redirect(input: Input) -> Output { let _ = input; todo!("port TracesController#offline_redirect") } - /// `trace:offline_warning` — DO arm. Source: `TracesController#offline_warning`. + /// `traces:offline_warning` — DO arm. Source: `TracesController#offline_warning`. pub fn offline_warning(input: Input) -> Output { let _ = input; todo!("port TracesController#offline_warning") } - /// `trace:show` — DO arm. Source: `Api::TracesController#show`. + /// `traces:show` — DO arm. Sources (canonical tile): `Api::TracesController#show`, `TracesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::TracesController#show") } - /// `trace:trace_params` — DO arm. Source: `TracesController#trace_params`. + /// `traces:trace_params` — DO arm. Source: `TracesController#trace_params`. pub fn trace_params(input: Input) -> Output { let _ = input; todo!("port TracesController#trace_params") } - /// `trace:update` — DO arm. Source: `Api::TracesController#update`. + /// `traces:update` — DO arm. Sources (canonical tile): `Api::TracesController#update`, `TracesController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Api::TracesController#update") } } -pub mod tracepoint { - use super::{Input, Output}; - /// `tracepoint:list` — DO arm. Source: `Api::TracepointsController#index`. - pub fn list(input: Input) -> Output { - let _ = input; - todo!("port Api::TracepointsController#index") - } -} - -pub mod upload { +pub mod uploads { use super::{Input, Output}; - /// `upload:create` — DO arm. Source: `Api::Changesets::UploadsController#create`. + /// `uploads:create` — DO arm. Source: `Api::Changesets::UploadsController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::Changesets::UploadsController#create") } } -pub mod user { +pub mod user_blocks { use super::{Input, Output}; - /// `user:auth_failure` — DO arm. Source: `UsersController#auth_failure`. - pub fn auth_failure(input: Input) -> Output { - let _ = input; - todo!("port UsersController#auth_failure") - } - /// `user:auth_success` — DO arm. Source: `UsersController#auth_success`. - pub fn auth_success(input: Input) -> Output { - let _ = input; - todo!("port UsersController#auth_success") - } - /// `user:check_signup_allowed?` — DO arm. Source: `UsersController#check_signup_allowed?`. - pub fn check_signup_allowed(input: Input) -> Output { - let _ = input; - todo!("port UsersController#check_signup_allowed?") - } - /// `user:create` — DO arm. Source: `UsersController#create`. - pub fn create(input: Input) -> Output { - let _ = input; - todo!("port UsersController#create") - } - /// `user:details` — DO arm. Source: `Api::UsersController#details`. - pub fn details(input: Input) -> Output { - let _ = input; - todo!("port Api::UsersController#details") - } - /// `user:go_public` — DO arm. Source: `UsersController#go_public`. - pub fn go_public(input: Input) -> Output { - let _ = input; - todo!("port UsersController#go_public") - } - /// `user:list` — DO arm. Source: `Api::UsersController#index`. - pub fn list(input: Input) -> Output { - let _ = input; - todo!("port Api::UsersController#index") - } - /// `user:new_form` — DO arm. Source: `UsersController#new`. - pub fn new_form(input: Input) -> Output { - let _ = input; - todo!("port UsersController#new") - } - /// `user:save_new_user` — DO arm. Source: `UsersController#save_new_user`. - pub fn save_new_user(input: Input) -> Output { - let _ = input; - todo!("port UsersController#save_new_user") - } - /// `user:show` — DO arm. Source: `Api::UsersController#show`. - pub fn show(input: Input) -> Output { - let _ = input; - todo!("port Api::UsersController#show") - } - /// `user:user_params` — DO arm. Source: `UsersController#user_params`. - pub fn user_params(input: Input) -> Output { - let _ = input; - todo!("port UsersController#user_params") - } - /// `user:valid_turnstile_response?` — DO arm. Source: `UsersController#valid_turnstile_response?`. - pub fn valid_turnstile_response(input: Input) -> Output { - let _ = input; - todo!("port UsersController#valid_turnstile_response?") - } - /// `user:welcome_options` — DO arm. Source: `UsersController#welcome_options`. - pub fn welcome_options(input: Input) -> Output { - let _ = input; - todo!("port UsersController#welcome_options") - } -} - -pub mod user_block { - use super::{Input, Output}; - /// `user_block:create` — DO arm. Source: `Api::UserBlocksController#create`. + /// `user_blocks:create` — DO arm. Sources (canonical tile): `Api::UserBlocksController#create`, `UserBlocksController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::UserBlocksController#create") } - /// `user_block:edit` — DO arm. Source: `UserBlocksController#edit`. + /// `user_blocks:edit` — DO arm. Source: `UserBlocksController#edit`. pub fn edit(input: Input) -> Output { let _ = input; todo!("port UserBlocksController#edit") } - /// `user_block:list` — DO arm. Source: `UserBlocksController#index`. + /// `user_blocks:list` — DO arm. Source: `UserBlocksController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port UserBlocksController#index") } - /// `user_block:lookup_user_block` — DO arm. Source: `UserBlocksController#lookup_user_block`. + /// `user_blocks:lookup_user_block` — DO arm. Source: `UserBlocksController#lookup_user_block`. pub fn lookup_user_block(input: Input) -> Output { let _ = input; todo!("port UserBlocksController#lookup_user_block") } - /// `user_block:new_form` — DO arm. Source: `UserBlocksController#new`. + /// `user_blocks:new_form` — DO arm. Source: `UserBlocksController#new`. pub fn new_form(input: Input) -> Output { let _ = input; todo!("port UserBlocksController#new") } - /// `user_block:require_valid_params` — DO arm. Source: `UserBlocksController#require_valid_params`. + /// `user_blocks:require_valid_params` — DO arm. Source: `UserBlocksController#require_valid_params`. pub fn require_valid_params(input: Input) -> Output { let _ = input; todo!("port UserBlocksController#require_valid_params") } - /// `user_block:show` — DO arm. Source: `Api::UserBlocksController#show`. + /// `user_blocks:show` — DO arm. Sources (canonical tile): `Api::UserBlocksController#show`, `UserBlocksController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::UserBlocksController#show") } - /// `user_block:update` — DO arm. Source: `UserBlocksController#update`. + /// `user_blocks:update` — DO arm. Source: `UserBlocksController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port UserBlocksController#update") } } -pub mod user_mute { +pub mod user_mutes { use super::{Input, Output}; - /// `user_mute:create` — DO arm. Source: `UserMutesController#create`. + /// `user_mutes:create` — DO arm. Source: `UserMutesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port UserMutesController#create") } - /// `user_mute:delete` — DO arm. Source: `UserMutesController#destroy`. + /// `user_mutes:delete` — DO arm. Source: `UserMutesController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port UserMutesController#destroy") } - /// `user_mute:list` — DO arm. Source: `UserMutesController#index`. + /// `user_mutes:list` — DO arm. Source: `UserMutesController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port UserMutesController#index") } } -pub mod user_preference { +pub mod user_preferences { use super::{Input, Output}; - /// `user_preference:delete` — DO arm. Source: `Api::UserPreferencesController#destroy`. + /// `user_preferences:delete` — DO arm. Source: `Api::UserPreferencesController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::UserPreferencesController#destroy") } - /// `user_preference:list` — DO arm. Source: `Api::UserPreferencesController#index`. + /// `user_preferences:list` — DO arm. Source: `Api::UserPreferencesController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Api::UserPreferencesController#index") } - /// `user_preference:show` — DO arm. Source: `Api::UserPreferencesController#show`. + /// `user_preferences:show` — DO arm. Source: `Api::UserPreferencesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::UserPreferencesController#show") } - /// `user_preference:update` — DO arm. Source: `Api::UserPreferencesController#update`. + /// `user_preferences:update` — DO arm. Source: `Api::UserPreferencesController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Api::UserPreferencesController#update") } - /// `user_preference:update_all` — DO arm. Source: `Api::UserPreferencesController#update_all`. + /// `user_preferences:update_all` — DO arm. Source: `Api::UserPreferencesController#update_all`. pub fn update_all(input: Input) -> Output { let _ = input; todo!("port Api::UserPreferencesController#update_all") } } -pub mod user_role { +pub mod user_roles { use super::{Input, Output}; - /// `user_role:create` — DO arm. Source: `UserRolesController#create`. + /// `user_roles:create` — DO arm. Source: `UserRolesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port UserRolesController#create") } - /// `user_role:delete` — DO arm. Source: `UserRolesController#destroy`. + /// `user_roles:delete` — DO arm. Source: `UserRolesController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port UserRolesController#destroy") } - /// `user_role:in_role` — DO arm. Source: `UserRolesController#in_role`. + /// `user_roles:in_role` — DO arm. Source: `UserRolesController#in_role`. pub fn in_role(input: Input) -> Output { let _ = input; todo!("port UserRolesController#in_role") } - /// `user_role:not_in_role` — DO arm. Source: `UserRolesController#not_in_role`. + /// `user_roles:not_in_role` — DO arm. Source: `UserRolesController#not_in_role`. pub fn not_in_role(input: Input) -> Output { let _ = input; todo!("port UserRolesController#not_in_role") } - /// `user_role:require_valid_role` — DO arm. Source: `UserRolesController#require_valid_role`. + /// `user_roles:require_valid_role` — DO arm. Source: `UserRolesController#require_valid_role`. pub fn require_valid_role(input: Input) -> Output { let _ = input; todo!("port UserRolesController#require_valid_role") } } -pub mod version { +pub mod users { + use super::{Input, Output}; + /// `users:auth_failure` — DO arm. Source: `UsersController#auth_failure`. + pub fn auth_failure(input: Input) -> Output { + let _ = input; + todo!("port UsersController#auth_failure") + } + /// `users:auth_success` — DO arm. Source: `UsersController#auth_success`. + pub fn auth_success(input: Input) -> Output { + let _ = input; + todo!("port UsersController#auth_success") + } + /// `users:check_signup_allowed?` — DO arm. Source: `UsersController#check_signup_allowed?`. + pub fn check_signup_allowed(input: Input) -> Output { + let _ = input; + todo!("port UsersController#check_signup_allowed?") + } + /// `users:create` — DO arm. Source: `UsersController#create`. + pub fn create(input: Input) -> Output { + let _ = input; + todo!("port UsersController#create") + } + /// `users:details` — DO arm. Source: `Api::UsersController#details`. + pub fn details(input: Input) -> Output { + let _ = input; + todo!("port Api::UsersController#details") + } + /// `users:go_public` — DO arm. Source: `UsersController#go_public`. + pub fn go_public(input: Input) -> Output { + let _ = input; + todo!("port UsersController#go_public") + } + /// `users:list` — DO arm. Source: `Api::UsersController#index`. + pub fn list(input: Input) -> Output { + let _ = input; + todo!("port Api::UsersController#index") + } + /// `users:new_form` — DO arm. Source: `UsersController#new`. + pub fn new_form(input: Input) -> Output { + let _ = input; + todo!("port UsersController#new") + } + /// `users:save_new_user` — DO arm. Source: `UsersController#save_new_user`. + pub fn save_new_user(input: Input) -> Output { + let _ = input; + todo!("port UsersController#save_new_user") + } + /// `users:show` — DO arm. Sources (canonical tile): `Api::UsersController#show`, `UsersController#show`. + pub fn show(input: Input) -> Output { + let _ = input; + todo!("port Api::UsersController#show") + } + /// `users:user_params` — DO arm. Source: `UsersController#user_params`. + pub fn user_params(input: Input) -> Output { + let _ = input; + todo!("port UsersController#user_params") + } + /// `users:valid_turnstile_response?` — DO arm. Source: `UsersController#valid_turnstile_response?`. + pub fn valid_turnstile_response(input: Input) -> Output { + let _ = input; + todo!("port UsersController#valid_turnstile_response?") + } + /// `users:welcome_options` — DO arm. Source: `UsersController#welcome_options`. + pub fn welcome_options(input: Input) -> Output { + let _ = input; + todo!("port UsersController#welcome_options") + } +} + +pub mod versions { use super::{Input, Output}; - /// `version:show` — DO arm. Source: `Api::VersionsController#show`. + /// `versions:show` — DO arm. Source: `Api::VersionsController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::VersionsController#show") } } -pub mod visibilitie { +pub mod visibilities { use super::{Input, Output}; - /// `visibilitie:create` — DO arm. Source: `Api::ChangesetComments::VisibilitiesController#create`. + /// `visibilities:create` — DO arm. Source: `Api::ChangesetComments::VisibilitiesController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetComments::VisibilitiesController#create") } - /// `visibilitie:delete` — DO arm. Source: `Api::ChangesetComments::VisibilitiesController#destroy`. + /// `visibilities:delete` — DO arm. Source: `Api::ChangesetComments::VisibilitiesController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::ChangesetComments::VisibilitiesController#destroy") } } -pub mod way { +pub mod ways { use super::{Input, Output}; - /// `way:create` — DO arm. Source: `Api::WaysController#create`. + /// `ways:create` — DO arm. Source: `Api::WaysController#create`. pub fn create(input: Input) -> Output { let _ = input; todo!("port Api::WaysController#create") } - /// `way:delete` — DO arm. Source: `Api::WaysController#destroy`. + /// `ways:delete` — DO arm. Source: `Api::WaysController#destroy`. pub fn delete(input: Input) -> Output { let _ = input; todo!("port Api::WaysController#destroy") } - /// `way:list` — DO arm. Source: `Api::Nodes::WaysController#index`. + /// `ways:list` — DO arm. Sources (canonical tile): `Api::Nodes::WaysController#index`, `Api::WaysController#index`. pub fn list(input: Input) -> Output { let _ = input; todo!("port Api::Nodes::WaysController#index") } - /// `way:show` — DO arm. Source: `Api::WaysController#show`. + /// `ways:show` — DO arm. Sources (canonical tile): `Api::WaysController#show`, `WaysController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port Api::WaysController#show") } - /// `way:update` — DO arm. Source: `Api::WaysController#update`. + /// `ways:update` — DO arm. Source: `Api::WaysController#update`. pub fn update(input: Input) -> Output { let _ = input; todo!("port Api::WaysController#update") } } -pub mod webgl_error_pane { +pub mod webgl_error_panes { use super::{Input, Output}; - /// `webgl_error_pane:show` — DO arm. Source: `WebglErrorPanesController#show`. + /// `webgl_error_panes:show` — DO arm. Source: `WebglErrorPanesController#show`. pub fn show(input: Input) -> Output { let _ = input; todo!("port WebglErrorPanesController#show") diff --git a/.claude/harvest/osm-website-rs/crates/osm-domain/src/lib.rs b/.claude/harvest/osm-website-rs/crates/osm-domain/src/lib.rs index 5079656..9e9c186 100644 --- a/.claude/harvest/osm-website-rs/crates/osm-domain/src/lib.rs +++ b/.claude/harvest/osm-website-rs/crates/osm-domain/src/lib.rs @@ -4,17 +4,25 @@ //! - [`generated`] — the 50 rendered domain **structs** (THINK arm): associations //! become typed edge fields (`belongs_to → Option`, `has_many → Vec`), //! each with a `new(..)` constructor. -//! - [`osm`] — the **DO arm**: controller actions as standalone -//! `osm::::(input)` free functions (`osm::map::render(..)`), -//! NOT methods on the structs. +//! - [`controllers`] — the **DO arm**: a faithful mirror of `app/controllers/`. +//! Each module is a source controller by its own verbatim (snake) name +//! (`NodesController → nodes`, `MapController → map` — no singularisation); +//! each fn is an `is_a` action (`show`, `render`, …), standalone, NOT a method +//! on the record. The controller modules are re-exported at the crate root, so +//! `osm_domain::controllers::nodes::show(input)` and the re-exported +//! `osm_domain::nodes::show(input)` both resolve. //! //! Rendered by `ogar-render-askama`; do not edit by hand. [`HARVESTED_CLASSES`] //! is the flat inventory. pub mod generated; -#[path = "generated/actions.rs"] -pub mod osm; +#[path = "generated/controllers.rs"] +pub mod controllers; + +// Re-export the controller modules at the crate root — the ergonomic surface +// over the faithful mirror (`osm_domain::nodes::show` ≡ `controllers::nodes::show`). +pub use controllers::*; /// The 50 classes harvested from `openstreetmap-website@173885c1` `app/models`, /// in the order OGAR lifted them. Each maps to a rendered domain module. diff --git a/.claude/harvest/osm-website-rs/harvest/osm_actions.rail b/.claude/harvest/osm-website-rs/harvest/osm_actions.rail index f2a98f3..42ef1c8 100644 --- a/.claude/harvest/osm-website-rs/harvest/osm_actions.rail +++ b/.claude/harvest/osm-website-rs/harvest/osm_actions.rail @@ -2,11 +2,11 @@ # a u8:u8 HHTL tile per action; cast = fix one axis, walk the other # part_of[id]:is_a[id]\tcontroller#action -account[0x01]:delete[0x07] AccountsController#destroy -account[0x01]:show[0x02] AccountsController#show -account[0x01]:update[0x06] AccountsController#update -active_list[0x02]:show[0x02] Api::UserBlocks::ActiveListsController#show -advanced_preference[0x03]:update_preferences[0x84] Preferences::AdvancedPreferencesController#update_preferences +accounts[0x01]:delete[0x07] AccountsController#destroy +accounts[0x01]:show[0x02] AccountsController#show +accounts[0x01]:update[0x06] AccountsController#update +active_lists[0x02]:show[0x02] Api::UserBlocks::ActiveListsController#show +advanced_preferences[0x03]:update_preferences[0x84] Preferences::AdvancedPreferencesController#update_preferences api[0x04]:api_call_handle_error[0x0A] ApiController#api_call_handle_error api[0x04]:api_call_timeout[0x0B] ApiController#api_call_timeout api[0x04]:authorize[0x11] ApiController#authorize @@ -42,231 +42,231 @@ application[0x05]:set_locale[0x77] ApplicationController#set_locale application[0x05]:site_layout[0x7D] ApplicationController#site_layout application[0x05]:update_totp[0x86] ApplicationController#update_totp application[0x05]:web_timeout[0x89] ApplicationController#web_timeout -basic_preference[0x06]:update_preferences[0x84] Preferences::BasicPreferencesController#update_preferences -capabilitie[0x07]:show[0x02] Api::CapabilitiesController#show -changeset[0x08]:conditions_bbox[0x21] Api::ChangesetsController#conditions_bbox -changeset[0x08]:conditions_bbox[0x21] ChangesetsController#conditions_bbox -changeset[0x08]:conditions_closed[0x22] Api::ChangesetsController#conditions_closed -changeset[0x08]:conditions_ids[0x23] Api::ChangesetsController#conditions_ids -changeset[0x08]:conditions_nonempty[0x24] ChangesetsController#conditions_nonempty -changeset[0x08]:conditions_open[0x25] Api::ChangesetsController#conditions_open -changeset[0x08]:conditions_time[0x26] Api::ChangesetsController#conditions_time -changeset[0x08]:conditions_user[0x27] Api::ChangesetsController#conditions_user -changeset[0x08]:create[0x04] Api::ChangesetsController#create -changeset[0x08]:feed[0x37] ChangesetsController#feed -changeset[0x08]:list[0x01] Api::ChangesetsController#index -changeset[0x08]:list[0x01] ChangesetsController#index -changeset[0x08]:load_nodes[0x48] ChangesetsController#load_nodes -changeset[0x08]:load_relations[0x49] ChangesetsController#load_relations -changeset[0x08]:load_ways[0x4A] ChangesetsController#load_ways -changeset[0x08]:show[0x02] Api::ChangesetsController#show -changeset[0x08]:show[0x02] ChangesetsController#show -changeset[0x08]:update[0x06] Api::ChangesetsController#update -changeset[0x08]:wrap_lon[0x8C] ChangesetsController#wrap_lon -changeset_comment[0x09]:create[0x04] Api::ChangesetCommentsController#create -changeset_comment[0x09]:list[0x01] Api::ChangesetCommentsController#index -changeset_comment[0x09]:list[0x01] Users::ChangesetCommentsController#index -changeset_comment[0x09]:rate_limit_exceeded?[0x60] Api::ChangesetCommentsController#rate_limit_exceeded? -changeset_subscription[0x0A]:create[0x04] Api::ChangesetSubscriptionsController#create -changeset_subscription[0x0A]:create[0x04] ChangesetSubscriptionsController#create -changeset_subscription[0x0A]:delete[0x07] Api::ChangesetSubscriptionsController#destroy -changeset_subscription[0x0A]:delete[0x07] ChangesetSubscriptionsController#destroy -changeset_subscription[0x0A]:show[0x02] ChangesetSubscriptionsController#show -close[0x0B]:update[0x06] Api::Changesets::ClosesController#update -companie[0x0C]:update_profile[0x85] Profiles::CompaniesController#update_profile -confirmation[0x0D]:confirm[0x28] ConfirmationsController#confirm -confirmation[0x0D]:confirm_email[0x29] ConfirmationsController#confirm_email -confirmation[0x0D]:confirm_resend[0x2A] ConfirmationsController#confirm_resend -confirmation[0x0D]:gravatar_status_message[0x3E] ConfirmationsController#gravatar_status_message -dashboard[0x0E]:show[0x02] DashboardsController#show +basic_preferences[0x06]:update_preferences[0x84] Preferences::BasicPreferencesController#update_preferences +capabilities[0x07]:show[0x02] Api::CapabilitiesController#show +changeset_comments[0x08]:create[0x04] Api::ChangesetCommentsController#create +changeset_comments[0x08]:list[0x01] Api::ChangesetCommentsController#index +changeset_comments[0x08]:list[0x01] Users::ChangesetCommentsController#index +changeset_comments[0x08]:rate_limit_exceeded?[0x60] Api::ChangesetCommentsController#rate_limit_exceeded? +changeset_subscriptions[0x09]:create[0x04] Api::ChangesetSubscriptionsController#create +changeset_subscriptions[0x09]:create[0x04] ChangesetSubscriptionsController#create +changeset_subscriptions[0x09]:delete[0x07] Api::ChangesetSubscriptionsController#destroy +changeset_subscriptions[0x09]:delete[0x07] ChangesetSubscriptionsController#destroy +changeset_subscriptions[0x09]:show[0x02] ChangesetSubscriptionsController#show +changesets[0x0A]:conditions_bbox[0x21] Api::ChangesetsController#conditions_bbox +changesets[0x0A]:conditions_bbox[0x21] ChangesetsController#conditions_bbox +changesets[0x0A]:conditions_closed[0x22] Api::ChangesetsController#conditions_closed +changesets[0x0A]:conditions_ids[0x23] Api::ChangesetsController#conditions_ids +changesets[0x0A]:conditions_nonempty[0x24] ChangesetsController#conditions_nonempty +changesets[0x0A]:conditions_open[0x25] Api::ChangesetsController#conditions_open +changesets[0x0A]:conditions_time[0x26] Api::ChangesetsController#conditions_time +changesets[0x0A]:conditions_user[0x27] Api::ChangesetsController#conditions_user +changesets[0x0A]:create[0x04] Api::ChangesetsController#create +changesets[0x0A]:feed[0x37] ChangesetsController#feed +changesets[0x0A]:list[0x01] Api::ChangesetsController#index +changesets[0x0A]:list[0x01] ChangesetsController#index +changesets[0x0A]:load_nodes[0x48] ChangesetsController#load_nodes +changesets[0x0A]:load_relations[0x49] ChangesetsController#load_relations +changesets[0x0A]:load_ways[0x4A] ChangesetsController#load_ways +changesets[0x0A]:show[0x02] Api::ChangesetsController#show +changesets[0x0A]:show[0x02] ChangesetsController#show +changesets[0x0A]:update[0x06] Api::ChangesetsController#update +changesets[0x0A]:wrap_lon[0x8C] ChangesetsController#wrap_lon +closes[0x0B]:update[0x06] Api::Changesets::ClosesController#update +companies[0x0C]:update_profile[0x85] Profiles::CompaniesController#update_profile +confirmations[0x0D]:confirm[0x28] ConfirmationsController#confirm +confirmations[0x0D]:confirm_email[0x29] ConfirmationsController#confirm_email +confirmations[0x0D]:confirm_resend[0x2A] ConfirmationsController#confirm_resend +confirmations[0x0D]:gravatar_status_message[0x3E] ConfirmationsController#gravatar_status_message +dashboards[0x0E]:show[0x02] DashboardsController#show data[0x0F]:offline_error[0x58] Api::Traces::DataController#offline_error data[0x0F]:offline_redirect[0x59] Traces::DataController#offline_redirect data[0x0F]:show[0x02] Api::Traces::DataController#show data[0x0F]:show[0x02] Traces::DataController#show -deletion[0x10]:show[0x02] Accounts::DeletionsController#show -description[0x11]:update_profile[0x85] Profiles::DescriptionsController#update_profile -diary_comment[0x12]:comment_params[0x1F] DiaryCommentsController#comment_params -diary_comment[0x12]:create[0x04] DiaryCommentsController#create -diary_comment[0x12]:hide[0x40] DiaryCommentsController#hide -diary_comment[0x12]:list[0x01] Users::DiaryCommentsController#index -diary_comment[0x12]:unhide[0x81] DiaryCommentsController#unhide -diary_entrie[0x13]:create[0x04] DiaryEntriesController#create -diary_entrie[0x13]:edit[0x05] DiaryEntriesController#edit -diary_entrie[0x13]:entry_params[0x35] DiaryEntriesController#entry_params -diary_entrie[0x13]:hide[0x40] DiaryEntriesController#hide -diary_entrie[0x13]:list[0x01] DiaryEntriesController#index -diary_entrie[0x13]:new_form[0x03] DiaryEntriesController#new -diary_entrie[0x13]:rss[0x71] DiaryEntriesController#rss -diary_entrie[0x13]:set_map_location[0x78] DiaryEntriesController#set_map_location -diary_entrie[0x13]:show[0x02] DiaryEntriesController#show -diary_entrie[0x13]:subscribe[0x7E] DiaryEntriesController#subscribe -diary_entrie[0x13]:unhide[0x81] DiaryEntriesController#unhide -diary_entrie[0x13]:unsubscribe[0x82] DiaryEntriesController#unsubscribe -diary_entrie[0x13]:update[0x06] DiaryEntriesController#update -direction[0x14]:show[0x02] DirectionsController#show -download[0x15]:show[0x02] Api::Changesets::DownloadsController#show -download[0x15]:show_redactions?[0x7C] Api::Changesets::DownloadsController#show_redactions? -error[0x16]:bad_request[0x13] ErrorsController#bad_request -error[0x16]:forbidden[0x3B] ErrorsController#forbidden -error[0x16]:internal_server_error[0x44] ErrorsController#internal_server_error -error[0x16]:not_found[0x55] ErrorsController#not_found +deletions[0x10]:show[0x02] Accounts::DeletionsController#show +descriptions[0x11]:update_profile[0x85] Profiles::DescriptionsController#update_profile +diary_comments[0x12]:comment_params[0x1F] DiaryCommentsController#comment_params +diary_comments[0x12]:create[0x04] DiaryCommentsController#create +diary_comments[0x12]:hide[0x40] DiaryCommentsController#hide +diary_comments[0x12]:list[0x01] Users::DiaryCommentsController#index +diary_comments[0x12]:unhide[0x81] DiaryCommentsController#unhide +diary_entries[0x13]:create[0x04] DiaryEntriesController#create +diary_entries[0x13]:edit[0x05] DiaryEntriesController#edit +diary_entries[0x13]:entry_params[0x35] DiaryEntriesController#entry_params +diary_entries[0x13]:hide[0x40] DiaryEntriesController#hide +diary_entries[0x13]:list[0x01] DiaryEntriesController#index +diary_entries[0x13]:new_form[0x03] DiaryEntriesController#new +diary_entries[0x13]:rss[0x71] DiaryEntriesController#rss +diary_entries[0x13]:set_map_location[0x78] DiaryEntriesController#set_map_location +diary_entries[0x13]:show[0x02] DiaryEntriesController#show +diary_entries[0x13]:subscribe[0x7E] DiaryEntriesController#subscribe +diary_entries[0x13]:unhide[0x81] DiaryEntriesController#unhide +diary_entries[0x13]:unsubscribe[0x82] DiaryEntriesController#unsubscribe +diary_entries[0x13]:update[0x06] DiaryEntriesController#update +directions[0x14]:show[0x02] DirectionsController#show +downloads[0x15]:show[0x02] Api::Changesets::DownloadsController#show +downloads[0x15]:show_redactions?[0x7C] Api::Changesets::DownloadsController#show_redactions? +errors[0x16]:bad_request[0x13] ErrorsController#bad_request +errors[0x16]:forbidden[0x3B] ErrorsController#forbidden +errors[0x16]:internal_server_error[0x44] ErrorsController#internal_server_error +errors[0x16]:not_found[0x55] ErrorsController#not_found export[0x17]:create[0x04] ExportController#create export[0x17]:show[0x02] ExportController#show -feature_querie[0x18]:show[0x02] FeatureQueriesController#show -feed[0x19]:show[0x02] ChangesetComments::FeedsController#show -feed[0x19]:show[0x02] Traces::FeedsController#show -follow[0x1A]:create[0x04] FollowsController#create -follow[0x1A]:delete[0x07] FollowsController#destroy -follow[0x1A]:show[0x02] FollowsController#show -heatmap[0x1B]:show[0x02] Users::HeatmapsController#show -heatmap[0x1B]:update_profile[0x85] Profiles::HeatmapsController#update_profile -home[0x1C]:show[0x02] Accounts::HomesController#show -icon[0x1D]:show[0x02] Traces::IconsController#show -image[0x1E]:update_profile[0x85] Profiles::ImagesController#update_profile -inboxe[0x1F]:show[0x02] Api::Messages::InboxesController#show -inboxe[0x1F]:show[0x02] Messages::InboxesController#show -issue[0x20]:find_issue[0x3A] IssuesController#find_issue -issue[0x20]:ignore[0x42] IssuesController#ignore -issue[0x20]:list[0x01] IssuesController#index -issue[0x20]:reopen[0x64] IssuesController#reopen -issue[0x20]:resolve[0x6F] IssuesController#resolve -issue[0x20]:show[0x02] IssuesController#show -issue_comment[0x21]:create[0x04] IssueCommentsController#create -issue_comment[0x21]:issue_comment_params[0x46] IssueCommentsController#issue_comment_params -issue_comment[0x21]:reassign_issue[0x61] IssueCommentsController#reassign_issue -issued_block[0x22]:show[0x02] Users::IssuedBlocksController#show -languages_pane[0x23]:show[0x02] LanguagesPanesController#show -latlon_querie[0x24]:create[0x04] Searches::LatlonQueriesController#create -layers_pane[0x25]:show[0x02] LayersPanesController#show -legend_pane[0x26]:show[0x02] LegendPanesController#show -link[0x27]:update_profile[0x85] Profiles::LinksController#update_profile -list[0x28]:show[0x02] Users::ListsController#show -list[0x28]:update[0x06] Users::ListsController#update -location[0x29]:show[0x02] Profiles::LocationsController#show -location[0x29]:update_profile[0x85] Profiles::LocationsController#update_profile -mailboxe[0x2A]:show_messages[0x7B] Api::Messages::MailboxesController#show_messages -map[0x2B]:show[0x02] Api::MapsController#show -message[0x2C]:create[0x04] Api::MessagesController#create -message[0x2C]:create[0x04] MessagesController#create -message[0x2C]:delete[0x07] Api::MessagesController#destroy -message[0x2C]:delete[0x07] MessagesController#destroy -message[0x2C]:message_params[0x52] MessagesController#message_params -message[0x2C]:new_form[0x03] MessagesController#new -message[0x2C]:show[0x02] Api::MessagesController#show -message[0x2C]:show[0x02] MessagesController#show -message[0x2C]:update[0x06] Api::MessagesController#update -mute[0x2D]:delete[0x07] Messages::MutesController#destroy -muted_inboxe[0x2E]:show[0x02] Messages::MutedInboxesController#show -node[0x2F]:create[0x04] Api::NodesController#create -node[0x2F]:delete[0x07] Api::NodesController#destroy -node[0x2F]:list[0x01] Api::NodesController#index -node[0x2F]:show[0x02] Api::NodesController#show -node[0x2F]:show[0x02] NodesController#show -node[0x2F]:update[0x06] Api::NodesController#update -nominatim_querie[0x30]:create[0x04] Searches::NominatimQueriesController#create -nominatim_reverse_querie[0x31]:create[0x04] Searches::NominatimReverseQueriesController#create -note[0x32]:add_comment[0x09] Api::NotesController#add_comment -note[0x32]:author_info[0x10] Api::NotesController#author_info -note[0x32]:bbox_condition[0x14] Api::NotesController#bbox_condition -note[0x32]:close[0x1B] Api::NotesController#close -note[0x32]:closed_condition[0x1D] Api::NotesController#closed_condition -note[0x32]:comment[0x1E] Api::NotesController#comment -note[0x32]:create[0x04] Api::NotesController#create -note[0x32]:delete[0x07] Api::NotesController#destroy -note[0x32]:feed[0x37] Api::NotesController#feed -note[0x32]:list[0x01] Api::NotesController#index -note[0x32]:list[0x01] NotesController#index -note[0x32]:new_form[0x03] NotesController#new -note[0x32]:reopen[0x64] Api::NotesController#reopen -note[0x32]:search[0x75] Api::NotesController#search -note[0x32]:show[0x02] Api::NotesController#show -note[0x32]:show[0x02] NotesController#show -note_subscription[0x33]:create[0x04] Api::NoteSubscriptionsController#create -note_subscription[0x33]:delete[0x07] Api::NoteSubscriptionsController#destroy -notification_preference[0x34]:update_preferences[0x84] Preferences::NotificationPreferencesController#update_preferences -oauth2_application[0x35]:application_params[0x0D] Oauth2ApplicationsController#application_params -oauth2_application[0x35]:list[0x01] Oauth2ApplicationsController#index -oauth2_application[0x35]:set_application[0x76] Oauth2ApplicationsController#set_application -old_element[0x36]:list[0x01] Api::OldElementsController#index -old_element[0x36]:require_moderator_for_unredacted_history[0x68] OldElementsController#require_moderator_for_unredacted_history -old_element[0x36]:show[0x02] Api::OldElementsController#show -old_element[0x36]:show_redactions?[0x7C] Api::OldElementsController#show_redactions? -old_node[0x37]:list[0x01] OldNodesController#index -old_node[0x37]:lookup_old_element[0x4B] Api::OldNodesController#lookup_old_element -old_node[0x37]:lookup_old_element_versions[0x4C] Api::OldNodesController#lookup_old_element_versions -old_node[0x37]:show[0x02] OldNodesController#show -old_relation[0x38]:list[0x01] OldRelationsController#index -old_relation[0x38]:lookup_old_element[0x4B] Api::OldRelationsController#lookup_old_element -old_relation[0x38]:lookup_old_element_versions[0x4C] Api::OldRelationsController#lookup_old_element_versions -old_relation[0x38]:show[0x02] OldRelationsController#show -old_relation_member[0x39]:show[0x02] OldRelationMembersController#show -old_way[0x3A]:list[0x01] OldWaysController#index -old_way[0x3A]:lookup_old_element[0x4B] Api::OldWaysController#lookup_old_element -old_way[0x3A]:lookup_old_element_versions[0x4C] Api::OldWaysController#lookup_old_element_versions -old_way[0x3A]:show[0x02] OldWaysController#show -outboxe[0x3B]:show[0x02] Api::Messages::OutboxesController#show -outboxe[0x3B]:show[0x02] Messages::OutboxesController#show -password[0x3C]:create[0x04] PasswordsController#create -password[0x3C]:edit[0x05] PasswordsController#edit -password[0x3C]:new_form[0x03] PasswordsController#new -password[0x3C]:update[0x06] PasswordsController#update -pd_declaration[0x3D]:create[0x04] Accounts::PdDeclarationsController#create -pd_declaration[0x3D]:show[0x02] Accounts::PdDeclarationsController#show -permission[0x3E]:show[0x02] Api::PermissionsController#show -picture[0x3F]:show[0x02] Traces::PicturesController#show -preference[0x40]:show[0x02] Preferences::PreferencesController#show -preference[0x40]:update[0x06] Preferences::PreferencesController#update -profile_section[0x41]:show[0x02] Profiles::ProfileSectionsController#show -profile_section[0x41]:update[0x06] Profiles::ProfileSectionsController#update -querie[0x42]:fetch_text[0x38] Searches::QueriesController#fetch_text -querie[0x42]:fetch_xml[0x39] Searches::QueriesController#fetch_xml -read_mark[0x43]:create[0x04] Messages::ReadMarksController#create -read_mark[0x43]:delete[0x07] Messages::ReadMarksController#destroy -read_mark[0x43]:mark[0x51] Messages::ReadMarksController#mark -received_block[0x44]:delete[0x07] Users::ReceivedBlocksController#destroy -received_block[0x44]:edit[0x05] Users::ReceivedBlocksController#edit -received_block[0x44]:show[0x02] Users::ReceivedBlocksController#show -redaction[0x45]:create[0x04] Api::OldElements::RedactionsController#create -redaction[0x45]:create[0x04] RedactionsController#create -redaction[0x45]:delete[0x07] Api::OldElements::RedactionsController#destroy -redaction[0x45]:delete[0x07] RedactionsController#destroy -redaction[0x45]:edit[0x05] RedactionsController#edit -redaction[0x45]:list[0x01] RedactionsController#index -redaction[0x45]:lookup_old_element[0x4B] Api::OldNodes::RedactionsController#lookup_old_element -redaction[0x45]:lookup_old_element[0x4B] Api::OldRelations::RedactionsController#lookup_old_element -redaction[0x45]:lookup_old_element[0x4B] Api::OldWays::RedactionsController#lookup_old_element -redaction[0x45]:lookup_redaction[0x4D] RedactionsController#lookup_redaction -redaction[0x45]:new_form[0x03] RedactionsController#new -redaction[0x45]:show[0x02] RedactionsController#show -redaction[0x45]:update[0x06] RedactionsController#update -relation[0x46]:create[0x04] Api::RelationsController#create -relation[0x46]:delete[0x07] Api::RelationsController#destroy -relation[0x46]:list[0x01] Api::Nodes::RelationsController#index -relation[0x46]:list[0x01] Api::Relations::RelationsController#index -relation[0x46]:list[0x01] Api::RelationsController#index -relation[0x46]:list[0x01] Api::Ways::RelationsController#index -relation[0x46]:show[0x02] Api::RelationsController#show -relation[0x46]:show[0x02] RelationsController#show -relation[0x46]:update[0x06] Api::RelationsController#update -relation_member[0x47]:show[0x02] RelationMembersController#show -replie[0x48]:new_form[0x03] Messages::RepliesController#new -report[0x49]:create[0x04] ReportsController#create -report[0x49]:create_new_report_params[0x2C] ReportsController#create_new_report_params -report[0x49]:default_assigned_role[0x2F] ReportsController#default_assigned_role -report[0x49]:issue_params[0x47] ReportsController#issue_params -report[0x49]:new_form[0x03] ReportsController#new -report[0x49]:report_params[0x66] ReportsController#report_params -report[0x49]:required_new_report_params_present?[0x6E] ReportsController#required_new_report_params_present? -reporter[0x4A]:list[0x01] Issues::ReportersController#index -searche[0x4B]:dms_regexp[0x33] SearchesController#dms_regexp -searche[0x4B]:normalize_params[0x54] SearchesController#normalize_params -searche[0x4B]:show[0x02] SearchesController#show -searche[0x4B]:to_decdeg[0x7F] SearchesController#to_decdeg -session[0x4C]:create[0x04] SessionsController#create -session[0x4C]:delete[0x07] SessionsController#destroy -session[0x4C]:new_form[0x03] SessionsController#new -session[0x4C]:password_authentication[0x5B] SessionsController#password_authentication -share_pane[0x4D]:show[0x02] SharePanesController#show +feature_queries[0x18]:show[0x02] FeatureQueriesController#show +feeds[0x19]:show[0x02] ChangesetComments::FeedsController#show +feeds[0x19]:show[0x02] Traces::FeedsController#show +follows[0x1A]:create[0x04] FollowsController#create +follows[0x1A]:delete[0x07] FollowsController#destroy +follows[0x1A]:show[0x02] FollowsController#show +heatmaps[0x1B]:show[0x02] Users::HeatmapsController#show +heatmaps[0x1B]:update_profile[0x85] Profiles::HeatmapsController#update_profile +homes[0x1C]:show[0x02] Accounts::HomesController#show +icons[0x1D]:show[0x02] Traces::IconsController#show +images[0x1E]:update_profile[0x85] Profiles::ImagesController#update_profile +inboxes[0x1F]:show[0x02] Api::Messages::InboxesController#show +inboxes[0x1F]:show[0x02] Messages::InboxesController#show +issue_comments[0x20]:create[0x04] IssueCommentsController#create +issue_comments[0x20]:issue_comment_params[0x46] IssueCommentsController#issue_comment_params +issue_comments[0x20]:reassign_issue[0x61] IssueCommentsController#reassign_issue +issued_blocks[0x21]:show[0x02] Users::IssuedBlocksController#show +issues[0x22]:find_issue[0x3A] IssuesController#find_issue +issues[0x22]:ignore[0x42] IssuesController#ignore +issues[0x22]:list[0x01] IssuesController#index +issues[0x22]:reopen[0x64] IssuesController#reopen +issues[0x22]:resolve[0x6F] IssuesController#resolve +issues[0x22]:show[0x02] IssuesController#show +languages_panes[0x23]:show[0x02] LanguagesPanesController#show +latlon_queries[0x24]:create[0x04] Searches::LatlonQueriesController#create +layers_panes[0x25]:show[0x02] LayersPanesController#show +legend_panes[0x26]:show[0x02] LegendPanesController#show +links[0x27]:update_profile[0x85] Profiles::LinksController#update_profile +lists[0x28]:show[0x02] Users::ListsController#show +lists[0x28]:update[0x06] Users::ListsController#update +locations[0x29]:show[0x02] Profiles::LocationsController#show +locations[0x29]:update_profile[0x85] Profiles::LocationsController#update_profile +mailboxes[0x2A]:show_messages[0x7B] Api::Messages::MailboxesController#show_messages +maps[0x2B]:show[0x02] Api::MapsController#show +messages[0x2C]:create[0x04] Api::MessagesController#create +messages[0x2C]:create[0x04] MessagesController#create +messages[0x2C]:delete[0x07] Api::MessagesController#destroy +messages[0x2C]:delete[0x07] MessagesController#destroy +messages[0x2C]:message_params[0x52] MessagesController#message_params +messages[0x2C]:new_form[0x03] MessagesController#new +messages[0x2C]:show[0x02] Api::MessagesController#show +messages[0x2C]:show[0x02] MessagesController#show +messages[0x2C]:update[0x06] Api::MessagesController#update +muted_inboxes[0x2D]:show[0x02] Messages::MutedInboxesController#show +mutes[0x2E]:delete[0x07] Messages::MutesController#destroy +nodes[0x2F]:create[0x04] Api::NodesController#create +nodes[0x2F]:delete[0x07] Api::NodesController#destroy +nodes[0x2F]:list[0x01] Api::NodesController#index +nodes[0x2F]:show[0x02] Api::NodesController#show +nodes[0x2F]:show[0x02] NodesController#show +nodes[0x2F]:update[0x06] Api::NodesController#update +nominatim_queries[0x30]:create[0x04] Searches::NominatimQueriesController#create +nominatim_reverse_queries[0x31]:create[0x04] Searches::NominatimReverseQueriesController#create +note_subscriptions[0x32]:create[0x04] Api::NoteSubscriptionsController#create +note_subscriptions[0x32]:delete[0x07] Api::NoteSubscriptionsController#destroy +notes[0x33]:add_comment[0x09] Api::NotesController#add_comment +notes[0x33]:author_info[0x10] Api::NotesController#author_info +notes[0x33]:bbox_condition[0x14] Api::NotesController#bbox_condition +notes[0x33]:close[0x1B] Api::NotesController#close +notes[0x33]:closed_condition[0x1D] Api::NotesController#closed_condition +notes[0x33]:comment[0x1E] Api::NotesController#comment +notes[0x33]:create[0x04] Api::NotesController#create +notes[0x33]:delete[0x07] Api::NotesController#destroy +notes[0x33]:feed[0x37] Api::NotesController#feed +notes[0x33]:list[0x01] Api::NotesController#index +notes[0x33]:list[0x01] NotesController#index +notes[0x33]:new_form[0x03] NotesController#new +notes[0x33]:reopen[0x64] Api::NotesController#reopen +notes[0x33]:search[0x75] Api::NotesController#search +notes[0x33]:show[0x02] Api::NotesController#show +notes[0x33]:show[0x02] NotesController#show +notification_preferences[0x34]:update_preferences[0x84] Preferences::NotificationPreferencesController#update_preferences +oauth2_applications[0x35]:application_params[0x0D] Oauth2ApplicationsController#application_params +oauth2_applications[0x35]:list[0x01] Oauth2ApplicationsController#index +oauth2_applications[0x35]:set_application[0x76] Oauth2ApplicationsController#set_application +old_elements[0x36]:list[0x01] Api::OldElementsController#index +old_elements[0x36]:require_moderator_for_unredacted_history[0x68] OldElementsController#require_moderator_for_unredacted_history +old_elements[0x36]:show[0x02] Api::OldElementsController#show +old_elements[0x36]:show_redactions?[0x7C] Api::OldElementsController#show_redactions? +old_nodes[0x37]:list[0x01] OldNodesController#index +old_nodes[0x37]:lookup_old_element[0x4B] Api::OldNodesController#lookup_old_element +old_nodes[0x37]:lookup_old_element_versions[0x4C] Api::OldNodesController#lookup_old_element_versions +old_nodes[0x37]:show[0x02] OldNodesController#show +old_relation_members[0x38]:show[0x02] OldRelationMembersController#show +old_relations[0x39]:list[0x01] OldRelationsController#index +old_relations[0x39]:lookup_old_element[0x4B] Api::OldRelationsController#lookup_old_element +old_relations[0x39]:lookup_old_element_versions[0x4C] Api::OldRelationsController#lookup_old_element_versions +old_relations[0x39]:show[0x02] OldRelationsController#show +old_ways[0x3A]:list[0x01] OldWaysController#index +old_ways[0x3A]:lookup_old_element[0x4B] Api::OldWaysController#lookup_old_element +old_ways[0x3A]:lookup_old_element_versions[0x4C] Api::OldWaysController#lookup_old_element_versions +old_ways[0x3A]:show[0x02] OldWaysController#show +outboxes[0x3B]:show[0x02] Api::Messages::OutboxesController#show +outboxes[0x3B]:show[0x02] Messages::OutboxesController#show +passwords[0x3C]:create[0x04] PasswordsController#create +passwords[0x3C]:edit[0x05] PasswordsController#edit +passwords[0x3C]:new_form[0x03] PasswordsController#new +passwords[0x3C]:update[0x06] PasswordsController#update +pd_declarations[0x3D]:create[0x04] Accounts::PdDeclarationsController#create +pd_declarations[0x3D]:show[0x02] Accounts::PdDeclarationsController#show +permissions[0x3E]:show[0x02] Api::PermissionsController#show +pictures[0x3F]:show[0x02] Traces::PicturesController#show +preferences[0x40]:show[0x02] Preferences::PreferencesController#show +preferences[0x40]:update[0x06] Preferences::PreferencesController#update +profile_sections[0x41]:show[0x02] Profiles::ProfileSectionsController#show +profile_sections[0x41]:update[0x06] Profiles::ProfileSectionsController#update +queries[0x42]:fetch_text[0x38] Searches::QueriesController#fetch_text +queries[0x42]:fetch_xml[0x39] Searches::QueriesController#fetch_xml +read_marks[0x43]:create[0x04] Messages::ReadMarksController#create +read_marks[0x43]:delete[0x07] Messages::ReadMarksController#destroy +read_marks[0x43]:mark[0x51] Messages::ReadMarksController#mark +received_blocks[0x44]:delete[0x07] Users::ReceivedBlocksController#destroy +received_blocks[0x44]:edit[0x05] Users::ReceivedBlocksController#edit +received_blocks[0x44]:show[0x02] Users::ReceivedBlocksController#show +redactions[0x45]:create[0x04] Api::OldElements::RedactionsController#create +redactions[0x45]:create[0x04] RedactionsController#create +redactions[0x45]:delete[0x07] Api::OldElements::RedactionsController#destroy +redactions[0x45]:delete[0x07] RedactionsController#destroy +redactions[0x45]:edit[0x05] RedactionsController#edit +redactions[0x45]:list[0x01] RedactionsController#index +redactions[0x45]:lookup_old_element[0x4B] Api::OldNodes::RedactionsController#lookup_old_element +redactions[0x45]:lookup_old_element[0x4B] Api::OldRelations::RedactionsController#lookup_old_element +redactions[0x45]:lookup_old_element[0x4B] Api::OldWays::RedactionsController#lookup_old_element +redactions[0x45]:lookup_redaction[0x4D] RedactionsController#lookup_redaction +redactions[0x45]:new_form[0x03] RedactionsController#new +redactions[0x45]:show[0x02] RedactionsController#show +redactions[0x45]:update[0x06] RedactionsController#update +relation_members[0x46]:show[0x02] RelationMembersController#show +relations[0x47]:create[0x04] Api::RelationsController#create +relations[0x47]:delete[0x07] Api::RelationsController#destroy +relations[0x47]:list[0x01] Api::Nodes::RelationsController#index +relations[0x47]:list[0x01] Api::Relations::RelationsController#index +relations[0x47]:list[0x01] Api::RelationsController#index +relations[0x47]:list[0x01] Api::Ways::RelationsController#index +relations[0x47]:show[0x02] Api::RelationsController#show +relations[0x47]:show[0x02] RelationsController#show +relations[0x47]:update[0x06] Api::RelationsController#update +replies[0x48]:new_form[0x03] Messages::RepliesController#new +reporters[0x49]:list[0x01] Issues::ReportersController#index +reports[0x4A]:create[0x04] ReportsController#create +reports[0x4A]:create_new_report_params[0x2C] ReportsController#create_new_report_params +reports[0x4A]:default_assigned_role[0x2F] ReportsController#default_assigned_role +reports[0x4A]:issue_params[0x47] ReportsController#issue_params +reports[0x4A]:new_form[0x03] ReportsController#new +reports[0x4A]:report_params[0x66] ReportsController#report_params +reports[0x4A]:required_new_report_params_present?[0x6E] ReportsController#required_new_report_params_present? +searches[0x4B]:dms_regexp[0x33] SearchesController#dms_regexp +searches[0x4B]:normalize_params[0x54] SearchesController#normalize_params +searches[0x4B]:show[0x02] SearchesController#show +searches[0x4B]:to_decdeg[0x7F] SearchesController#to_decdeg +sessions[0x4C]:create[0x04] SessionsController#create +sessions[0x4C]:delete[0x07] SessionsController#destroy +sessions[0x4C]:new_form[0x03] SessionsController#new +sessions[0x4C]:password_authentication[0x5B] SessionsController#password_authentication +share_panes[0x4D]:show[0x02] SharePanesController#show site[0x4E]:about[0x08] SiteController#about site[0x4E]:communities[0x20] SiteController#communities site[0x4E]:copyright[0x2B] SiteController#copyright @@ -281,80 +281,80 @@ site[0x4E]:preview[0x5F] SiteController#preview site[0x4E]:redirect_browse_params[0x62] SiteController#redirect_browse_params site[0x4E]:redirect_map_params[0x63] SiteController#redirect_map_params site[0x4E]:welcome[0x8A] SiteController#welcome -statuse[0x4F]:lookup_user_by_name[0x4F] Users::StatusesController#lookup_user_by_name -statuse[0x4F]:update[0x06] Users::StatusesController#update -term[0x50]:show[0x02] Accounts::TermsController#show -term[0x50]:update[0x06] Accounts::TermsController#update -trace[0x51]:create[0x04] Api::TracesController#create -trace[0x51]:create[0x04] TracesController#create -trace[0x51]:default_visibility[0x30] TracesController#default_visibility -trace[0x51]:delete[0x07] Api::TracesController#destroy -trace[0x51]:delete[0x07] TracesController#destroy -trace[0x51]:do_create[0x34] Api::TracesController#do_create -trace[0x51]:do_create[0x34] TracesController#do_create -trace[0x51]:edit[0x05] TracesController#edit -trace[0x51]:list[0x01] Api::Users::TracesController#index -trace[0x51]:list[0x01] TracesController#index -trace[0x51]:mine[0x53] TracesController#mine -trace[0x51]:new_form[0x03] TracesController#new -trace[0x51]:offline_error[0x58] Api::TracesController#offline_error -trace[0x51]:offline_redirect[0x59] TracesController#offline_redirect -trace[0x51]:offline_warning[0x5A] TracesController#offline_warning -trace[0x51]:show[0x02] Api::TracesController#show -trace[0x51]:show[0x02] TracesController#show -trace[0x51]:trace_params[0x80] TracesController#trace_params -trace[0x51]:update[0x06] Api::TracesController#update -trace[0x51]:update[0x06] TracesController#update -tracepoint[0x52]:list[0x01] Api::TracepointsController#index -upload[0x53]:create[0x04] Api::Changesets::UploadsController#create -user[0x54]:auth_failure[0x0E] UsersController#auth_failure -user[0x54]:auth_success[0x0F] UsersController#auth_success -user[0x54]:check_signup_allowed?[0x1A] UsersController#check_signup_allowed? -user[0x54]:create[0x04] UsersController#create -user[0x54]:details[0x32] Api::UsersController#details -user[0x54]:go_public[0x3C] UsersController#go_public -user[0x54]:list[0x01] Api::UsersController#index -user[0x54]:new_form[0x03] UsersController#new -user[0x54]:save_new_user[0x73] UsersController#save_new_user -user[0x54]:show[0x02] Api::UsersController#show -user[0x54]:show[0x02] UsersController#show -user[0x54]:user_params[0x87] UsersController#user_params -user[0x54]:valid_turnstile_response?[0x88] UsersController#valid_turnstile_response? -user[0x54]:welcome_options[0x8B] UsersController#welcome_options -user_block[0x55]:create[0x04] Api::UserBlocksController#create -user_block[0x55]:create[0x04] UserBlocksController#create -user_block[0x55]:edit[0x05] UserBlocksController#edit -user_block[0x55]:list[0x01] UserBlocksController#index -user_block[0x55]:lookup_user_block[0x4E] UserBlocksController#lookup_user_block -user_block[0x55]:new_form[0x03] UserBlocksController#new -user_block[0x55]:require_valid_params[0x6C] UserBlocksController#require_valid_params -user_block[0x55]:show[0x02] Api::UserBlocksController#show -user_block[0x55]:show[0x02] UserBlocksController#show -user_block[0x55]:update[0x06] UserBlocksController#update -user_mute[0x56]:create[0x04] UserMutesController#create -user_mute[0x56]:delete[0x07] UserMutesController#destroy -user_mute[0x56]:list[0x01] UserMutesController#index -user_preference[0x57]:delete[0x07] Api::UserPreferencesController#destroy -user_preference[0x57]:list[0x01] Api::UserPreferencesController#index -user_preference[0x57]:show[0x02] Api::UserPreferencesController#show -user_preference[0x57]:update[0x06] Api::UserPreferencesController#update -user_preference[0x57]:update_all[0x83] Api::UserPreferencesController#update_all -user_role[0x58]:create[0x04] UserRolesController#create -user_role[0x58]:delete[0x07] UserRolesController#destroy -user_role[0x58]:in_role[0x43] UserRolesController#in_role -user_role[0x58]:not_in_role[0x56] UserRolesController#not_in_role -user_role[0x58]:require_valid_role[0x6D] UserRolesController#require_valid_role -version[0x59]:show[0x02] Api::VersionsController#show -visibilitie[0x5A]:create[0x04] Api::ChangesetComments::VisibilitiesController#create -visibilitie[0x5A]:delete[0x07] Api::ChangesetComments::VisibilitiesController#destroy -way[0x5B]:create[0x04] Api::WaysController#create -way[0x5B]:delete[0x07] Api::WaysController#destroy -way[0x5B]:list[0x01] Api::Nodes::WaysController#index -way[0x5B]:list[0x01] Api::WaysController#index -way[0x5B]:show[0x02] Api::WaysController#show -way[0x5B]:show[0x02] WaysController#show -way[0x5B]:update[0x06] Api::WaysController#update -webgl_error_pane[0x5C]:show[0x02] WebglErrorPanesController#show +statuses[0x4F]:lookup_user_by_name[0x4F] Users::StatusesController#lookup_user_by_name +statuses[0x4F]:update[0x06] Users::StatusesController#update +terms[0x50]:show[0x02] Accounts::TermsController#show +terms[0x50]:update[0x06] Accounts::TermsController#update +tracepoints[0x51]:list[0x01] Api::TracepointsController#index +traces[0x52]:create[0x04] Api::TracesController#create +traces[0x52]:create[0x04] TracesController#create +traces[0x52]:default_visibility[0x30] TracesController#default_visibility +traces[0x52]:delete[0x07] Api::TracesController#destroy +traces[0x52]:delete[0x07] TracesController#destroy +traces[0x52]:do_create[0x34] Api::TracesController#do_create +traces[0x52]:do_create[0x34] TracesController#do_create +traces[0x52]:edit[0x05] TracesController#edit +traces[0x52]:list[0x01] Api::Users::TracesController#index +traces[0x52]:list[0x01] TracesController#index +traces[0x52]:mine[0x53] TracesController#mine +traces[0x52]:new_form[0x03] TracesController#new +traces[0x52]:offline_error[0x58] Api::TracesController#offline_error +traces[0x52]:offline_redirect[0x59] TracesController#offline_redirect +traces[0x52]:offline_warning[0x5A] TracesController#offline_warning +traces[0x52]:show[0x02] Api::TracesController#show +traces[0x52]:show[0x02] TracesController#show +traces[0x52]:trace_params[0x80] TracesController#trace_params +traces[0x52]:update[0x06] Api::TracesController#update +traces[0x52]:update[0x06] TracesController#update +uploads[0x53]:create[0x04] Api::Changesets::UploadsController#create +user_blocks[0x54]:create[0x04] Api::UserBlocksController#create +user_blocks[0x54]:create[0x04] UserBlocksController#create +user_blocks[0x54]:edit[0x05] UserBlocksController#edit +user_blocks[0x54]:list[0x01] UserBlocksController#index +user_blocks[0x54]:lookup_user_block[0x4E] UserBlocksController#lookup_user_block +user_blocks[0x54]:new_form[0x03] UserBlocksController#new +user_blocks[0x54]:require_valid_params[0x6C] UserBlocksController#require_valid_params +user_blocks[0x54]:show[0x02] Api::UserBlocksController#show +user_blocks[0x54]:show[0x02] UserBlocksController#show +user_blocks[0x54]:update[0x06] UserBlocksController#update +user_mutes[0x55]:create[0x04] UserMutesController#create +user_mutes[0x55]:delete[0x07] UserMutesController#destroy +user_mutes[0x55]:list[0x01] UserMutesController#index +user_preferences[0x56]:delete[0x07] Api::UserPreferencesController#destroy +user_preferences[0x56]:list[0x01] Api::UserPreferencesController#index +user_preferences[0x56]:show[0x02] Api::UserPreferencesController#show +user_preferences[0x56]:update[0x06] Api::UserPreferencesController#update +user_preferences[0x56]:update_all[0x83] Api::UserPreferencesController#update_all +user_roles[0x57]:create[0x04] UserRolesController#create +user_roles[0x57]:delete[0x07] UserRolesController#destroy +user_roles[0x57]:in_role[0x43] UserRolesController#in_role +user_roles[0x57]:not_in_role[0x56] UserRolesController#not_in_role +user_roles[0x57]:require_valid_role[0x6D] UserRolesController#require_valid_role +users[0x58]:auth_failure[0x0E] UsersController#auth_failure +users[0x58]:auth_success[0x0F] UsersController#auth_success +users[0x58]:check_signup_allowed?[0x1A] UsersController#check_signup_allowed? +users[0x58]:create[0x04] UsersController#create +users[0x58]:details[0x32] Api::UsersController#details +users[0x58]:go_public[0x3C] UsersController#go_public +users[0x58]:list[0x01] Api::UsersController#index +users[0x58]:new_form[0x03] UsersController#new +users[0x58]:save_new_user[0x73] UsersController#save_new_user +users[0x58]:show[0x02] Api::UsersController#show +users[0x58]:show[0x02] UsersController#show +users[0x58]:user_params[0x87] UsersController#user_params +users[0x58]:valid_turnstile_response?[0x88] UsersController#valid_turnstile_response? +users[0x58]:welcome_options[0x8B] UsersController#welcome_options +versions[0x59]:show[0x02] Api::VersionsController#show +visibilities[0x5A]:create[0x04] Api::ChangesetComments::VisibilitiesController#create +visibilities[0x5A]:delete[0x07] Api::ChangesetComments::VisibilitiesController#destroy +ways[0x5B]:create[0x04] Api::WaysController#create +ways[0x5B]:delete[0x07] Api::WaysController#destroy +ways[0x5B]:list[0x01] Api::Nodes::WaysController#index +ways[0x5B]:list[0x01] Api::WaysController#index +ways[0x5B]:show[0x02] Api::WaysController#show +ways[0x5B]:show[0x02] WaysController#show +ways[0x5B]:update[0x06] Api::WaysController#update +webgl_error_panes[0x5C]:show[0x02] WebglErrorPanesController#show # is_a axis (140 archetypes): list=0x01 show=0x02 new_form=0x03 create=0x04 edit=0x05 update=0x06 delete=0x07 about=0x08 add_comment=0x09 api_call_handle_error=0x0A api_call_timeout=0x0B api_status=0x0C application_params=0x0D auth_failure=0x0E auth_success=0x0F author_info=0x10 authorize=0x11 authorize_web=0x12 bad_request=0x13 bbox_condition=0x14 check_api_readable=0x15 check_api_writable=0x16 check_database_readable=0x17 check_database_writable=0x18 check_rate_limit=0x19 check_signup_allowed?=0x1A close=0x1B close_body=0x1C closed_condition=0x1D comment=0x1E comment_params=0x1F communities=0x20 conditions_bbox=0x21 conditions_closed=0x22 conditions_ids=0x23 conditions_nonempty=0x24 conditions_open=0x25 conditions_time=0x26 conditions_user=0x27 confirm=0x28 confirm_email=0x29 confirm_resend=0x2A copyright=0x2B create_new_report_params=0x2C current_ability=0x2D database_status=0x2E default_assigned_role=0x2F default_visibility=0x30 deny_access=0x31 details=0x32 dms_regexp=0x33 do_create=0x34 entry_params=0x35 export=0x36 feed=0x37 fetch_text=0x38 fetch_xml=0x39 find_issue=0x3A forbidden=0x3B go_public=0x3C gpx_status=0x3D gravatar_status_message=0x3E help=0x3F hide=0x40 id=0x41 ignore=0x42 in_role=0x43 internal_server_error=0x44 invalid_parameter=0x45 issue_comment_params=0x46 issue_params=0x47 load_nodes=0x48 load_relations=0x49 load_ways=0x4A lookup_old_element=0x4B lookup_old_element_versions=0x4C lookup_redaction=0x4D lookup_user_block=0x4E lookup_user_by_name=0x4F map_layout=0x50 mark=0x51 message_params=0x52 mine=0x53 normalize_params=0x54 not_found=0x55 not_in_role=0x56 offline=0x57 offline_error=0x58 offline_redirect=0x59 offline_warning=0x5A password_authentication=0x5B permalink=0x5C preferred_editor=0x5D preferred_languages=0x5E preview=0x5F rate_limit_exceeded?=0x60 reassign_issue=0x61 redirect_browse_params=0x62 redirect_map_params=0x63 reopen=0x64 report_error=0x65 report_params=0x66 require_cookies=0x67 require_moderator_for_unredacted_history=0x68 require_oauth=0x69 require_public_data=0x6A require_user=0x6B require_valid_params=0x6C require_valid_role=0x6D required_new_report_params_present?=0x6E resolve=0x6F respond_to_timeout=0x70 rss=0x71 safe_referer=0x72 save_new_user=0x73 scope_enabled?=0x74 search=0x75 set_application=0x76 set_locale=0x77 set_map_location=0x78 set_request_formats=0x79 setup_user_auth=0x7A show_messages=0x7B show_redactions?=0x7C site_layout=0x7D subscribe=0x7E to_decdeg=0x7F trace_params=0x80 unhide=0x81 unsubscribe=0x82 update_all=0x83 update_preferences=0x84 update_profile=0x85 update_totp=0x86 user_params=0x87 valid_turnstile_response?=0x88 web_timeout=0x89 welcome=0x8A welcome_options=0x8B wrap_lon=0x8C -# part_of axis (92 containers): account=0x01 active_list=0x02 advanced_preference=0x03 api=0x04 application=0x05 basic_preference=0x06 capabilitie=0x07 changeset=0x08 changeset_comment=0x09 changeset_subscription=0x0A close=0x0B companie=0x0C confirmation=0x0D dashboard=0x0E data=0x0F deletion=0x10 description=0x11 diary_comment=0x12 diary_entrie=0x13 direction=0x14 download=0x15 error=0x16 export=0x17 feature_querie=0x18 feed=0x19 follow=0x1A heatmap=0x1B home=0x1C icon=0x1D image=0x1E inboxe=0x1F issue=0x20 issue_comment=0x21 issued_block=0x22 languages_pane=0x23 latlon_querie=0x24 layers_pane=0x25 legend_pane=0x26 link=0x27 list=0x28 location=0x29 mailboxe=0x2A map=0x2B message=0x2C mute=0x2D muted_inboxe=0x2E node=0x2F nominatim_querie=0x30 nominatim_reverse_querie=0x31 note=0x32 note_subscription=0x33 notification_preference=0x34 oauth2_application=0x35 old_element=0x36 old_node=0x37 old_relation=0x38 old_relation_member=0x39 old_way=0x3A outboxe=0x3B password=0x3C pd_declaration=0x3D permission=0x3E picture=0x3F preference=0x40 profile_section=0x41 querie=0x42 read_mark=0x43 received_block=0x44 redaction=0x45 relation=0x46 relation_member=0x47 replie=0x48 report=0x49 reporter=0x4A searche=0x4B session=0x4C share_pane=0x4D site=0x4E statuse=0x4F term=0x50 trace=0x51 tracepoint=0x52 upload=0x53 user=0x54 user_block=0x55 user_mute=0x56 user_preference=0x57 user_role=0x58 version=0x59 visibilitie=0x5A way=0x5B webgl_error_pane=0x5C +# part_of axis (92 containers): accounts=0x01 active_lists=0x02 advanced_preferences=0x03 api=0x04 application=0x05 basic_preferences=0x06 capabilities=0x07 changeset_comments=0x08 changeset_subscriptions=0x09 changesets=0x0A closes=0x0B companies=0x0C confirmations=0x0D dashboards=0x0E data=0x0F deletions=0x10 descriptions=0x11 diary_comments=0x12 diary_entries=0x13 directions=0x14 downloads=0x15 errors=0x16 export=0x17 feature_queries=0x18 feeds=0x19 follows=0x1A heatmaps=0x1B homes=0x1C icons=0x1D images=0x1E inboxes=0x1F issue_comments=0x20 issued_blocks=0x21 issues=0x22 languages_panes=0x23 latlon_queries=0x24 layers_panes=0x25 legend_panes=0x26 links=0x27 lists=0x28 locations=0x29 mailboxes=0x2A maps=0x2B messages=0x2C muted_inboxes=0x2D mutes=0x2E nodes=0x2F nominatim_queries=0x30 nominatim_reverse_queries=0x31 note_subscriptions=0x32 notes=0x33 notification_preferences=0x34 oauth2_applications=0x35 old_elements=0x36 old_nodes=0x37 old_relation_members=0x38 old_relations=0x39 old_ways=0x3A outboxes=0x3B passwords=0x3C pd_declarations=0x3D permissions=0x3E pictures=0x3F preferences=0x40 profile_sections=0x41 queries=0x42 read_marks=0x43 received_blocks=0x44 redactions=0x45 relation_members=0x46 relations=0x47 replies=0x48 reporters=0x49 reports=0x4A searches=0x4B sessions=0x4C share_panes=0x4D site=0x4E statuses=0x4F terms=0x50 tracepoints=0x51 traces=0x52 uploads=0x53 user_blocks=0x54 user_mutes=0x55 user_preferences=0x56 user_roles=0x57 users=0x58 versions=0x59 visibilities=0x5A ways=0x5B webgl_error_panes=0x5C diff --git a/crates/ogar-from-rails/examples/harvest_osm.rs b/crates/ogar-from-rails/examples/harvest_osm.rs index a2a26ae..b4b1449 100644 --- a/crates/ogar-from-rails/examples/harvest_osm.rs +++ b/crates/ogar-from-rails/examples/harvest_osm.rs @@ -31,7 +31,10 @@ fn main() { } // --ir: full structured IR (relational graph), stable text form. - println!("# OSM Rails → OGAR IR (namespace=osm) — {} classes", classes.len()); + println!( + "# OSM Rails → OGAR IR (namespace=osm) — {} classes", + classes.len() + ); for c in &classes { println!("\n## {}", c.name); if let Some(p) = &c.parent { diff --git a/crates/ogar-from-rails/src/lib.rs b/crates/ogar-from-rails/src/lib.rs index a555874..b932521 100644 --- a/crates/ogar-from-rails/src/lib.rs +++ b/crates/ogar-from-rails/src/lib.rs @@ -109,8 +109,8 @@ pub fn extract_app(source_tree: &Path) -> Vec { /// Harvest the **DO-arm**: walk `/app/controllers`, lift each /// controller's public actions to `ActionDef`s via [`ogar_from_ruff::lift_actions`], -/// keyed by the resource model name the controller acts on -/// (`Api::NodesController` → `Node`). Controllers that don't map to a resource +/// keyed by the controller's own (namespace-stripped) name +/// (`Api::NodesController` → `Nodes`). Controllers that don't map to a resource /// (dashboards, errors, sessions, …) are dropped. /// /// This is the MVC other half — OGAR is *Open Graph of Active Record*, and @@ -151,16 +151,18 @@ pub fn extract_actions(source_tree: &Path, curator: &str) -> Vec<(String, Vec Option { let base = controller.rsplit("::").next()?; let stem = base.strip_suffix("Controller")?; if stem.is_empty() { return None; } - Some(stem.strip_suffix('s').unwrap_or(stem).to_string()) + Some(stem.to_string()) } // ── The action rail: (part_of : is_a) — the V3 castable action shape ── @@ -169,7 +171,7 @@ fn controller_to_model(controller: &str) -> Option { // cannot cast between them or compose them. The V3 rail addresses an action as // a `(part_of : is_a)` pair — the SAME `u8:u8` HHTL tile shape as the GUID // tiers — so you CAST by fixing one axis and walking the other: -// fix is_a=show, walk part_of → `node:show`, `way:show`, `overview:show` +// fix is_a=show, walk part_of → `nodes:show`, `ways:show`, `changesets:show` // fix part_of=map, walk is_a → `map:render`, `map:show`, `map:export` // `part_of` is the controller container (INCLUDING view controllers like // `map` / `overview` that have no resource model); `is_a` is the action @@ -177,8 +179,9 @@ fn controller_to_model(controller: &str) -> Option { /// Canonical archetypes for the `is_a` axis — CRUD first (stable low ids), /// then any custom verb (`render`, `export`, `download`, …) as its own. -const CRUD_ARCHETYPES: &[&str] = - &["list", "show", "new_form", "create", "edit", "update", "delete"]; +const CRUD_ARCHETYPES: &[&str] = &[ + "list", "show", "new_form", "create", "edit", "update", "delete", +]; /// The `is_a` archetype for a Rails action verb (`index → list`, /// `destroy → delete`; `new → new_form` so it never collides with the struct's @@ -193,20 +196,20 @@ fn is_a_archetype(verb: &str) -> String { .to_string() } -/// The `part_of` container for a controller (`Api::NodesController` → `node`, -/// `MapController` → `map`). Strips namespace + `Controller`, snake+singular. -/// Unlike [`controller_to_model`] this keeps view containers (`map`, -/// `overview`) that have no resource model. +/// The `part_of` container for a controller — the controller's own name, +/// snake-cased **verbatim** (`Api::NodesController` → `nodes`, `MapController` +/// → `map`, `SearchesController` → `searches`). No singularisation, no invented +/// namespace: the module mirrors the source controller 1:1 and is reversible. +/// Keeps view containers (`map`, `overview`) that have no resource model. fn container_of(controller: &str) -> Option { let base = controller.rsplit("::").next()?; let stem = base.strip_suffix("Controller")?; if stem.is_empty() { return None; } - let singular = stem.strip_suffix('s').unwrap_or(stem); let mut out = String::new(); let mut prev_ln = false; - for c in singular.chars() { + for c in stem.chars() { if c.is_ascii_uppercase() && prev_ln { out.push('_'); } @@ -218,7 +221,10 @@ fn container_of(controller: &str) -> Option { /// Assign u8 ids: `canonical` names first (from `0x01`, in given order), then /// the remaining distinct names in sorted order. -fn codebook(names: &std::collections::BTreeSet, canonical: &[&str]) -> BTreeMap { +fn codebook( + names: &std::collections::BTreeSet, + canonical: &[&str], +) -> BTreeMap { let mut map = BTreeMap::new(); let mut next: u8 = 1; for c in canonical { @@ -294,6 +300,32 @@ mod tests { use super::*; use std::path::PathBuf; + /// The container is the controller's own name, snake-cased verbatim — no + /// singularisation (English plurals aren't invertible by heuristic; the + /// semantics live in the classid, not a prettified string). + #[test] + fn container_of_mirrors_the_controller_verbatim() { + assert_eq!( + container_of("Api::NodesController").as_deref(), + Some("nodes") + ); + assert_eq!( + container_of("SearchesController").as_deref(), + Some("searches") + ); + assert_eq!( + container_of("Api::CapabilitiesController").as_deref(), + Some("capabilities") + ); + assert_eq!(container_of("MapController").as_deref(), Some("map")); + assert_eq!( + container_of("ChangesetCommentsController").as_deref(), + Some("changeset_comments") + ); + // not a controller → None + assert_eq!(container_of("ApplicationRecord"), None); + } + /// Empty / nonexistent source tree → empty Vec, never panics. The /// `ruff_ruby_spo` contract is "no app/models → empty graph"; this /// test pins that our lift preserves the no-panic behaviour. @@ -374,7 +406,10 @@ mod tests { let openproject = extract_with(&op_path, "openproject"); let issue = redmine.iter().find(|c| c.name == "Issue").unwrap(); - let wp = openproject.iter().find(|c| c.name == "WorkPackage").unwrap(); + let wp = openproject + .iter() + .find(|c| c.name == "WorkPackage") + .unwrap(); // Distinct curators ... assert_eq!(issue.source_curator.as_deref(), Some("redmine")); @@ -512,7 +547,10 @@ mod tests { // detected deterministically from class names alone. This is the // load-bearing convergence assertion — it holds *regardless* of // per-curator surface-extraction depth. - assert_eq!(issue.canonical_concept.as_deref(), Some("project_work_item")); + assert_eq!( + issue.canonical_concept.as_deref(), + Some("project_work_item") + ); assert_eq!( work_package.canonical_concept.as_deref(), Some("project_work_item"), @@ -645,8 +683,15 @@ mod tests { // The full canonical surface: every role on // [`ogar_vocab::project_work_item`]. let expected: std::collections::HashSet<&'static str> = [ - "project", "status", "type", "priority", "author", "assignee", - "journals", "relations", "time_entries", + "project", + "status", + "type", + "priority", + "author", + "assignee", + "journals", + "relations", + "time_entries", ] .into_iter() .collect(); @@ -725,7 +770,9 @@ mod tests { // producer does not yet decode either, so the v1 surface stays // at 3 roles. A follow-up mixin-decode adds it. let expected: std::collections::HashSet<&'static str> = - ["work_items", "time_entries", "members"].into_iter().collect(); + ["work_items", "time_entries", "members"] + .into_iter() + .collect(); assert_eq!( r_roles, expected, "Redmine Project must cover the canonical 3-role surface", @@ -780,7 +827,10 @@ mod tests { // All four classes — Redmine User + Principal, OP User + Principal // — share the canonical concept and the binary codebook id. let expected_id = ogar_vocab::canonical_concept_id("project_actor"); - assert!(expected_id.is_some(), "project_actor must be in the codebook"); + assert!( + expected_id.is_some(), + "project_actor must be in the codebook" + ); for (curator, classes) in [("Redmine", &redmine), ("OpenProject", &openproject)] { for class_name in ["User", "Principal"] { @@ -943,16 +993,24 @@ mod tests { assert!(rel_id.is_some() && cs_id.is_some() && w_id.is_some()); for (curator, classes, table) in [ - ("Redmine", &redmine, &[ - ("IssueRelation", "project_relation", rel_id), - ("Changeset", "project_changeset", cs_id), - ("Watcher", "project_watcher", w_id), - ][..]), - ("OpenProject", &openproject, &[ - ("Relation", "project_relation", rel_id), - ("Changeset", "project_changeset", cs_id), - ("Watcher", "project_watcher", w_id), - ][..]), + ( + "Redmine", + &redmine, + &[ + ("IssueRelation", "project_relation", rel_id), + ("Changeset", "project_changeset", cs_id), + ("Watcher", "project_watcher", w_id), + ][..], + ), + ( + "OpenProject", + &openproject, + &[ + ("Relation", "project_relation", rel_id), + ("Changeset", "project_changeset", cs_id), + ("Watcher", "project_watcher", w_id), + ][..], + ), ] { for (class_name, concept, expected_id) in table { let c = classes @@ -1134,7 +1192,11 @@ mod tests { .iter() .find(|c| c.name == class_name) .unwrap_or_else(|| panic!("{curator} ships a {class_name} model")); - assert_eq!(c.canonical_concept.as_deref(), Some(concept), "{curator} {class_name}"); + assert_eq!( + c.canonical_concept.as_deref(), + Some(concept), + "{curator} {class_name}" + ); assert_eq!(c.source_domain.as_deref(), Some("project")); assert_eq!(c.canonical_id(), ogar_vocab::canonical_concept_id(concept)); } diff --git a/crates/ogar-render-askama/examples/render_osm.rs b/crates/ogar-render-askama/examples/render_osm.rs index 2fd8390..a6314bb 100644 --- a/crates/ogar-render-askama/examples/render_osm.rs +++ b/crates/ogar-render-askama/examples/render_osm.rs @@ -247,15 +247,17 @@ fn main() { ); } - // ── DO-arm module tree: osm::::(input) → generated/actions.rs. - // part_of = container module, is_a = action fn — standalone free functions, - // never methods on the data struct. e.g. `osm::map::render(input)`. ── - // The (part_of : is_a) tile is the CANONICAL rail address, so multiple - // source controllers that map to the same tile (e.g. `Api::NodesController#show` - // and `NodesController#show` → `node:show`) are ONE castable action by design - // — the api-vs-web surface is the classid's custom-low half, not a new tile. - // Accumulate ALL sources per tile so provenance is never dropped from the docs - // (Bugbot/codex #152 review: the earlier `or_insert` silently lost the 2nd+). + // ── DO arm: a faithful `controllers` module tree → generated/controllers.rs. + // Each module MIRRORS a source controller 1:1 by its own (snake, verbatim, + // NOT singularised) name — `NodesController → nodes`, `MapController → map`. + // Functions are the `is_a` actions; standalone, never methods on the record. + // osm-domain re-exports (`pub use controllers::*`) for the ergonomic surface, + // so `osm_domain::controllers::nodes::show` and re-exported `nodes::show` + // both resolve. The (part_of : is_a) tile stays the CANONICAL rail address, + // so multiple source controllers on the same tile (`Api::NodesController#show` + // + `NodesController#show` → `nodes:show`) are ONE castable action by design — + // the api-vs-web surface is the classid custom-low half, not a new tile. All + // sources are cited so provenance is never lost (Bugbot/codex #152). let mut tree: std::collections::BTreeMap< String, std::collections::BTreeMap>, @@ -268,9 +270,11 @@ fn main() { .push((r.controller.clone(), r.action.clone())); } let mut acts = String::from( - "//! @generated DO-arm — OSM controller actions as `osm::::(input)`.\n\ - //! part_of = container module, is_a = action fn (standalone, not methods on the\n\ - //! data struct, per OGAR's ActionDef rule). Call: `osm::map::render(Input::default())`.\n\n\ + "//! @generated DO arm — a faithful `controllers` mirror. Each module is a\n\ + //! source controller by its own verbatim (snake) name; each fn is an `is_a`\n\ + //! action (standalone, not methods on the record). osm-domain re-exports this\n\ + //! module (`pub use controllers::*`), so `controllers::nodes::show(input)` and\n\ + //! the re-exported `nodes::show(input)` both resolve. No singularisation.\n\n\ #![allow(clippy::all, dead_code, unused_variables)]\n\n\ /// DO-arm action input — the Rails `params` / request. Typed-field harvest is a\n\ /// follow-up (ruff `Function` carries reads/writes, not param types yet).\n\ @@ -313,11 +317,11 @@ fn main() { } acts.push_str("}\n\n"); } - fs::write(out.join("actions.rs"), acts).unwrap(); + fs::write(out.join("controllers.rs"), acts).unwrap(); println!( - "rendered {} data structs (THINK) + DO arm osm:::: = {fn_count} fns \ - across {} containers [{} part_of x {} is_a rail, {} tiles]; {edges} SPO edges -> {}", + "rendered {} data structs (THINK) + DO arm controllers:::: = {fn_count} fns \ + across {} controllers [{} part_of x {} is_a rail, {} tiles]; {edges} SPO edges -> {}", classes.len(), tree.len(), parts.len(), From 1f62666cfbe78478958c0c1322c398c5f1a83c50 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 4 Jul 2026 23:22:17 +0000 Subject: [PATCH 2/2] =?UTF-8?q?ogar-render-askama:=20render=5Fpython=20?= =?UTF-8?q?=E2=80=94=20Python=20import-shape=20emit=20PoC=20(SDK=20+=20pac?= =?UTF-8?q?kage)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Python counterpart of render_osm: same ruff → OGAR substrate, a language-pluggable emit back-end. Proves the pull-back side of the transpiler is not Rust-specific — OSM (and odoo) come out of the one substrate in Python import shape, just like Rust. Emits under python/: - osm/models.py — one @dataclass per THINK class; associations → typed id fields; each grounded model has CLASS_ID. - osm/controllers/.py — the DO arm as a FAITHFUL mirror of app/controllers/, one module per source controller by its verbatim (snake) name — `osm.controllers.nodes.show(inp)`, standalone, not methods. No singularisation (mirrors the Rust `controllers` module). - osm/__init__.py — re-exports each controller at the package root (`osm.nodes` ≡ `osm.controllers.nodes`) + CLASS_IDS. - ogar_sdk.py — the substrate-pull SDK (Python mirror of Rust lance_graph_contract::ogar_codebook): CODEBOOK + class_id(concept) + render_classid(concept, prefix) (canon-high). Ships OSM (0x0F) AND odoo/commerce (0x02) — the pull is domain-agnostic. Verified: example builds clean; py_compile green on package + SDK; functional smoke — osm.controllers.nodes.show + re-exported osm.nodes.show both callable, class_id('osm_node')=0xf01, render_classid('account_move',0x0002)=0x2020002, osm.nodes.show({}) raises NotImplementedError('port Api::NodesController#show'). Stacks on #153 (the faithful-controllers / no-singulariser change) so the container module names are verbatim (nodes/searches/capabilities, not searche/capabilitie). Typed params (dict Input → typed) remain the ruff brick. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01EYvNjD8M8LMNYbRy3gq2FP --- .../harvest/osm-website-rs/python/.gitignore | 2 + .../harvest/osm-website-rs/python/ogar_sdk.py | 41 +++ .../osm-website-rs/python/osm/__init__.py | 122 +++++++ .../python/osm/controllers/__init__.py | 95 +++++ .../python/osm/controllers/accounts.py | 22 ++ .../python/osm/controllers/active_lists.py | 14 + .../osm/controllers/advanced_preferences.py | 14 + .../python/osm/controllers/api.py | 50 +++ .../python/osm/controllers/application.py | 110 ++++++ .../osm/controllers/basic_preferences.py | 14 + .../python/osm/controllers/capabilities.py | 14 + .../osm/controllers/changeset_comments.py | 22 ++ .../controllers/changeset_subscriptions.py | 22 ++ .../python/osm/controllers/changesets.py | 74 ++++ .../python/osm/controllers/closes.py | 14 + .../python/osm/controllers/companies.py | 14 + .../python/osm/controllers/confirmations.py | 26 ++ .../python/osm/controllers/dashboards.py | 14 + .../python/osm/controllers/data.py | 22 ++ .../python/osm/controllers/deletions.py | 14 + .../python/osm/controllers/descriptions.py | 14 + .../python/osm/controllers/diary_comments.py | 30 ++ .../python/osm/controllers/diary_entries.py | 62 ++++ .../python/osm/controllers/directions.py | 14 + .../python/osm/controllers/downloads.py | 18 + .../python/osm/controllers/errors.py | 26 ++ .../python/osm/controllers/export.py | 18 + .../python/osm/controllers/feature_queries.py | 14 + .../python/osm/controllers/feeds.py | 14 + .../python/osm/controllers/follows.py | 22 ++ .../python/osm/controllers/heatmaps.py | 18 + .../python/osm/controllers/homes.py | 14 + .../python/osm/controllers/icons.py | 14 + .../python/osm/controllers/images.py | 14 + .../python/osm/controllers/inboxes.py | 14 + .../python/osm/controllers/issue_comments.py | 22 ++ .../python/osm/controllers/issued_blocks.py | 14 + .../python/osm/controllers/issues.py | 34 ++ .../python/osm/controllers/languages_panes.py | 14 + .../python/osm/controllers/latlon_queries.py | 14 + .../python/osm/controllers/layers_panes.py | 14 + .../python/osm/controllers/legend_panes.py | 14 + .../python/osm/controllers/links.py | 14 + .../python/osm/controllers/lists.py | 18 + .../python/osm/controllers/locations.py | 18 + .../python/osm/controllers/mailboxes.py | 14 + .../python/osm/controllers/maps.py | 14 + .../python/osm/controllers/messages.py | 34 ++ .../python/osm/controllers/muted_inboxes.py | 14 + .../python/osm/controllers/mutes.py | 14 + .../python/osm/controllers/nodes.py | 30 ++ .../osm/controllers/nominatim_queries.py | 14 + .../controllers/nominatim_reverse_queries.py | 14 + .../osm/controllers/note_subscriptions.py | 18 + .../python/osm/controllers/notes.py | 66 ++++ .../controllers/notification_preferences.py | 14 + .../osm/controllers/oauth2_applications.py | 22 ++ .../python/osm/controllers/old_elements.py | 26 ++ .../python/osm/controllers/old_nodes.py | 26 ++ .../osm/controllers/old_relation_members.py | 14 + .../python/osm/controllers/old_relations.py | 26 ++ .../python/osm/controllers/old_ways.py | 26 ++ .../python/osm/controllers/outboxes.py | 14 + .../python/osm/controllers/passwords.py | 26 ++ .../python/osm/controllers/pd_declarations.py | 18 + .../python/osm/controllers/permissions.py | 14 + .../python/osm/controllers/pictures.py | 14 + .../python/osm/controllers/preferences.py | 18 + .../osm/controllers/profile_sections.py | 18 + .../python/osm/controllers/queries.py | 18 + .../python/osm/controllers/read_marks.py | 22 ++ .../python/osm/controllers/received_blocks.py | 22 ++ .../python/osm/controllers/redactions.py | 46 +++ .../osm/controllers/relation_members.py | 14 + .../python/osm/controllers/relations.py | 30 ++ .../python/osm/controllers/replies.py | 14 + .../python/osm/controllers/reporters.py | 14 + .../python/osm/controllers/reports.py | 38 ++ .../python/osm/controllers/searches.py | 26 ++ .../python/osm/controllers/sessions.py | 26 ++ .../python/osm/controllers/share_panes.py | 14 + .../python/osm/controllers/site.py | 66 ++++ .../python/osm/controllers/statuses.py | 18 + .../python/osm/controllers/terms.py | 18 + .../python/osm/controllers/tracepoints.py | 14 + .../python/osm/controllers/traces.py | 66 ++++ .../python/osm/controllers/uploads.py | 14 + .../python/osm/controllers/user_blocks.py | 42 +++ .../python/osm/controllers/user_mutes.py | 22 ++ .../osm/controllers/user_preferences.py | 30 ++ .../python/osm/controllers/user_roles.py | 30 ++ .../python/osm/controllers/users.py | 62 ++++ .../python/osm/controllers/versions.py | 14 + .../python/osm/controllers/visibilities.py | 18 + .../python/osm/controllers/ways.py | 30 ++ .../osm/controllers/webgl_error_panes.py | 14 + .../osm-website-rs/python/osm/models.py | 337 ++++++++++++++++++ .../examples/render_python.rs | 325 +++++++++++++++++ 98 files changed, 3114 insertions(+) create mode 100644 .claude/harvest/osm-website-rs/python/.gitignore create mode 100644 .claude/harvest/osm-website-rs/python/ogar_sdk.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/__init__.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/__init__.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/accounts.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/active_lists.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/advanced_preferences.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/api.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/application.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/basic_preferences.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/capabilities.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/changeset_comments.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/changeset_subscriptions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/changesets.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/closes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/companies.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/confirmations.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/dashboards.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/data.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/deletions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/descriptions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/diary_comments.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/diary_entries.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/directions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/downloads.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/errors.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/export.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/feature_queries.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/feeds.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/follows.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/heatmaps.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/homes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/icons.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/images.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/inboxes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/issue_comments.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/issued_blocks.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/issues.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/languages_panes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/latlon_queries.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/layers_panes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/legend_panes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/links.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/lists.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/locations.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/mailboxes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/maps.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/messages.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/muted_inboxes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/mutes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/nodes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/nominatim_queries.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/nominatim_reverse_queries.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/note_subscriptions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/notes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/notification_preferences.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/oauth2_applications.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/old_elements.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/old_nodes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/old_relation_members.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/old_relations.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/old_ways.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/outboxes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/passwords.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/pd_declarations.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/permissions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/pictures.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/preferences.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/profile_sections.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/queries.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/read_marks.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/received_blocks.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/redactions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/relation_members.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/relations.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/replies.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/reporters.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/reports.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/searches.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/sessions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/share_panes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/site.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/statuses.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/terms.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/tracepoints.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/traces.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/uploads.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/user_blocks.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/user_mutes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/user_preferences.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/user_roles.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/users.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/versions.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/visibilities.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/ways.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/controllers/webgl_error_panes.py create mode 100644 .claude/harvest/osm-website-rs/python/osm/models.py create mode 100644 crates/ogar-render-askama/examples/render_python.rs diff --git a/.claude/harvest/osm-website-rs/python/.gitignore b/.claude/harvest/osm-website-rs/python/.gitignore new file mode 100644 index 0000000..7a60b85 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +*.pyc diff --git a/.claude/harvest/osm-website-rs/python/ogar_sdk.py b/.claude/harvest/osm-website-rs/python/ogar_sdk.py new file mode 100644 index 0000000..dbefda8 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/ogar_sdk.py @@ -0,0 +1,41 @@ +"""ogar_sdk — thin Python client over the OGAR codebook substrate. + +The Python mirror of Rust `lance_graph_contract::ogar_codebook`: pull a concept's +stable classid, or compose a render-classid with an app prefix. Domain-agnostic — +OSM (0x0F) and odoo/commerce (0x02) pull identically. + + >>> from ogar_sdk import class_id, render_classid + >>> class_id("osm_node") + 3841 + >>> hex(render_classid("account_move", 0x0002)) # odoo, canon-high + '0x2020002' +""" +from typing import Optional + +# The pulled substrate — a subset of ogar-vocab's CODEBOOK (concept -> u16 id). +CODEBOOK = { + # 0x0F — Geo (OpenStreetMap) + "osm_node": 0x0F01, "osm_way": 0x0F02, "osm_relation": 0x0F03, + "osm_changeset": 0x0F04, "osm_element_tag": 0x0F05, "osm_relation_member": 0x0F06, + "osm_way_node": 0x0F07, "osm_note": 0x0F08, "osm_gpx_trace": 0x0F09, "osm_user": 0x0F0A, + # 0x02 — Commerce (odoo / ERP) — same pull, different domain + "commercial_document": 0x0202, "product": 0x0207, "accounting_account": 0x0208, +} +# Convenience alias used in the odoo docstring example. +CODEBOOK["account_move"] = CODEBOOK["commercial_document"] + + +def class_id(concept: str) -> Optional[int]: + """Resolve a canonical-concept string to its stable u16 codebook id.""" + return CODEBOOK.get(concept) + + +def render_classid(concept: str, app_prefix: int) -> Optional[int]: + """Compose a 32-bit render classid: canon (concept) HIGH, custom (prefix) LOW. + + Mirrors the post-2026-07-02 canon-high flip: `(concept << 16) | prefix`. + """ + cid = class_id(concept) + if cid is None: + return None + return (cid << 16) | (app_prefix & 0xFFFF) diff --git a/.claude/harvest/osm-website-rs/python/osm/__init__.py b/.claude/harvest/osm-website-rs/python/osm/__init__.py new file mode 100644 index 0000000..6df2ed0 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/__init__.py @@ -0,0 +1,122 @@ +"""@generated OSM package (ruff → OGAR, Python import shape). +Models: `from osm.models import Node`. +DO arm (faithful): `osm.controllers.nodes.show(inp)`. +DO arm (re-exported): `osm.nodes.show(inp)`. +""" +from . import models as models +from . import controllers as controllers +from .controllers import accounts as accounts +from .controllers import active_lists as active_lists +from .controllers import advanced_preferences as advanced_preferences +from .controllers import api as api +from .controllers import application as application +from .controllers import basic_preferences as basic_preferences +from .controllers import capabilities as capabilities +from .controllers import changeset_comments as changeset_comments +from .controllers import changeset_subscriptions as changeset_subscriptions +from .controllers import changesets as changesets +from .controllers import closes as closes +from .controllers import companies as companies +from .controllers import confirmations as confirmations +from .controllers import dashboards as dashboards +from .controllers import data as data +from .controllers import deletions as deletions +from .controllers import descriptions as descriptions +from .controllers import diary_comments as diary_comments +from .controllers import diary_entries as diary_entries +from .controllers import directions as directions +from .controllers import downloads as downloads +from .controllers import errors as errors +from .controllers import export as export +from .controllers import feature_queries as feature_queries +from .controllers import feeds as feeds +from .controllers import follows as follows +from .controllers import heatmaps as heatmaps +from .controllers import homes as homes +from .controllers import icons as icons +from .controllers import images as images +from .controllers import inboxes as inboxes +from .controllers import issue_comments as issue_comments +from .controllers import issued_blocks as issued_blocks +from .controllers import issues as issues +from .controllers import languages_panes as languages_panes +from .controllers import latlon_queries as latlon_queries +from .controllers import layers_panes as layers_panes +from .controllers import legend_panes as legend_panes +from .controllers import links as links +from .controllers import lists as lists +from .controllers import locations as locations +from .controllers import mailboxes as mailboxes +from .controllers import maps as maps +from .controllers import messages as messages +from .controllers import muted_inboxes as muted_inboxes +from .controllers import mutes as mutes +from .controllers import nodes as nodes +from .controllers import nominatim_queries as nominatim_queries +from .controllers import nominatim_reverse_queries as nominatim_reverse_queries +from .controllers import note_subscriptions as note_subscriptions +from .controllers import notes as notes +from .controllers import notification_preferences as notification_preferences +from .controllers import oauth2_applications as oauth2_applications +from .controllers import old_elements as old_elements +from .controllers import old_nodes as old_nodes +from .controllers import old_relation_members as old_relation_members +from .controllers import old_relations as old_relations +from .controllers import old_ways as old_ways +from .controllers import outboxes as outboxes +from .controllers import passwords as passwords +from .controllers import pd_declarations as pd_declarations +from .controllers import permissions as permissions +from .controllers import pictures as pictures +from .controllers import preferences as preferences +from .controllers import profile_sections as profile_sections +from .controllers import queries as queries +from .controllers import read_marks as read_marks +from .controllers import received_blocks as received_blocks +from .controllers import redactions as redactions +from .controllers import relation_members as relation_members +from .controllers import relations as relations +from .controllers import replies as replies +from .controllers import reporters as reporters +from .controllers import reports as reports +from .controllers import searches as searches +from .controllers import sessions as sessions +from .controllers import share_panes as share_panes +from .controllers import site as site +from .controllers import statuses as statuses +from .controllers import terms as terms +from .controllers import tracepoints as tracepoints +from .controllers import traces as traces +from .controllers import uploads as uploads +from .controllers import user_blocks as user_blocks +from .controllers import user_mutes as user_mutes +from .controllers import user_preferences as user_preferences +from .controllers import user_roles as user_roles +from .controllers import users as users +from .controllers import versions as versions +from .controllers import visibilities as visibilities +from .controllers import ways as ways +from .controllers import webgl_error_panes as webgl_error_panes + +CLASS_IDS = { + "Changeset": 0x0F04, + "Node": 0x0F01, + "NodeTag": 0x0F05, + "Note": 0x0F08, + "OldNode": 0x0F01, + "OldNodeTag": 0x0F05, + "OldRelation": 0x0F03, + "OldRelationMember": 0x0F06, + "OldRelationTag": 0x0F05, + "OldWay": 0x0F02, + "OldWayNode": 0x0F07, + "OldWayTag": 0x0F05, + "Relation": 0x0F03, + "RelationMember": 0x0F06, + "RelationTag": 0x0F05, + "Trace": 0x0F09, + "User": 0x0F0A, + "Way": 0x0F02, + "WayNode": 0x0F07, + "WayTag": 0x0F05, +} diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/__init__.py b/.claude/harvest/osm-website-rs/python/osm/controllers/__init__.py new file mode 100644 index 0000000..b704cea --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/__init__.py @@ -0,0 +1,95 @@ +"""@generated `controllers` subpackage — faithful 1:1 mirror of +`app/controllers/`, each module named by its controller (verbatim). +""" +from . import accounts as accounts +from . import active_lists as active_lists +from . import advanced_preferences as advanced_preferences +from . import api as api +from . import application as application +from . import basic_preferences as basic_preferences +from . import capabilities as capabilities +from . import changeset_comments as changeset_comments +from . import changeset_subscriptions as changeset_subscriptions +from . import changesets as changesets +from . import closes as closes +from . import companies as companies +from . import confirmations as confirmations +from . import dashboards as dashboards +from . import data as data +from . import deletions as deletions +from . import descriptions as descriptions +from . import diary_comments as diary_comments +from . import diary_entries as diary_entries +from . import directions as directions +from . import downloads as downloads +from . import errors as errors +from . import export as export +from . import feature_queries as feature_queries +from . import feeds as feeds +from . import follows as follows +from . import heatmaps as heatmaps +from . import homes as homes +from . import icons as icons +from . import images as images +from . import inboxes as inboxes +from . import issue_comments as issue_comments +from . import issued_blocks as issued_blocks +from . import issues as issues +from . import languages_panes as languages_panes +from . import latlon_queries as latlon_queries +from . import layers_panes as layers_panes +from . import legend_panes as legend_panes +from . import links as links +from . import lists as lists +from . import locations as locations +from . import mailboxes as mailboxes +from . import maps as maps +from . import messages as messages +from . import muted_inboxes as muted_inboxes +from . import mutes as mutes +from . import nodes as nodes +from . import nominatim_queries as nominatim_queries +from . import nominatim_reverse_queries as nominatim_reverse_queries +from . import note_subscriptions as note_subscriptions +from . import notes as notes +from . import notification_preferences as notification_preferences +from . import oauth2_applications as oauth2_applications +from . import old_elements as old_elements +from . import old_nodes as old_nodes +from . import old_relation_members as old_relation_members +from . import old_relations as old_relations +from . import old_ways as old_ways +from . import outboxes as outboxes +from . import passwords as passwords +from . import pd_declarations as pd_declarations +from . import permissions as permissions +from . import pictures as pictures +from . import preferences as preferences +from . import profile_sections as profile_sections +from . import queries as queries +from . import read_marks as read_marks +from . import received_blocks as received_blocks +from . import redactions as redactions +from . import relation_members as relation_members +from . import relations as relations +from . import replies as replies +from . import reporters as reporters +from . import reports as reports +from . import searches as searches +from . import sessions as sessions +from . import share_panes as share_panes +from . import site as site +from . import statuses as statuses +from . import terms as terms +from . import tracepoints as tracepoints +from . import traces as traces +from . import uploads as uploads +from . import user_blocks as user_blocks +from . import user_mutes as user_mutes +from . import user_preferences as user_preferences +from . import user_roles as user_roles +from . import users as users +from . import versions as versions +from . import visibilities as visibilities +from . import ways as ways +from . import webgl_error_panes as webgl_error_panes diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/accounts.py b/.claude/harvest/osm-website-rs/python/osm/controllers/accounts.py new file mode 100644 index 0000000..78ad47d --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/accounts.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `accounts` controller. +`osm.controllers.accounts.(inp)` free functions (re-exported as +`osm.accounts`); standalone, not methods on the model. Call: +`osm.controllers.accounts.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def delete(inp: Input) -> Output: + """`accounts:delete` — DO arm. Source: AccountsController#destroy.""" + raise NotImplementedError("port AccountsController#destroy") + +def show(inp: Input) -> Output: + """`accounts:show` — DO arm. Source: AccountsController#show.""" + raise NotImplementedError("port AccountsController#show") + +def update(inp: Input) -> Output: + """`accounts:update` — DO arm. Source: AccountsController#update.""" + raise NotImplementedError("port AccountsController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/active_lists.py b/.claude/harvest/osm-website-rs/python/osm/controllers/active_lists.py new file mode 100644 index 0000000..57377ca --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/active_lists.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `active_lists` controller. +`osm.controllers.active_lists.(inp)` free functions (re-exported as +`osm.active_lists`); standalone, not methods on the model. Call: +`osm.controllers.active_lists.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`active_lists:show` — DO arm. Source: Api::UserBlocks::ActiveListsController#show.""" + raise NotImplementedError("port Api::UserBlocks::ActiveListsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/advanced_preferences.py b/.claude/harvest/osm-website-rs/python/osm/controllers/advanced_preferences.py new file mode 100644 index 0000000..496e590 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/advanced_preferences.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `advanced_preferences` controller. +`osm.controllers.advanced_preferences.(inp)` free functions (re-exported as +`osm.advanced_preferences`); standalone, not methods on the model. Call: +`osm.controllers.advanced_preferences.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def update_preferences(inp: Input) -> Output: + """`advanced_preferences:update_preferences` — DO arm. Source: Preferences::AdvancedPreferencesController#update_preferences.""" + raise NotImplementedError("port Preferences::AdvancedPreferencesController#update_preferences") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/api.py b/.claude/harvest/osm-website-rs/python/osm/controllers/api.py new file mode 100644 index 0000000..9c22fc1 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/api.py @@ -0,0 +1,50 @@ +"""@generated DO arm — faithful mirror of the `api` controller. +`osm.controllers.api.(inp)` free functions (re-exported as +`osm.api`); standalone, not methods on the model. Call: +`osm.controllers.api.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def api_call_handle_error(inp: Input) -> Output: + """`api:api_call_handle_error` — DO arm. Source: ApiController#api_call_handle_error.""" + raise NotImplementedError("port ApiController#api_call_handle_error") + +def api_call_timeout(inp: Input) -> Output: + """`api:api_call_timeout` — DO arm. Source: ApiController#api_call_timeout.""" + raise NotImplementedError("port ApiController#api_call_timeout") + +def authorize(inp: Input) -> Output: + """`api:authorize` — DO arm. Source: ApiController#authorize.""" + raise NotImplementedError("port ApiController#authorize") + +def check_rate_limit(inp: Input) -> Output: + """`api:check_rate_limit` — DO arm. Source: ApiController#check_rate_limit.""" + raise NotImplementedError("port ApiController#check_rate_limit") + +def current_ability(inp: Input) -> Output: + """`api:current_ability` — DO arm. Source: ApiController#current_ability.""" + raise NotImplementedError("port ApiController#current_ability") + +def deny_access(inp: Input) -> Output: + """`api:deny_access` — DO arm. Source: ApiController#deny_access.""" + raise NotImplementedError("port ApiController#deny_access") + +def gpx_status(inp: Input) -> Output: + """`api:gpx_status` — DO arm. Source: ApiController#gpx_status.""" + raise NotImplementedError("port ApiController#gpx_status") + +def scope_enabled(inp: Input) -> Output: + """`api:scope_enabled?` — DO arm. Source: ApiController#scope_enabled?.""" + raise NotImplementedError("port ApiController#scope_enabled?") + +def set_request_formats(inp: Input) -> Output: + """`api:set_request_formats` — DO arm. Source: ApiController#set_request_formats.""" + raise NotImplementedError("port ApiController#set_request_formats") + +def setup_user_auth(inp: Input) -> Output: + """`api:setup_user_auth` — DO arm. Source: ApiController#setup_user_auth.""" + raise NotImplementedError("port ApiController#setup_user_auth") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/application.py b/.claude/harvest/osm-website-rs/python/osm/controllers/application.py new file mode 100644 index 0000000..04887b4 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/application.py @@ -0,0 +1,110 @@ +"""@generated DO arm — faithful mirror of the `application` controller. +`osm.controllers.application.(inp)` free functions (re-exported as +`osm.application`); standalone, not methods on the model. Call: +`osm.controllers.application.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def api_status(inp: Input) -> Output: + """`application:api_status` — DO arm. Source: ApplicationController#api_status.""" + raise NotImplementedError("port ApplicationController#api_status") + +def authorize_web(inp: Input) -> Output: + """`application:authorize_web` — DO arm. Source: ApplicationController#authorize_web.""" + raise NotImplementedError("port ApplicationController#authorize_web") + +def check_api_readable(inp: Input) -> Output: + """`application:check_api_readable` — DO arm. Source: ApplicationController#check_api_readable.""" + raise NotImplementedError("port ApplicationController#check_api_readable") + +def check_api_writable(inp: Input) -> Output: + """`application:check_api_writable` — DO arm. Source: ApplicationController#check_api_writable.""" + raise NotImplementedError("port ApplicationController#check_api_writable") + +def check_database_readable(inp: Input) -> Output: + """`application:check_database_readable` — DO arm. Source: ApplicationController#check_database_readable.""" + raise NotImplementedError("port ApplicationController#check_database_readable") + +def check_database_writable(inp: Input) -> Output: + """`application:check_database_writable` — DO arm. Source: ApplicationController#check_database_writable.""" + raise NotImplementedError("port ApplicationController#check_database_writable") + +def close_body(inp: Input) -> Output: + """`application:close_body` — DO arm. Source: ApplicationController#close_body.""" + raise NotImplementedError("port ApplicationController#close_body") + +def current_ability(inp: Input) -> Output: + """`application:current_ability` — DO arm. Source: ApplicationController#current_ability.""" + raise NotImplementedError("port ApplicationController#current_ability") + +def database_status(inp: Input) -> Output: + """`application:database_status` — DO arm. Source: ApplicationController#database_status.""" + raise NotImplementedError("port ApplicationController#database_status") + +def deny_access(inp: Input) -> Output: + """`application:deny_access` — DO arm. Source: ApplicationController#deny_access.""" + raise NotImplementedError("port ApplicationController#deny_access") + +def invalid_parameter(inp: Input) -> Output: + """`application:invalid_parameter` — DO arm. Source: ApplicationController#invalid_parameter.""" + raise NotImplementedError("port ApplicationController#invalid_parameter") + +def map_layout(inp: Input) -> Output: + """`application:map_layout` — DO arm. Source: ApplicationController#map_layout.""" + raise NotImplementedError("port ApplicationController#map_layout") + +def preferred_editor(inp: Input) -> Output: + """`application:preferred_editor` — DO arm. Source: ApplicationController#preferred_editor.""" + raise NotImplementedError("port ApplicationController#preferred_editor") + +def preferred_languages(inp: Input) -> Output: + """`application:preferred_languages` — DO arm. Source: ApplicationController#preferred_languages.""" + raise NotImplementedError("port ApplicationController#preferred_languages") + +def report_error(inp: Input) -> Output: + """`application:report_error` — DO arm. Source: ApplicationController#report_error.""" + raise NotImplementedError("port ApplicationController#report_error") + +def require_cookies(inp: Input) -> Output: + """`application:require_cookies` — DO arm. Source: ApplicationController#require_cookies.""" + raise NotImplementedError("port ApplicationController#require_cookies") + +def require_oauth(inp: Input) -> Output: + """`application:require_oauth` — DO arm. Source: ApplicationController#require_oauth.""" + raise NotImplementedError("port ApplicationController#require_oauth") + +def require_public_data(inp: Input) -> Output: + """`application:require_public_data` — DO arm. Source: ApplicationController#require_public_data.""" + raise NotImplementedError("port ApplicationController#require_public_data") + +def require_user(inp: Input) -> Output: + """`application:require_user` — DO arm. Source: ApplicationController#require_user.""" + raise NotImplementedError("port ApplicationController#require_user") + +def respond_to_timeout(inp: Input) -> Output: + """`application:respond_to_timeout` — DO arm. Source: ApplicationController#respond_to_timeout.""" + raise NotImplementedError("port ApplicationController#respond_to_timeout") + +def safe_referer(inp: Input) -> Output: + """`application:safe_referer` — DO arm. Source: ApplicationController#safe_referer.""" + raise NotImplementedError("port ApplicationController#safe_referer") + +def set_locale(inp: Input) -> Output: + """`application:set_locale` — DO arm. Source: ApplicationController#set_locale.""" + raise NotImplementedError("port ApplicationController#set_locale") + +def site_layout(inp: Input) -> Output: + """`application:site_layout` — DO arm. Source: ApplicationController#site_layout.""" + raise NotImplementedError("port ApplicationController#site_layout") + +def update_totp(inp: Input) -> Output: + """`application:update_totp` — DO arm. Source: ApplicationController#update_totp.""" + raise NotImplementedError("port ApplicationController#update_totp") + +def web_timeout(inp: Input) -> Output: + """`application:web_timeout` — DO arm. Source: ApplicationController#web_timeout.""" + raise NotImplementedError("port ApplicationController#web_timeout") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/basic_preferences.py b/.claude/harvest/osm-website-rs/python/osm/controllers/basic_preferences.py new file mode 100644 index 0000000..6663a68 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/basic_preferences.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `basic_preferences` controller. +`osm.controllers.basic_preferences.(inp)` free functions (re-exported as +`osm.basic_preferences`); standalone, not methods on the model. Call: +`osm.controllers.basic_preferences.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def update_preferences(inp: Input) -> Output: + """`basic_preferences:update_preferences` — DO arm. Source: Preferences::BasicPreferencesController#update_preferences.""" + raise NotImplementedError("port Preferences::BasicPreferencesController#update_preferences") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/capabilities.py b/.claude/harvest/osm-website-rs/python/osm/controllers/capabilities.py new file mode 100644 index 0000000..2475a31 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/capabilities.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `capabilities` controller. +`osm.controllers.capabilities.(inp)` free functions (re-exported as +`osm.capabilities`); standalone, not methods on the model. Call: +`osm.controllers.capabilities.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`capabilities:show` — DO arm. Source: Api::CapabilitiesController#show.""" + raise NotImplementedError("port Api::CapabilitiesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/changeset_comments.py b/.claude/harvest/osm-website-rs/python/osm/controllers/changeset_comments.py new file mode 100644 index 0000000..76e7ff9 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/changeset_comments.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `changeset_comments` controller. +`osm.controllers.changeset_comments.(inp)` free functions (re-exported as +`osm.changeset_comments`); standalone, not methods on the model. Call: +`osm.controllers.changeset_comments.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`changeset_comments:create` — DO arm. Source: Api::ChangesetCommentsController#create.""" + raise NotImplementedError("port Api::ChangesetCommentsController#create") + +def list(inp: Input) -> Output: + """`changeset_comments:list` — DO arm. Sources (canonical tile): Api::ChangesetCommentsController#index, Users::ChangesetCommentsController#index.""" + raise NotImplementedError("port Api::ChangesetCommentsController#index") + +def rate_limit_exceeded(inp: Input) -> Output: + """`changeset_comments:rate_limit_exceeded?` — DO arm. Source: Api::ChangesetCommentsController#rate_limit_exceeded?.""" + raise NotImplementedError("port Api::ChangesetCommentsController#rate_limit_exceeded?") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/changeset_subscriptions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/changeset_subscriptions.py new file mode 100644 index 0000000..aa98f99 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/changeset_subscriptions.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `changeset_subscriptions` controller. +`osm.controllers.changeset_subscriptions.(inp)` free functions (re-exported as +`osm.changeset_subscriptions`); standalone, not methods on the model. Call: +`osm.controllers.changeset_subscriptions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`changeset_subscriptions:create` — DO arm. Sources (canonical tile): Api::ChangesetSubscriptionsController#create, ChangesetSubscriptionsController#create.""" + raise NotImplementedError("port Api::ChangesetSubscriptionsController#create") + +def delete(inp: Input) -> Output: + """`changeset_subscriptions:delete` — DO arm. Sources (canonical tile): Api::ChangesetSubscriptionsController#destroy, ChangesetSubscriptionsController#destroy.""" + raise NotImplementedError("port Api::ChangesetSubscriptionsController#destroy") + +def show(inp: Input) -> Output: + """`changeset_subscriptions:show` — DO arm. Source: ChangesetSubscriptionsController#show.""" + raise NotImplementedError("port ChangesetSubscriptionsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/changesets.py b/.claude/harvest/osm-website-rs/python/osm/controllers/changesets.py new file mode 100644 index 0000000..a8dbd49 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/changesets.py @@ -0,0 +1,74 @@ +"""@generated DO arm — faithful mirror of the `changesets` controller. +`osm.controllers.changesets.(inp)` free functions (re-exported as +`osm.changesets`); standalone, not methods on the model. Call: +`osm.controllers.changesets.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def conditions_bbox(inp: Input) -> Output: + """`changesets:conditions_bbox` — DO arm. Sources (canonical tile): Api::ChangesetsController#conditions_bbox, ChangesetsController#conditions_bbox.""" + raise NotImplementedError("port Api::ChangesetsController#conditions_bbox") + +def conditions_closed(inp: Input) -> Output: + """`changesets:conditions_closed` — DO arm. Source: Api::ChangesetsController#conditions_closed.""" + raise NotImplementedError("port Api::ChangesetsController#conditions_closed") + +def conditions_ids(inp: Input) -> Output: + """`changesets:conditions_ids` — DO arm. Source: Api::ChangesetsController#conditions_ids.""" + raise NotImplementedError("port Api::ChangesetsController#conditions_ids") + +def conditions_nonempty(inp: Input) -> Output: + """`changesets:conditions_nonempty` — DO arm. Source: ChangesetsController#conditions_nonempty.""" + raise NotImplementedError("port ChangesetsController#conditions_nonempty") + +def conditions_open(inp: Input) -> Output: + """`changesets:conditions_open` — DO arm. Source: Api::ChangesetsController#conditions_open.""" + raise NotImplementedError("port Api::ChangesetsController#conditions_open") + +def conditions_time(inp: Input) -> Output: + """`changesets:conditions_time` — DO arm. Source: Api::ChangesetsController#conditions_time.""" + raise NotImplementedError("port Api::ChangesetsController#conditions_time") + +def conditions_user(inp: Input) -> Output: + """`changesets:conditions_user` — DO arm. Source: Api::ChangesetsController#conditions_user.""" + raise NotImplementedError("port Api::ChangesetsController#conditions_user") + +def create(inp: Input) -> Output: + """`changesets:create` — DO arm. Source: Api::ChangesetsController#create.""" + raise NotImplementedError("port Api::ChangesetsController#create") + +def feed(inp: Input) -> Output: + """`changesets:feed` — DO arm. Source: ChangesetsController#feed.""" + raise NotImplementedError("port ChangesetsController#feed") + +def list(inp: Input) -> Output: + """`changesets:list` — DO arm. Sources (canonical tile): Api::ChangesetsController#index, ChangesetsController#index.""" + raise NotImplementedError("port Api::ChangesetsController#index") + +def load_nodes(inp: Input) -> Output: + """`changesets:load_nodes` — DO arm. Source: ChangesetsController#load_nodes.""" + raise NotImplementedError("port ChangesetsController#load_nodes") + +def load_relations(inp: Input) -> Output: + """`changesets:load_relations` — DO arm. Source: ChangesetsController#load_relations.""" + raise NotImplementedError("port ChangesetsController#load_relations") + +def load_ways(inp: Input) -> Output: + """`changesets:load_ways` — DO arm. Source: ChangesetsController#load_ways.""" + raise NotImplementedError("port ChangesetsController#load_ways") + +def show(inp: Input) -> Output: + """`changesets:show` — DO arm. Sources (canonical tile): Api::ChangesetsController#show, ChangesetsController#show.""" + raise NotImplementedError("port Api::ChangesetsController#show") + +def update(inp: Input) -> Output: + """`changesets:update` — DO arm. Source: Api::ChangesetsController#update.""" + raise NotImplementedError("port Api::ChangesetsController#update") + +def wrap_lon(inp: Input) -> Output: + """`changesets:wrap_lon` — DO arm. Source: ChangesetsController#wrap_lon.""" + raise NotImplementedError("port ChangesetsController#wrap_lon") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/closes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/closes.py new file mode 100644 index 0000000..4aad56d --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/closes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `closes` controller. +`osm.controllers.closes.(inp)` free functions (re-exported as +`osm.closes`); standalone, not methods on the model. Call: +`osm.controllers.closes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def update(inp: Input) -> Output: + """`closes:update` — DO arm. Source: Api::Changesets::ClosesController#update.""" + raise NotImplementedError("port Api::Changesets::ClosesController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/companies.py b/.claude/harvest/osm-website-rs/python/osm/controllers/companies.py new file mode 100644 index 0000000..6b45f97 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/companies.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `companies` controller. +`osm.controllers.companies.(inp)` free functions (re-exported as +`osm.companies`); standalone, not methods on the model. Call: +`osm.controllers.companies.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def update_profile(inp: Input) -> Output: + """`companies:update_profile` — DO arm. Source: Profiles::CompaniesController#update_profile.""" + raise NotImplementedError("port Profiles::CompaniesController#update_profile") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/confirmations.py b/.claude/harvest/osm-website-rs/python/osm/controllers/confirmations.py new file mode 100644 index 0000000..6b2bec8 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/confirmations.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `confirmations` controller. +`osm.controllers.confirmations.(inp)` free functions (re-exported as +`osm.confirmations`); standalone, not methods on the model. Call: +`osm.controllers.confirmations.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def confirm(inp: Input) -> Output: + """`confirmations:confirm` — DO arm. Source: ConfirmationsController#confirm.""" + raise NotImplementedError("port ConfirmationsController#confirm") + +def confirm_email(inp: Input) -> Output: + """`confirmations:confirm_email` — DO arm. Source: ConfirmationsController#confirm_email.""" + raise NotImplementedError("port ConfirmationsController#confirm_email") + +def confirm_resend(inp: Input) -> Output: + """`confirmations:confirm_resend` — DO arm. Source: ConfirmationsController#confirm_resend.""" + raise NotImplementedError("port ConfirmationsController#confirm_resend") + +def gravatar_status_message(inp: Input) -> Output: + """`confirmations:gravatar_status_message` — DO arm. Source: ConfirmationsController#gravatar_status_message.""" + raise NotImplementedError("port ConfirmationsController#gravatar_status_message") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/dashboards.py b/.claude/harvest/osm-website-rs/python/osm/controllers/dashboards.py new file mode 100644 index 0000000..5fc9279 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/dashboards.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `dashboards` controller. +`osm.controllers.dashboards.(inp)` free functions (re-exported as +`osm.dashboards`); standalone, not methods on the model. Call: +`osm.controllers.dashboards.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`dashboards:show` — DO arm. Source: DashboardsController#show.""" + raise NotImplementedError("port DashboardsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/data.py b/.claude/harvest/osm-website-rs/python/osm/controllers/data.py new file mode 100644 index 0000000..1f5dd6a --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/data.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `data` controller. +`osm.controllers.data.(inp)` free functions (re-exported as +`osm.data`); standalone, not methods on the model. Call: +`osm.controllers.data.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def offline_error(inp: Input) -> Output: + """`data:offline_error` — DO arm. Source: Api::Traces::DataController#offline_error.""" + raise NotImplementedError("port Api::Traces::DataController#offline_error") + +def offline_redirect(inp: Input) -> Output: + """`data:offline_redirect` — DO arm. Source: Traces::DataController#offline_redirect.""" + raise NotImplementedError("port Traces::DataController#offline_redirect") + +def show(inp: Input) -> Output: + """`data:show` — DO arm. Sources (canonical tile): Api::Traces::DataController#show, Traces::DataController#show.""" + raise NotImplementedError("port Api::Traces::DataController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/deletions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/deletions.py new file mode 100644 index 0000000..75cf8bf --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/deletions.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `deletions` controller. +`osm.controllers.deletions.(inp)` free functions (re-exported as +`osm.deletions`); standalone, not methods on the model. Call: +`osm.controllers.deletions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`deletions:show` — DO arm. Source: Accounts::DeletionsController#show.""" + raise NotImplementedError("port Accounts::DeletionsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/descriptions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/descriptions.py new file mode 100644 index 0000000..d88597e --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/descriptions.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `descriptions` controller. +`osm.controllers.descriptions.(inp)` free functions (re-exported as +`osm.descriptions`); standalone, not methods on the model. Call: +`osm.controllers.descriptions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def update_profile(inp: Input) -> Output: + """`descriptions:update_profile` — DO arm. Source: Profiles::DescriptionsController#update_profile.""" + raise NotImplementedError("port Profiles::DescriptionsController#update_profile") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/diary_comments.py b/.claude/harvest/osm-website-rs/python/osm/controllers/diary_comments.py new file mode 100644 index 0000000..58f7ff2 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/diary_comments.py @@ -0,0 +1,30 @@ +"""@generated DO arm — faithful mirror of the `diary_comments` controller. +`osm.controllers.diary_comments.(inp)` free functions (re-exported as +`osm.diary_comments`); standalone, not methods on the model. Call: +`osm.controllers.diary_comments.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def comment_params(inp: Input) -> Output: + """`diary_comments:comment_params` — DO arm. Source: DiaryCommentsController#comment_params.""" + raise NotImplementedError("port DiaryCommentsController#comment_params") + +def create(inp: Input) -> Output: + """`diary_comments:create` — DO arm. Source: DiaryCommentsController#create.""" + raise NotImplementedError("port DiaryCommentsController#create") + +def hide(inp: Input) -> Output: + """`diary_comments:hide` — DO arm. Source: DiaryCommentsController#hide.""" + raise NotImplementedError("port DiaryCommentsController#hide") + +def list(inp: Input) -> Output: + """`diary_comments:list` — DO arm. Source: Users::DiaryCommentsController#index.""" + raise NotImplementedError("port Users::DiaryCommentsController#index") + +def unhide(inp: Input) -> Output: + """`diary_comments:unhide` — DO arm. Source: DiaryCommentsController#unhide.""" + raise NotImplementedError("port DiaryCommentsController#unhide") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/diary_entries.py b/.claude/harvest/osm-website-rs/python/osm/controllers/diary_entries.py new file mode 100644 index 0000000..e979b77 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/diary_entries.py @@ -0,0 +1,62 @@ +"""@generated DO arm — faithful mirror of the `diary_entries` controller. +`osm.controllers.diary_entries.(inp)` free functions (re-exported as +`osm.diary_entries`); standalone, not methods on the model. Call: +`osm.controllers.diary_entries.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`diary_entries:create` — DO arm. Source: DiaryEntriesController#create.""" + raise NotImplementedError("port DiaryEntriesController#create") + +def edit(inp: Input) -> Output: + """`diary_entries:edit` — DO arm. Source: DiaryEntriesController#edit.""" + raise NotImplementedError("port DiaryEntriesController#edit") + +def entry_params(inp: Input) -> Output: + """`diary_entries:entry_params` — DO arm. Source: DiaryEntriesController#entry_params.""" + raise NotImplementedError("port DiaryEntriesController#entry_params") + +def hide(inp: Input) -> Output: + """`diary_entries:hide` — DO arm. Source: DiaryEntriesController#hide.""" + raise NotImplementedError("port DiaryEntriesController#hide") + +def list(inp: Input) -> Output: + """`diary_entries:list` — DO arm. Source: DiaryEntriesController#index.""" + raise NotImplementedError("port DiaryEntriesController#index") + +def new_form(inp: Input) -> Output: + """`diary_entries:new_form` — DO arm. Source: DiaryEntriesController#new.""" + raise NotImplementedError("port DiaryEntriesController#new") + +def rss(inp: Input) -> Output: + """`diary_entries:rss` — DO arm. Source: DiaryEntriesController#rss.""" + raise NotImplementedError("port DiaryEntriesController#rss") + +def set_map_location(inp: Input) -> Output: + """`diary_entries:set_map_location` — DO arm. Source: DiaryEntriesController#set_map_location.""" + raise NotImplementedError("port DiaryEntriesController#set_map_location") + +def show(inp: Input) -> Output: + """`diary_entries:show` — DO arm. Source: DiaryEntriesController#show.""" + raise NotImplementedError("port DiaryEntriesController#show") + +def subscribe(inp: Input) -> Output: + """`diary_entries:subscribe` — DO arm. Source: DiaryEntriesController#subscribe.""" + raise NotImplementedError("port DiaryEntriesController#subscribe") + +def unhide(inp: Input) -> Output: + """`diary_entries:unhide` — DO arm. Source: DiaryEntriesController#unhide.""" + raise NotImplementedError("port DiaryEntriesController#unhide") + +def unsubscribe(inp: Input) -> Output: + """`diary_entries:unsubscribe` — DO arm. Source: DiaryEntriesController#unsubscribe.""" + raise NotImplementedError("port DiaryEntriesController#unsubscribe") + +def update(inp: Input) -> Output: + """`diary_entries:update` — DO arm. Source: DiaryEntriesController#update.""" + raise NotImplementedError("port DiaryEntriesController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/directions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/directions.py new file mode 100644 index 0000000..b984045 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/directions.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `directions` controller. +`osm.controllers.directions.(inp)` free functions (re-exported as +`osm.directions`); standalone, not methods on the model. Call: +`osm.controllers.directions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`directions:show` — DO arm. Source: DirectionsController#show.""" + raise NotImplementedError("port DirectionsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/downloads.py b/.claude/harvest/osm-website-rs/python/osm/controllers/downloads.py new file mode 100644 index 0000000..00f4541 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/downloads.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `downloads` controller. +`osm.controllers.downloads.(inp)` free functions (re-exported as +`osm.downloads`); standalone, not methods on the model. Call: +`osm.controllers.downloads.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`downloads:show` — DO arm. Source: Api::Changesets::DownloadsController#show.""" + raise NotImplementedError("port Api::Changesets::DownloadsController#show") + +def show_redactions(inp: Input) -> Output: + """`downloads:show_redactions?` — DO arm. Source: Api::Changesets::DownloadsController#show_redactions?.""" + raise NotImplementedError("port Api::Changesets::DownloadsController#show_redactions?") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/errors.py b/.claude/harvest/osm-website-rs/python/osm/controllers/errors.py new file mode 100644 index 0000000..b53e74a --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/errors.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `errors` controller. +`osm.controllers.errors.(inp)` free functions (re-exported as +`osm.errors`); standalone, not methods on the model. Call: +`osm.controllers.errors.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def bad_request(inp: Input) -> Output: + """`errors:bad_request` — DO arm. Source: ErrorsController#bad_request.""" + raise NotImplementedError("port ErrorsController#bad_request") + +def forbidden(inp: Input) -> Output: + """`errors:forbidden` — DO arm. Source: ErrorsController#forbidden.""" + raise NotImplementedError("port ErrorsController#forbidden") + +def internal_server_error(inp: Input) -> Output: + """`errors:internal_server_error` — DO arm. Source: ErrorsController#internal_server_error.""" + raise NotImplementedError("port ErrorsController#internal_server_error") + +def not_found(inp: Input) -> Output: + """`errors:not_found` — DO arm. Source: ErrorsController#not_found.""" + raise NotImplementedError("port ErrorsController#not_found") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/export.py b/.claude/harvest/osm-website-rs/python/osm/controllers/export.py new file mode 100644 index 0000000..3d9e68f --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/export.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `export` controller. +`osm.controllers.export.(inp)` free functions (re-exported as +`osm.export`); standalone, not methods on the model. Call: +`osm.controllers.export.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`export:create` — DO arm. Source: ExportController#create.""" + raise NotImplementedError("port ExportController#create") + +def show(inp: Input) -> Output: + """`export:show` — DO arm. Source: ExportController#show.""" + raise NotImplementedError("port ExportController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/feature_queries.py b/.claude/harvest/osm-website-rs/python/osm/controllers/feature_queries.py new file mode 100644 index 0000000..ddc3bef --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/feature_queries.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `feature_queries` controller. +`osm.controllers.feature_queries.(inp)` free functions (re-exported as +`osm.feature_queries`); standalone, not methods on the model. Call: +`osm.controllers.feature_queries.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`feature_queries:show` — DO arm. Source: FeatureQueriesController#show.""" + raise NotImplementedError("port FeatureQueriesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/feeds.py b/.claude/harvest/osm-website-rs/python/osm/controllers/feeds.py new file mode 100644 index 0000000..5fc9d69 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/feeds.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `feeds` controller. +`osm.controllers.feeds.(inp)` free functions (re-exported as +`osm.feeds`); standalone, not methods on the model. Call: +`osm.controllers.feeds.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`feeds:show` — DO arm. Sources (canonical tile): ChangesetComments::FeedsController#show, Traces::FeedsController#show.""" + raise NotImplementedError("port ChangesetComments::FeedsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/follows.py b/.claude/harvest/osm-website-rs/python/osm/controllers/follows.py new file mode 100644 index 0000000..ce07808 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/follows.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `follows` controller. +`osm.controllers.follows.(inp)` free functions (re-exported as +`osm.follows`); standalone, not methods on the model. Call: +`osm.controllers.follows.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`follows:create` — DO arm. Source: FollowsController#create.""" + raise NotImplementedError("port FollowsController#create") + +def delete(inp: Input) -> Output: + """`follows:delete` — DO arm. Source: FollowsController#destroy.""" + raise NotImplementedError("port FollowsController#destroy") + +def show(inp: Input) -> Output: + """`follows:show` — DO arm. Source: FollowsController#show.""" + raise NotImplementedError("port FollowsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/heatmaps.py b/.claude/harvest/osm-website-rs/python/osm/controllers/heatmaps.py new file mode 100644 index 0000000..ffbb3f7 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/heatmaps.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `heatmaps` controller. +`osm.controllers.heatmaps.(inp)` free functions (re-exported as +`osm.heatmaps`); standalone, not methods on the model. Call: +`osm.controllers.heatmaps.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`heatmaps:show` — DO arm. Source: Users::HeatmapsController#show.""" + raise NotImplementedError("port Users::HeatmapsController#show") + +def update_profile(inp: Input) -> Output: + """`heatmaps:update_profile` — DO arm. Source: Profiles::HeatmapsController#update_profile.""" + raise NotImplementedError("port Profiles::HeatmapsController#update_profile") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/homes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/homes.py new file mode 100644 index 0000000..e6dd3a0 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/homes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `homes` controller. +`osm.controllers.homes.(inp)` free functions (re-exported as +`osm.homes`); standalone, not methods on the model. Call: +`osm.controllers.homes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`homes:show` — DO arm. Source: Accounts::HomesController#show.""" + raise NotImplementedError("port Accounts::HomesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/icons.py b/.claude/harvest/osm-website-rs/python/osm/controllers/icons.py new file mode 100644 index 0000000..8ebff31 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/icons.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `icons` controller. +`osm.controllers.icons.(inp)` free functions (re-exported as +`osm.icons`); standalone, not methods on the model. Call: +`osm.controllers.icons.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`icons:show` — DO arm. Source: Traces::IconsController#show.""" + raise NotImplementedError("port Traces::IconsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/images.py b/.claude/harvest/osm-website-rs/python/osm/controllers/images.py new file mode 100644 index 0000000..972fe53 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/images.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `images` controller. +`osm.controllers.images.(inp)` free functions (re-exported as +`osm.images`); standalone, not methods on the model. Call: +`osm.controllers.images.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def update_profile(inp: Input) -> Output: + """`images:update_profile` — DO arm. Source: Profiles::ImagesController#update_profile.""" + raise NotImplementedError("port Profiles::ImagesController#update_profile") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/inboxes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/inboxes.py new file mode 100644 index 0000000..53571f8 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/inboxes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `inboxes` controller. +`osm.controllers.inboxes.(inp)` free functions (re-exported as +`osm.inboxes`); standalone, not methods on the model. Call: +`osm.controllers.inboxes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`inboxes:show` — DO arm. Sources (canonical tile): Api::Messages::InboxesController#show, Messages::InboxesController#show.""" + raise NotImplementedError("port Api::Messages::InboxesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/issue_comments.py b/.claude/harvest/osm-website-rs/python/osm/controllers/issue_comments.py new file mode 100644 index 0000000..9956418 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/issue_comments.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `issue_comments` controller. +`osm.controllers.issue_comments.(inp)` free functions (re-exported as +`osm.issue_comments`); standalone, not methods on the model. Call: +`osm.controllers.issue_comments.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`issue_comments:create` — DO arm. Source: IssueCommentsController#create.""" + raise NotImplementedError("port IssueCommentsController#create") + +def issue_comment_params(inp: Input) -> Output: + """`issue_comments:issue_comment_params` — DO arm. Source: IssueCommentsController#issue_comment_params.""" + raise NotImplementedError("port IssueCommentsController#issue_comment_params") + +def reassign_issue(inp: Input) -> Output: + """`issue_comments:reassign_issue` — DO arm. Source: IssueCommentsController#reassign_issue.""" + raise NotImplementedError("port IssueCommentsController#reassign_issue") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/issued_blocks.py b/.claude/harvest/osm-website-rs/python/osm/controllers/issued_blocks.py new file mode 100644 index 0000000..d1dfcea --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/issued_blocks.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `issued_blocks` controller. +`osm.controllers.issued_blocks.(inp)` free functions (re-exported as +`osm.issued_blocks`); standalone, not methods on the model. Call: +`osm.controllers.issued_blocks.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`issued_blocks:show` — DO arm. Source: Users::IssuedBlocksController#show.""" + raise NotImplementedError("port Users::IssuedBlocksController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/issues.py b/.claude/harvest/osm-website-rs/python/osm/controllers/issues.py new file mode 100644 index 0000000..3b0b7b3 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/issues.py @@ -0,0 +1,34 @@ +"""@generated DO arm — faithful mirror of the `issues` controller. +`osm.controllers.issues.(inp)` free functions (re-exported as +`osm.issues`); standalone, not methods on the model. Call: +`osm.controllers.issues.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def find_issue(inp: Input) -> Output: + """`issues:find_issue` — DO arm. Source: IssuesController#find_issue.""" + raise NotImplementedError("port IssuesController#find_issue") + +def ignore(inp: Input) -> Output: + """`issues:ignore` — DO arm. Source: IssuesController#ignore.""" + raise NotImplementedError("port IssuesController#ignore") + +def list(inp: Input) -> Output: + """`issues:list` — DO arm. Source: IssuesController#index.""" + raise NotImplementedError("port IssuesController#index") + +def reopen(inp: Input) -> Output: + """`issues:reopen` — DO arm. Source: IssuesController#reopen.""" + raise NotImplementedError("port IssuesController#reopen") + +def resolve(inp: Input) -> Output: + """`issues:resolve` — DO arm. Source: IssuesController#resolve.""" + raise NotImplementedError("port IssuesController#resolve") + +def show(inp: Input) -> Output: + """`issues:show` — DO arm. Source: IssuesController#show.""" + raise NotImplementedError("port IssuesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/languages_panes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/languages_panes.py new file mode 100644 index 0000000..3fecd1f --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/languages_panes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `languages_panes` controller. +`osm.controllers.languages_panes.(inp)` free functions (re-exported as +`osm.languages_panes`); standalone, not methods on the model. Call: +`osm.controllers.languages_panes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`languages_panes:show` — DO arm. Source: LanguagesPanesController#show.""" + raise NotImplementedError("port LanguagesPanesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/latlon_queries.py b/.claude/harvest/osm-website-rs/python/osm/controllers/latlon_queries.py new file mode 100644 index 0000000..cfaa308 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/latlon_queries.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `latlon_queries` controller. +`osm.controllers.latlon_queries.(inp)` free functions (re-exported as +`osm.latlon_queries`); standalone, not methods on the model. Call: +`osm.controllers.latlon_queries.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`latlon_queries:create` — DO arm. Source: Searches::LatlonQueriesController#create.""" + raise NotImplementedError("port Searches::LatlonQueriesController#create") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/layers_panes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/layers_panes.py new file mode 100644 index 0000000..4905cfc --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/layers_panes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `layers_panes` controller. +`osm.controllers.layers_panes.(inp)` free functions (re-exported as +`osm.layers_panes`); standalone, not methods on the model. Call: +`osm.controllers.layers_panes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`layers_panes:show` — DO arm. Source: LayersPanesController#show.""" + raise NotImplementedError("port LayersPanesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/legend_panes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/legend_panes.py new file mode 100644 index 0000000..7ee1b30 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/legend_panes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `legend_panes` controller. +`osm.controllers.legend_panes.(inp)` free functions (re-exported as +`osm.legend_panes`); standalone, not methods on the model. Call: +`osm.controllers.legend_panes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`legend_panes:show` — DO arm. Source: LegendPanesController#show.""" + raise NotImplementedError("port LegendPanesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/links.py b/.claude/harvest/osm-website-rs/python/osm/controllers/links.py new file mode 100644 index 0000000..7aba519 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/links.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `links` controller. +`osm.controllers.links.(inp)` free functions (re-exported as +`osm.links`); standalone, not methods on the model. Call: +`osm.controllers.links.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def update_profile(inp: Input) -> Output: + """`links:update_profile` — DO arm. Source: Profiles::LinksController#update_profile.""" + raise NotImplementedError("port Profiles::LinksController#update_profile") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/lists.py b/.claude/harvest/osm-website-rs/python/osm/controllers/lists.py new file mode 100644 index 0000000..e970ab0 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/lists.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `lists` controller. +`osm.controllers.lists.(inp)` free functions (re-exported as +`osm.lists`); standalone, not methods on the model. Call: +`osm.controllers.lists.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`lists:show` — DO arm. Source: Users::ListsController#show.""" + raise NotImplementedError("port Users::ListsController#show") + +def update(inp: Input) -> Output: + """`lists:update` — DO arm. Source: Users::ListsController#update.""" + raise NotImplementedError("port Users::ListsController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/locations.py b/.claude/harvest/osm-website-rs/python/osm/controllers/locations.py new file mode 100644 index 0000000..5763af4 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/locations.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `locations` controller. +`osm.controllers.locations.(inp)` free functions (re-exported as +`osm.locations`); standalone, not methods on the model. Call: +`osm.controllers.locations.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`locations:show` — DO arm. Source: Profiles::LocationsController#show.""" + raise NotImplementedError("port Profiles::LocationsController#show") + +def update_profile(inp: Input) -> Output: + """`locations:update_profile` — DO arm. Source: Profiles::LocationsController#update_profile.""" + raise NotImplementedError("port Profiles::LocationsController#update_profile") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/mailboxes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/mailboxes.py new file mode 100644 index 0000000..0785e43 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/mailboxes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `mailboxes` controller. +`osm.controllers.mailboxes.(inp)` free functions (re-exported as +`osm.mailboxes`); standalone, not methods on the model. Call: +`osm.controllers.mailboxes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show_messages(inp: Input) -> Output: + """`mailboxes:show_messages` — DO arm. Source: Api::Messages::MailboxesController#show_messages.""" + raise NotImplementedError("port Api::Messages::MailboxesController#show_messages") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/maps.py b/.claude/harvest/osm-website-rs/python/osm/controllers/maps.py new file mode 100644 index 0000000..9b300e2 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/maps.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `maps` controller. +`osm.controllers.maps.(inp)` free functions (re-exported as +`osm.maps`); standalone, not methods on the model. Call: +`osm.controllers.maps.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`maps:show` — DO arm. Source: Api::MapsController#show.""" + raise NotImplementedError("port Api::MapsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/messages.py b/.claude/harvest/osm-website-rs/python/osm/controllers/messages.py new file mode 100644 index 0000000..db4ce36 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/messages.py @@ -0,0 +1,34 @@ +"""@generated DO arm — faithful mirror of the `messages` controller. +`osm.controllers.messages.(inp)` free functions (re-exported as +`osm.messages`); standalone, not methods on the model. Call: +`osm.controllers.messages.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`messages:create` — DO arm. Sources (canonical tile): Api::MessagesController#create, MessagesController#create.""" + raise NotImplementedError("port Api::MessagesController#create") + +def delete(inp: Input) -> Output: + """`messages:delete` — DO arm. Sources (canonical tile): Api::MessagesController#destroy, MessagesController#destroy.""" + raise NotImplementedError("port Api::MessagesController#destroy") + +def message_params(inp: Input) -> Output: + """`messages:message_params` — DO arm. Source: MessagesController#message_params.""" + raise NotImplementedError("port MessagesController#message_params") + +def new_form(inp: Input) -> Output: + """`messages:new_form` — DO arm. Source: MessagesController#new.""" + raise NotImplementedError("port MessagesController#new") + +def show(inp: Input) -> Output: + """`messages:show` — DO arm. Sources (canonical tile): Api::MessagesController#show, MessagesController#show.""" + raise NotImplementedError("port Api::MessagesController#show") + +def update(inp: Input) -> Output: + """`messages:update` — DO arm. Source: Api::MessagesController#update.""" + raise NotImplementedError("port Api::MessagesController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/muted_inboxes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/muted_inboxes.py new file mode 100644 index 0000000..8e89ca2 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/muted_inboxes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `muted_inboxes` controller. +`osm.controllers.muted_inboxes.(inp)` free functions (re-exported as +`osm.muted_inboxes`); standalone, not methods on the model. Call: +`osm.controllers.muted_inboxes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`muted_inboxes:show` — DO arm. Source: Messages::MutedInboxesController#show.""" + raise NotImplementedError("port Messages::MutedInboxesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/mutes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/mutes.py new file mode 100644 index 0000000..75520d7 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/mutes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `mutes` controller. +`osm.controllers.mutes.(inp)` free functions (re-exported as +`osm.mutes`); standalone, not methods on the model. Call: +`osm.controllers.mutes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def delete(inp: Input) -> Output: + """`mutes:delete` — DO arm. Source: Messages::MutesController#destroy.""" + raise NotImplementedError("port Messages::MutesController#destroy") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/nodes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/nodes.py new file mode 100644 index 0000000..405052d --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/nodes.py @@ -0,0 +1,30 @@ +"""@generated DO arm — faithful mirror of the `nodes` controller. +`osm.controllers.nodes.(inp)` free functions (re-exported as +`osm.nodes`); standalone, not methods on the model. Call: +`osm.controllers.nodes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`nodes:create` — DO arm. Source: Api::NodesController#create.""" + raise NotImplementedError("port Api::NodesController#create") + +def delete(inp: Input) -> Output: + """`nodes:delete` — DO arm. Source: Api::NodesController#destroy.""" + raise NotImplementedError("port Api::NodesController#destroy") + +def list(inp: Input) -> Output: + """`nodes:list` — DO arm. Source: Api::NodesController#index.""" + raise NotImplementedError("port Api::NodesController#index") + +def show(inp: Input) -> Output: + """`nodes:show` — DO arm. Sources (canonical tile): Api::NodesController#show, NodesController#show.""" + raise NotImplementedError("port Api::NodesController#show") + +def update(inp: Input) -> Output: + """`nodes:update` — DO arm. Source: Api::NodesController#update.""" + raise NotImplementedError("port Api::NodesController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/nominatim_queries.py b/.claude/harvest/osm-website-rs/python/osm/controllers/nominatim_queries.py new file mode 100644 index 0000000..5a6d8e8 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/nominatim_queries.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `nominatim_queries` controller. +`osm.controllers.nominatim_queries.(inp)` free functions (re-exported as +`osm.nominatim_queries`); standalone, not methods on the model. Call: +`osm.controllers.nominatim_queries.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`nominatim_queries:create` — DO arm. Source: Searches::NominatimQueriesController#create.""" + raise NotImplementedError("port Searches::NominatimQueriesController#create") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/nominatim_reverse_queries.py b/.claude/harvest/osm-website-rs/python/osm/controllers/nominatim_reverse_queries.py new file mode 100644 index 0000000..b9205ad --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/nominatim_reverse_queries.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `nominatim_reverse_queries` controller. +`osm.controllers.nominatim_reverse_queries.(inp)` free functions (re-exported as +`osm.nominatim_reverse_queries`); standalone, not methods on the model. Call: +`osm.controllers.nominatim_reverse_queries.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`nominatim_reverse_queries:create` — DO arm. Source: Searches::NominatimReverseQueriesController#create.""" + raise NotImplementedError("port Searches::NominatimReverseQueriesController#create") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/note_subscriptions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/note_subscriptions.py new file mode 100644 index 0000000..808d7dd --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/note_subscriptions.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `note_subscriptions` controller. +`osm.controllers.note_subscriptions.(inp)` free functions (re-exported as +`osm.note_subscriptions`); standalone, not methods on the model. Call: +`osm.controllers.note_subscriptions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`note_subscriptions:create` — DO arm. Source: Api::NoteSubscriptionsController#create.""" + raise NotImplementedError("port Api::NoteSubscriptionsController#create") + +def delete(inp: Input) -> Output: + """`note_subscriptions:delete` — DO arm. Source: Api::NoteSubscriptionsController#destroy.""" + raise NotImplementedError("port Api::NoteSubscriptionsController#destroy") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/notes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/notes.py new file mode 100644 index 0000000..839fc1b --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/notes.py @@ -0,0 +1,66 @@ +"""@generated DO arm — faithful mirror of the `notes` controller. +`osm.controllers.notes.(inp)` free functions (re-exported as +`osm.notes`); standalone, not methods on the model. Call: +`osm.controllers.notes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def add_comment(inp: Input) -> Output: + """`notes:add_comment` — DO arm. Source: Api::NotesController#add_comment.""" + raise NotImplementedError("port Api::NotesController#add_comment") + +def author_info(inp: Input) -> Output: + """`notes:author_info` — DO arm. Source: Api::NotesController#author_info.""" + raise NotImplementedError("port Api::NotesController#author_info") + +def bbox_condition(inp: Input) -> Output: + """`notes:bbox_condition` — DO arm. Source: Api::NotesController#bbox_condition.""" + raise NotImplementedError("port Api::NotesController#bbox_condition") + +def close(inp: Input) -> Output: + """`notes:close` — DO arm. Source: Api::NotesController#close.""" + raise NotImplementedError("port Api::NotesController#close") + +def closed_condition(inp: Input) -> Output: + """`notes:closed_condition` — DO arm. Source: Api::NotesController#closed_condition.""" + raise NotImplementedError("port Api::NotesController#closed_condition") + +def comment(inp: Input) -> Output: + """`notes:comment` — DO arm. Source: Api::NotesController#comment.""" + raise NotImplementedError("port Api::NotesController#comment") + +def create(inp: Input) -> Output: + """`notes:create` — DO arm. Source: Api::NotesController#create.""" + raise NotImplementedError("port Api::NotesController#create") + +def delete(inp: Input) -> Output: + """`notes:delete` — DO arm. Source: Api::NotesController#destroy.""" + raise NotImplementedError("port Api::NotesController#destroy") + +def feed(inp: Input) -> Output: + """`notes:feed` — DO arm. Source: Api::NotesController#feed.""" + raise NotImplementedError("port Api::NotesController#feed") + +def list(inp: Input) -> Output: + """`notes:list` — DO arm. Sources (canonical tile): Api::NotesController#index, NotesController#index.""" + raise NotImplementedError("port Api::NotesController#index") + +def new_form(inp: Input) -> Output: + """`notes:new_form` — DO arm. Source: NotesController#new.""" + raise NotImplementedError("port NotesController#new") + +def reopen(inp: Input) -> Output: + """`notes:reopen` — DO arm. Source: Api::NotesController#reopen.""" + raise NotImplementedError("port Api::NotesController#reopen") + +def search(inp: Input) -> Output: + """`notes:search` — DO arm. Source: Api::NotesController#search.""" + raise NotImplementedError("port Api::NotesController#search") + +def show(inp: Input) -> Output: + """`notes:show` — DO arm. Sources (canonical tile): Api::NotesController#show, NotesController#show.""" + raise NotImplementedError("port Api::NotesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/notification_preferences.py b/.claude/harvest/osm-website-rs/python/osm/controllers/notification_preferences.py new file mode 100644 index 0000000..25076bd --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/notification_preferences.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `notification_preferences` controller. +`osm.controllers.notification_preferences.(inp)` free functions (re-exported as +`osm.notification_preferences`); standalone, not methods on the model. Call: +`osm.controllers.notification_preferences.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def update_preferences(inp: Input) -> Output: + """`notification_preferences:update_preferences` — DO arm. Source: Preferences::NotificationPreferencesController#update_preferences.""" + raise NotImplementedError("port Preferences::NotificationPreferencesController#update_preferences") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/oauth2_applications.py b/.claude/harvest/osm-website-rs/python/osm/controllers/oauth2_applications.py new file mode 100644 index 0000000..b8df9d5 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/oauth2_applications.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `oauth2_applications` controller. +`osm.controllers.oauth2_applications.(inp)` free functions (re-exported as +`osm.oauth2_applications`); standalone, not methods on the model. Call: +`osm.controllers.oauth2_applications.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def application_params(inp: Input) -> Output: + """`oauth2_applications:application_params` — DO arm. Source: Oauth2ApplicationsController#application_params.""" + raise NotImplementedError("port Oauth2ApplicationsController#application_params") + +def list(inp: Input) -> Output: + """`oauth2_applications:list` — DO arm. Source: Oauth2ApplicationsController#index.""" + raise NotImplementedError("port Oauth2ApplicationsController#index") + +def set_application(inp: Input) -> Output: + """`oauth2_applications:set_application` — DO arm. Source: Oauth2ApplicationsController#set_application.""" + raise NotImplementedError("port Oauth2ApplicationsController#set_application") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/old_elements.py b/.claude/harvest/osm-website-rs/python/osm/controllers/old_elements.py new file mode 100644 index 0000000..c925d50 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/old_elements.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `old_elements` controller. +`osm.controllers.old_elements.(inp)` free functions (re-exported as +`osm.old_elements`); standalone, not methods on the model. Call: +`osm.controllers.old_elements.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def list(inp: Input) -> Output: + """`old_elements:list` — DO arm. Source: Api::OldElementsController#index.""" + raise NotImplementedError("port Api::OldElementsController#index") + +def require_moderator_for_unredacted_history(inp: Input) -> Output: + """`old_elements:require_moderator_for_unredacted_history` — DO arm. Source: OldElementsController#require_moderator_for_unredacted_history.""" + raise NotImplementedError("port OldElementsController#require_moderator_for_unredacted_history") + +def show(inp: Input) -> Output: + """`old_elements:show` — DO arm. Source: Api::OldElementsController#show.""" + raise NotImplementedError("port Api::OldElementsController#show") + +def show_redactions(inp: Input) -> Output: + """`old_elements:show_redactions?` — DO arm. Source: Api::OldElementsController#show_redactions?.""" + raise NotImplementedError("port Api::OldElementsController#show_redactions?") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/old_nodes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/old_nodes.py new file mode 100644 index 0000000..8601cae --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/old_nodes.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `old_nodes` controller. +`osm.controllers.old_nodes.(inp)` free functions (re-exported as +`osm.old_nodes`); standalone, not methods on the model. Call: +`osm.controllers.old_nodes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def list(inp: Input) -> Output: + """`old_nodes:list` — DO arm. Source: OldNodesController#index.""" + raise NotImplementedError("port OldNodesController#index") + +def lookup_old_element(inp: Input) -> Output: + """`old_nodes:lookup_old_element` — DO arm. Source: Api::OldNodesController#lookup_old_element.""" + raise NotImplementedError("port Api::OldNodesController#lookup_old_element") + +def lookup_old_element_versions(inp: Input) -> Output: + """`old_nodes:lookup_old_element_versions` — DO arm. Source: Api::OldNodesController#lookup_old_element_versions.""" + raise NotImplementedError("port Api::OldNodesController#lookup_old_element_versions") + +def show(inp: Input) -> Output: + """`old_nodes:show` — DO arm. Source: OldNodesController#show.""" + raise NotImplementedError("port OldNodesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/old_relation_members.py b/.claude/harvest/osm-website-rs/python/osm/controllers/old_relation_members.py new file mode 100644 index 0000000..de16102 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/old_relation_members.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `old_relation_members` controller. +`osm.controllers.old_relation_members.(inp)` free functions (re-exported as +`osm.old_relation_members`); standalone, not methods on the model. Call: +`osm.controllers.old_relation_members.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`old_relation_members:show` — DO arm. Source: OldRelationMembersController#show.""" + raise NotImplementedError("port OldRelationMembersController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/old_relations.py b/.claude/harvest/osm-website-rs/python/osm/controllers/old_relations.py new file mode 100644 index 0000000..19942dd --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/old_relations.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `old_relations` controller. +`osm.controllers.old_relations.(inp)` free functions (re-exported as +`osm.old_relations`); standalone, not methods on the model. Call: +`osm.controllers.old_relations.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def list(inp: Input) -> Output: + """`old_relations:list` — DO arm. Source: OldRelationsController#index.""" + raise NotImplementedError("port OldRelationsController#index") + +def lookup_old_element(inp: Input) -> Output: + """`old_relations:lookup_old_element` — DO arm. Source: Api::OldRelationsController#lookup_old_element.""" + raise NotImplementedError("port Api::OldRelationsController#lookup_old_element") + +def lookup_old_element_versions(inp: Input) -> Output: + """`old_relations:lookup_old_element_versions` — DO arm. Source: Api::OldRelationsController#lookup_old_element_versions.""" + raise NotImplementedError("port Api::OldRelationsController#lookup_old_element_versions") + +def show(inp: Input) -> Output: + """`old_relations:show` — DO arm. Source: OldRelationsController#show.""" + raise NotImplementedError("port OldRelationsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/old_ways.py b/.claude/harvest/osm-website-rs/python/osm/controllers/old_ways.py new file mode 100644 index 0000000..30b2c72 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/old_ways.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `old_ways` controller. +`osm.controllers.old_ways.(inp)` free functions (re-exported as +`osm.old_ways`); standalone, not methods on the model. Call: +`osm.controllers.old_ways.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def list(inp: Input) -> Output: + """`old_ways:list` — DO arm. Source: OldWaysController#index.""" + raise NotImplementedError("port OldWaysController#index") + +def lookup_old_element(inp: Input) -> Output: + """`old_ways:lookup_old_element` — DO arm. Source: Api::OldWaysController#lookup_old_element.""" + raise NotImplementedError("port Api::OldWaysController#lookup_old_element") + +def lookup_old_element_versions(inp: Input) -> Output: + """`old_ways:lookup_old_element_versions` — DO arm. Source: Api::OldWaysController#lookup_old_element_versions.""" + raise NotImplementedError("port Api::OldWaysController#lookup_old_element_versions") + +def show(inp: Input) -> Output: + """`old_ways:show` — DO arm. Source: OldWaysController#show.""" + raise NotImplementedError("port OldWaysController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/outboxes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/outboxes.py new file mode 100644 index 0000000..7d95b98 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/outboxes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `outboxes` controller. +`osm.controllers.outboxes.(inp)` free functions (re-exported as +`osm.outboxes`); standalone, not methods on the model. Call: +`osm.controllers.outboxes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`outboxes:show` — DO arm. Sources (canonical tile): Api::Messages::OutboxesController#show, Messages::OutboxesController#show.""" + raise NotImplementedError("port Api::Messages::OutboxesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/passwords.py b/.claude/harvest/osm-website-rs/python/osm/controllers/passwords.py new file mode 100644 index 0000000..fe23d2d --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/passwords.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `passwords` controller. +`osm.controllers.passwords.(inp)` free functions (re-exported as +`osm.passwords`); standalone, not methods on the model. Call: +`osm.controllers.passwords.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`passwords:create` — DO arm. Source: PasswordsController#create.""" + raise NotImplementedError("port PasswordsController#create") + +def edit(inp: Input) -> Output: + """`passwords:edit` — DO arm. Source: PasswordsController#edit.""" + raise NotImplementedError("port PasswordsController#edit") + +def new_form(inp: Input) -> Output: + """`passwords:new_form` — DO arm. Source: PasswordsController#new.""" + raise NotImplementedError("port PasswordsController#new") + +def update(inp: Input) -> Output: + """`passwords:update` — DO arm. Source: PasswordsController#update.""" + raise NotImplementedError("port PasswordsController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/pd_declarations.py b/.claude/harvest/osm-website-rs/python/osm/controllers/pd_declarations.py new file mode 100644 index 0000000..c697d85 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/pd_declarations.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `pd_declarations` controller. +`osm.controllers.pd_declarations.(inp)` free functions (re-exported as +`osm.pd_declarations`); standalone, not methods on the model. Call: +`osm.controllers.pd_declarations.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`pd_declarations:create` — DO arm. Source: Accounts::PdDeclarationsController#create.""" + raise NotImplementedError("port Accounts::PdDeclarationsController#create") + +def show(inp: Input) -> Output: + """`pd_declarations:show` — DO arm. Source: Accounts::PdDeclarationsController#show.""" + raise NotImplementedError("port Accounts::PdDeclarationsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/permissions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/permissions.py new file mode 100644 index 0000000..72e7e08 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/permissions.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `permissions` controller. +`osm.controllers.permissions.(inp)` free functions (re-exported as +`osm.permissions`); standalone, not methods on the model. Call: +`osm.controllers.permissions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`permissions:show` — DO arm. Source: Api::PermissionsController#show.""" + raise NotImplementedError("port Api::PermissionsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/pictures.py b/.claude/harvest/osm-website-rs/python/osm/controllers/pictures.py new file mode 100644 index 0000000..17582fc --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/pictures.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `pictures` controller. +`osm.controllers.pictures.(inp)` free functions (re-exported as +`osm.pictures`); standalone, not methods on the model. Call: +`osm.controllers.pictures.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`pictures:show` — DO arm. Source: Traces::PicturesController#show.""" + raise NotImplementedError("port Traces::PicturesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/preferences.py b/.claude/harvest/osm-website-rs/python/osm/controllers/preferences.py new file mode 100644 index 0000000..0bd7953 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/preferences.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `preferences` controller. +`osm.controllers.preferences.(inp)` free functions (re-exported as +`osm.preferences`); standalone, not methods on the model. Call: +`osm.controllers.preferences.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`preferences:show` — DO arm. Source: Preferences::PreferencesController#show.""" + raise NotImplementedError("port Preferences::PreferencesController#show") + +def update(inp: Input) -> Output: + """`preferences:update` — DO arm. Source: Preferences::PreferencesController#update.""" + raise NotImplementedError("port Preferences::PreferencesController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/profile_sections.py b/.claude/harvest/osm-website-rs/python/osm/controllers/profile_sections.py new file mode 100644 index 0000000..76a49ba --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/profile_sections.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `profile_sections` controller. +`osm.controllers.profile_sections.(inp)` free functions (re-exported as +`osm.profile_sections`); standalone, not methods on the model. Call: +`osm.controllers.profile_sections.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`profile_sections:show` — DO arm. Source: Profiles::ProfileSectionsController#show.""" + raise NotImplementedError("port Profiles::ProfileSectionsController#show") + +def update(inp: Input) -> Output: + """`profile_sections:update` — DO arm. Source: Profiles::ProfileSectionsController#update.""" + raise NotImplementedError("port Profiles::ProfileSectionsController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/queries.py b/.claude/harvest/osm-website-rs/python/osm/controllers/queries.py new file mode 100644 index 0000000..2a90812 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/queries.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `queries` controller. +`osm.controllers.queries.(inp)` free functions (re-exported as +`osm.queries`); standalone, not methods on the model. Call: +`osm.controllers.queries.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def fetch_text(inp: Input) -> Output: + """`queries:fetch_text` — DO arm. Source: Searches::QueriesController#fetch_text.""" + raise NotImplementedError("port Searches::QueriesController#fetch_text") + +def fetch_xml(inp: Input) -> Output: + """`queries:fetch_xml` — DO arm. Source: Searches::QueriesController#fetch_xml.""" + raise NotImplementedError("port Searches::QueriesController#fetch_xml") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/read_marks.py b/.claude/harvest/osm-website-rs/python/osm/controllers/read_marks.py new file mode 100644 index 0000000..17de427 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/read_marks.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `read_marks` controller. +`osm.controllers.read_marks.(inp)` free functions (re-exported as +`osm.read_marks`); standalone, not methods on the model. Call: +`osm.controllers.read_marks.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`read_marks:create` — DO arm. Source: Messages::ReadMarksController#create.""" + raise NotImplementedError("port Messages::ReadMarksController#create") + +def delete(inp: Input) -> Output: + """`read_marks:delete` — DO arm. Source: Messages::ReadMarksController#destroy.""" + raise NotImplementedError("port Messages::ReadMarksController#destroy") + +def mark(inp: Input) -> Output: + """`read_marks:mark` — DO arm. Source: Messages::ReadMarksController#mark.""" + raise NotImplementedError("port Messages::ReadMarksController#mark") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/received_blocks.py b/.claude/harvest/osm-website-rs/python/osm/controllers/received_blocks.py new file mode 100644 index 0000000..0ecfd5e --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/received_blocks.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `received_blocks` controller. +`osm.controllers.received_blocks.(inp)` free functions (re-exported as +`osm.received_blocks`); standalone, not methods on the model. Call: +`osm.controllers.received_blocks.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def delete(inp: Input) -> Output: + """`received_blocks:delete` — DO arm. Source: Users::ReceivedBlocksController#destroy.""" + raise NotImplementedError("port Users::ReceivedBlocksController#destroy") + +def edit(inp: Input) -> Output: + """`received_blocks:edit` — DO arm. Source: Users::ReceivedBlocksController#edit.""" + raise NotImplementedError("port Users::ReceivedBlocksController#edit") + +def show(inp: Input) -> Output: + """`received_blocks:show` — DO arm. Source: Users::ReceivedBlocksController#show.""" + raise NotImplementedError("port Users::ReceivedBlocksController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/redactions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/redactions.py new file mode 100644 index 0000000..afc6765 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/redactions.py @@ -0,0 +1,46 @@ +"""@generated DO arm — faithful mirror of the `redactions` controller. +`osm.controllers.redactions.(inp)` free functions (re-exported as +`osm.redactions`); standalone, not methods on the model. Call: +`osm.controllers.redactions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`redactions:create` — DO arm. Sources (canonical tile): Api::OldElements::RedactionsController#create, RedactionsController#create.""" + raise NotImplementedError("port Api::OldElements::RedactionsController#create") + +def delete(inp: Input) -> Output: + """`redactions:delete` — DO arm. Sources (canonical tile): Api::OldElements::RedactionsController#destroy, RedactionsController#destroy.""" + raise NotImplementedError("port Api::OldElements::RedactionsController#destroy") + +def edit(inp: Input) -> Output: + """`redactions:edit` — DO arm. Source: RedactionsController#edit.""" + raise NotImplementedError("port RedactionsController#edit") + +def list(inp: Input) -> Output: + """`redactions:list` — DO arm. Source: RedactionsController#index.""" + raise NotImplementedError("port RedactionsController#index") + +def lookup_old_element(inp: Input) -> Output: + """`redactions:lookup_old_element` — DO arm. Sources (canonical tile): Api::OldNodes::RedactionsController#lookup_old_element, Api::OldRelations::RedactionsController#lookup_old_element, Api::OldWays::RedactionsController#lookup_old_element.""" + raise NotImplementedError("port Api::OldNodes::RedactionsController#lookup_old_element") + +def lookup_redaction(inp: Input) -> Output: + """`redactions:lookup_redaction` — DO arm. Source: RedactionsController#lookup_redaction.""" + raise NotImplementedError("port RedactionsController#lookup_redaction") + +def new_form(inp: Input) -> Output: + """`redactions:new_form` — DO arm. Source: RedactionsController#new.""" + raise NotImplementedError("port RedactionsController#new") + +def show(inp: Input) -> Output: + """`redactions:show` — DO arm. Source: RedactionsController#show.""" + raise NotImplementedError("port RedactionsController#show") + +def update(inp: Input) -> Output: + """`redactions:update` — DO arm. Source: RedactionsController#update.""" + raise NotImplementedError("port RedactionsController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/relation_members.py b/.claude/harvest/osm-website-rs/python/osm/controllers/relation_members.py new file mode 100644 index 0000000..e315ae8 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/relation_members.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `relation_members` controller. +`osm.controllers.relation_members.(inp)` free functions (re-exported as +`osm.relation_members`); standalone, not methods on the model. Call: +`osm.controllers.relation_members.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`relation_members:show` — DO arm. Source: RelationMembersController#show.""" + raise NotImplementedError("port RelationMembersController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/relations.py b/.claude/harvest/osm-website-rs/python/osm/controllers/relations.py new file mode 100644 index 0000000..674f23d --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/relations.py @@ -0,0 +1,30 @@ +"""@generated DO arm — faithful mirror of the `relations` controller. +`osm.controllers.relations.(inp)` free functions (re-exported as +`osm.relations`); standalone, not methods on the model. Call: +`osm.controllers.relations.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`relations:create` — DO arm. Source: Api::RelationsController#create.""" + raise NotImplementedError("port Api::RelationsController#create") + +def delete(inp: Input) -> Output: + """`relations:delete` — DO arm. Source: Api::RelationsController#destroy.""" + raise NotImplementedError("port Api::RelationsController#destroy") + +def list(inp: Input) -> Output: + """`relations:list` — DO arm. Sources (canonical tile): Api::Nodes::RelationsController#index, Api::Relations::RelationsController#index, Api::RelationsController#index, Api::Ways::RelationsController#index.""" + raise NotImplementedError("port Api::Nodes::RelationsController#index") + +def show(inp: Input) -> Output: + """`relations:show` — DO arm. Sources (canonical tile): Api::RelationsController#show, RelationsController#show.""" + raise NotImplementedError("port Api::RelationsController#show") + +def update(inp: Input) -> Output: + """`relations:update` — DO arm. Source: Api::RelationsController#update.""" + raise NotImplementedError("port Api::RelationsController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/replies.py b/.claude/harvest/osm-website-rs/python/osm/controllers/replies.py new file mode 100644 index 0000000..6310202 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/replies.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `replies` controller. +`osm.controllers.replies.(inp)` free functions (re-exported as +`osm.replies`); standalone, not methods on the model. Call: +`osm.controllers.replies.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def new_form(inp: Input) -> Output: + """`replies:new_form` — DO arm. Source: Messages::RepliesController#new.""" + raise NotImplementedError("port Messages::RepliesController#new") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/reporters.py b/.claude/harvest/osm-website-rs/python/osm/controllers/reporters.py new file mode 100644 index 0000000..4d6b5bf --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/reporters.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `reporters` controller. +`osm.controllers.reporters.(inp)` free functions (re-exported as +`osm.reporters`); standalone, not methods on the model. Call: +`osm.controllers.reporters.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def list(inp: Input) -> Output: + """`reporters:list` — DO arm. Source: Issues::ReportersController#index.""" + raise NotImplementedError("port Issues::ReportersController#index") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/reports.py b/.claude/harvest/osm-website-rs/python/osm/controllers/reports.py new file mode 100644 index 0000000..911ecd6 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/reports.py @@ -0,0 +1,38 @@ +"""@generated DO arm — faithful mirror of the `reports` controller. +`osm.controllers.reports.(inp)` free functions (re-exported as +`osm.reports`); standalone, not methods on the model. Call: +`osm.controllers.reports.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`reports:create` — DO arm. Source: ReportsController#create.""" + raise NotImplementedError("port ReportsController#create") + +def create_new_report_params(inp: Input) -> Output: + """`reports:create_new_report_params` — DO arm. Source: ReportsController#create_new_report_params.""" + raise NotImplementedError("port ReportsController#create_new_report_params") + +def default_assigned_role(inp: Input) -> Output: + """`reports:default_assigned_role` — DO arm. Source: ReportsController#default_assigned_role.""" + raise NotImplementedError("port ReportsController#default_assigned_role") + +def issue_params(inp: Input) -> Output: + """`reports:issue_params` — DO arm. Source: ReportsController#issue_params.""" + raise NotImplementedError("port ReportsController#issue_params") + +def new_form(inp: Input) -> Output: + """`reports:new_form` — DO arm. Source: ReportsController#new.""" + raise NotImplementedError("port ReportsController#new") + +def report_params(inp: Input) -> Output: + """`reports:report_params` — DO arm. Source: ReportsController#report_params.""" + raise NotImplementedError("port ReportsController#report_params") + +def required_new_report_params_present(inp: Input) -> Output: + """`reports:required_new_report_params_present?` — DO arm. Source: ReportsController#required_new_report_params_present?.""" + raise NotImplementedError("port ReportsController#required_new_report_params_present?") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/searches.py b/.claude/harvest/osm-website-rs/python/osm/controllers/searches.py new file mode 100644 index 0000000..b192a61 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/searches.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `searches` controller. +`osm.controllers.searches.(inp)` free functions (re-exported as +`osm.searches`); standalone, not methods on the model. Call: +`osm.controllers.searches.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def dms_regexp(inp: Input) -> Output: + """`searches:dms_regexp` — DO arm. Source: SearchesController#dms_regexp.""" + raise NotImplementedError("port SearchesController#dms_regexp") + +def normalize_params(inp: Input) -> Output: + """`searches:normalize_params` — DO arm. Source: SearchesController#normalize_params.""" + raise NotImplementedError("port SearchesController#normalize_params") + +def show(inp: Input) -> Output: + """`searches:show` — DO arm. Source: SearchesController#show.""" + raise NotImplementedError("port SearchesController#show") + +def to_decdeg(inp: Input) -> Output: + """`searches:to_decdeg` — DO arm. Source: SearchesController#to_decdeg.""" + raise NotImplementedError("port SearchesController#to_decdeg") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/sessions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/sessions.py new file mode 100644 index 0000000..9012ca3 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/sessions.py @@ -0,0 +1,26 @@ +"""@generated DO arm — faithful mirror of the `sessions` controller. +`osm.controllers.sessions.(inp)` free functions (re-exported as +`osm.sessions`); standalone, not methods on the model. Call: +`osm.controllers.sessions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`sessions:create` — DO arm. Source: SessionsController#create.""" + raise NotImplementedError("port SessionsController#create") + +def delete(inp: Input) -> Output: + """`sessions:delete` — DO arm. Source: SessionsController#destroy.""" + raise NotImplementedError("port SessionsController#destroy") + +def new_form(inp: Input) -> Output: + """`sessions:new_form` — DO arm. Source: SessionsController#new.""" + raise NotImplementedError("port SessionsController#new") + +def password_authentication(inp: Input) -> Output: + """`sessions:password_authentication` — DO arm. Source: SessionsController#password_authentication.""" + raise NotImplementedError("port SessionsController#password_authentication") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/share_panes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/share_panes.py new file mode 100644 index 0000000..49a6bff --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/share_panes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `share_panes` controller. +`osm.controllers.share_panes.(inp)` free functions (re-exported as +`osm.share_panes`); standalone, not methods on the model. Call: +`osm.controllers.share_panes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`share_panes:show` — DO arm. Source: SharePanesController#show.""" + raise NotImplementedError("port SharePanesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/site.py b/.claude/harvest/osm-website-rs/python/osm/controllers/site.py new file mode 100644 index 0000000..84c4082 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/site.py @@ -0,0 +1,66 @@ +"""@generated DO arm — faithful mirror of the `site` controller. +`osm.controllers.site.(inp)` free functions (re-exported as +`osm.site`); standalone, not methods on the model. Call: +`osm.controllers.site.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def about(inp: Input) -> Output: + """`site:about` — DO arm. Source: SiteController#about.""" + raise NotImplementedError("port SiteController#about") + +def communities(inp: Input) -> Output: + """`site:communities` — DO arm. Source: SiteController#communities.""" + raise NotImplementedError("port SiteController#communities") + +def copyright(inp: Input) -> Output: + """`site:copyright` — DO arm. Source: SiteController#copyright.""" + raise NotImplementedError("port SiteController#copyright") + +def edit(inp: Input) -> Output: + """`site:edit` — DO arm. Source: SiteController#edit.""" + raise NotImplementedError("port SiteController#edit") + +def export(inp: Input) -> Output: + """`site:export` — DO arm. Source: SiteController#export.""" + raise NotImplementedError("port SiteController#export") + +def help(inp: Input) -> Output: + """`site:help` — DO arm. Source: SiteController#help.""" + raise NotImplementedError("port SiteController#help") + +def id(inp: Input) -> Output: + """`site:id` — DO arm. Source: SiteController#id.""" + raise NotImplementedError("port SiteController#id") + +def list(inp: Input) -> Output: + """`site:list` — DO arm. Source: SiteController#index.""" + raise NotImplementedError("port SiteController#index") + +def offline(inp: Input) -> Output: + """`site:offline` — DO arm. Source: SiteController#offline.""" + raise NotImplementedError("port SiteController#offline") + +def permalink(inp: Input) -> Output: + """`site:permalink` — DO arm. Source: SiteController#permalink.""" + raise NotImplementedError("port SiteController#permalink") + +def preview(inp: Input) -> Output: + """`site:preview` — DO arm. Source: SiteController#preview.""" + raise NotImplementedError("port SiteController#preview") + +def redirect_browse_params(inp: Input) -> Output: + """`site:redirect_browse_params` — DO arm. Source: SiteController#redirect_browse_params.""" + raise NotImplementedError("port SiteController#redirect_browse_params") + +def redirect_map_params(inp: Input) -> Output: + """`site:redirect_map_params` — DO arm. Source: SiteController#redirect_map_params.""" + raise NotImplementedError("port SiteController#redirect_map_params") + +def welcome(inp: Input) -> Output: + """`site:welcome` — DO arm. Source: SiteController#welcome.""" + raise NotImplementedError("port SiteController#welcome") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/statuses.py b/.claude/harvest/osm-website-rs/python/osm/controllers/statuses.py new file mode 100644 index 0000000..2a4c5cd --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/statuses.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `statuses` controller. +`osm.controllers.statuses.(inp)` free functions (re-exported as +`osm.statuses`); standalone, not methods on the model. Call: +`osm.controllers.statuses.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def lookup_user_by_name(inp: Input) -> Output: + """`statuses:lookup_user_by_name` — DO arm. Source: Users::StatusesController#lookup_user_by_name.""" + raise NotImplementedError("port Users::StatusesController#lookup_user_by_name") + +def update(inp: Input) -> Output: + """`statuses:update` — DO arm. Source: Users::StatusesController#update.""" + raise NotImplementedError("port Users::StatusesController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/terms.py b/.claude/harvest/osm-website-rs/python/osm/controllers/terms.py new file mode 100644 index 0000000..5e57f46 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/terms.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `terms` controller. +`osm.controllers.terms.(inp)` free functions (re-exported as +`osm.terms`); standalone, not methods on the model. Call: +`osm.controllers.terms.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`terms:show` — DO arm. Source: Accounts::TermsController#show.""" + raise NotImplementedError("port Accounts::TermsController#show") + +def update(inp: Input) -> Output: + """`terms:update` — DO arm. Source: Accounts::TermsController#update.""" + raise NotImplementedError("port Accounts::TermsController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/tracepoints.py b/.claude/harvest/osm-website-rs/python/osm/controllers/tracepoints.py new file mode 100644 index 0000000..2678783 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/tracepoints.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `tracepoints` controller. +`osm.controllers.tracepoints.(inp)` free functions (re-exported as +`osm.tracepoints`); standalone, not methods on the model. Call: +`osm.controllers.tracepoints.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def list(inp: Input) -> Output: + """`tracepoints:list` — DO arm. Source: Api::TracepointsController#index.""" + raise NotImplementedError("port Api::TracepointsController#index") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/traces.py b/.claude/harvest/osm-website-rs/python/osm/controllers/traces.py new file mode 100644 index 0000000..ef17ec9 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/traces.py @@ -0,0 +1,66 @@ +"""@generated DO arm — faithful mirror of the `traces` controller. +`osm.controllers.traces.(inp)` free functions (re-exported as +`osm.traces`); standalone, not methods on the model. Call: +`osm.controllers.traces.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`traces:create` — DO arm. Sources (canonical tile): Api::TracesController#create, TracesController#create.""" + raise NotImplementedError("port Api::TracesController#create") + +def default_visibility(inp: Input) -> Output: + """`traces:default_visibility` — DO arm. Source: TracesController#default_visibility.""" + raise NotImplementedError("port TracesController#default_visibility") + +def delete(inp: Input) -> Output: + """`traces:delete` — DO arm. Sources (canonical tile): Api::TracesController#destroy, TracesController#destroy.""" + raise NotImplementedError("port Api::TracesController#destroy") + +def do_create(inp: Input) -> Output: + """`traces:do_create` — DO arm. Sources (canonical tile): Api::TracesController#do_create, TracesController#do_create.""" + raise NotImplementedError("port Api::TracesController#do_create") + +def edit(inp: Input) -> Output: + """`traces:edit` — DO arm. Source: TracesController#edit.""" + raise NotImplementedError("port TracesController#edit") + +def list(inp: Input) -> Output: + """`traces:list` — DO arm. Sources (canonical tile): Api::Users::TracesController#index, TracesController#index.""" + raise NotImplementedError("port Api::Users::TracesController#index") + +def mine(inp: Input) -> Output: + """`traces:mine` — DO arm. Source: TracesController#mine.""" + raise NotImplementedError("port TracesController#mine") + +def new_form(inp: Input) -> Output: + """`traces:new_form` — DO arm. Source: TracesController#new.""" + raise NotImplementedError("port TracesController#new") + +def offline_error(inp: Input) -> Output: + """`traces:offline_error` — DO arm. Source: Api::TracesController#offline_error.""" + raise NotImplementedError("port Api::TracesController#offline_error") + +def offline_redirect(inp: Input) -> Output: + """`traces:offline_redirect` — DO arm. Source: TracesController#offline_redirect.""" + raise NotImplementedError("port TracesController#offline_redirect") + +def offline_warning(inp: Input) -> Output: + """`traces:offline_warning` — DO arm. Source: TracesController#offline_warning.""" + raise NotImplementedError("port TracesController#offline_warning") + +def show(inp: Input) -> Output: + """`traces:show` — DO arm. Sources (canonical tile): Api::TracesController#show, TracesController#show.""" + raise NotImplementedError("port Api::TracesController#show") + +def trace_params(inp: Input) -> Output: + """`traces:trace_params` — DO arm. Source: TracesController#trace_params.""" + raise NotImplementedError("port TracesController#trace_params") + +def update(inp: Input) -> Output: + """`traces:update` — DO arm. Sources (canonical tile): Api::TracesController#update, TracesController#update.""" + raise NotImplementedError("port Api::TracesController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/uploads.py b/.claude/harvest/osm-website-rs/python/osm/controllers/uploads.py new file mode 100644 index 0000000..494de27 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/uploads.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `uploads` controller. +`osm.controllers.uploads.(inp)` free functions (re-exported as +`osm.uploads`); standalone, not methods on the model. Call: +`osm.controllers.uploads.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`uploads:create` — DO arm. Source: Api::Changesets::UploadsController#create.""" + raise NotImplementedError("port Api::Changesets::UploadsController#create") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/user_blocks.py b/.claude/harvest/osm-website-rs/python/osm/controllers/user_blocks.py new file mode 100644 index 0000000..bd9b454 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/user_blocks.py @@ -0,0 +1,42 @@ +"""@generated DO arm — faithful mirror of the `user_blocks` controller. +`osm.controllers.user_blocks.(inp)` free functions (re-exported as +`osm.user_blocks`); standalone, not methods on the model. Call: +`osm.controllers.user_blocks.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`user_blocks:create` — DO arm. Sources (canonical tile): Api::UserBlocksController#create, UserBlocksController#create.""" + raise NotImplementedError("port Api::UserBlocksController#create") + +def edit(inp: Input) -> Output: + """`user_blocks:edit` — DO arm. Source: UserBlocksController#edit.""" + raise NotImplementedError("port UserBlocksController#edit") + +def list(inp: Input) -> Output: + """`user_blocks:list` — DO arm. Source: UserBlocksController#index.""" + raise NotImplementedError("port UserBlocksController#index") + +def lookup_user_block(inp: Input) -> Output: + """`user_blocks:lookup_user_block` — DO arm. Source: UserBlocksController#lookup_user_block.""" + raise NotImplementedError("port UserBlocksController#lookup_user_block") + +def new_form(inp: Input) -> Output: + """`user_blocks:new_form` — DO arm. Source: UserBlocksController#new.""" + raise NotImplementedError("port UserBlocksController#new") + +def require_valid_params(inp: Input) -> Output: + """`user_blocks:require_valid_params` — DO arm. Source: UserBlocksController#require_valid_params.""" + raise NotImplementedError("port UserBlocksController#require_valid_params") + +def show(inp: Input) -> Output: + """`user_blocks:show` — DO arm. Sources (canonical tile): Api::UserBlocksController#show, UserBlocksController#show.""" + raise NotImplementedError("port Api::UserBlocksController#show") + +def update(inp: Input) -> Output: + """`user_blocks:update` — DO arm. Source: UserBlocksController#update.""" + raise NotImplementedError("port UserBlocksController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/user_mutes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/user_mutes.py new file mode 100644 index 0000000..056c0be --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/user_mutes.py @@ -0,0 +1,22 @@ +"""@generated DO arm — faithful mirror of the `user_mutes` controller. +`osm.controllers.user_mutes.(inp)` free functions (re-exported as +`osm.user_mutes`); standalone, not methods on the model. Call: +`osm.controllers.user_mutes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`user_mutes:create` — DO arm. Source: UserMutesController#create.""" + raise NotImplementedError("port UserMutesController#create") + +def delete(inp: Input) -> Output: + """`user_mutes:delete` — DO arm. Source: UserMutesController#destroy.""" + raise NotImplementedError("port UserMutesController#destroy") + +def list(inp: Input) -> Output: + """`user_mutes:list` — DO arm. Source: UserMutesController#index.""" + raise NotImplementedError("port UserMutesController#index") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/user_preferences.py b/.claude/harvest/osm-website-rs/python/osm/controllers/user_preferences.py new file mode 100644 index 0000000..2c8b3cb --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/user_preferences.py @@ -0,0 +1,30 @@ +"""@generated DO arm — faithful mirror of the `user_preferences` controller. +`osm.controllers.user_preferences.(inp)` free functions (re-exported as +`osm.user_preferences`); standalone, not methods on the model. Call: +`osm.controllers.user_preferences.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def delete(inp: Input) -> Output: + """`user_preferences:delete` — DO arm. Source: Api::UserPreferencesController#destroy.""" + raise NotImplementedError("port Api::UserPreferencesController#destroy") + +def list(inp: Input) -> Output: + """`user_preferences:list` — DO arm. Source: Api::UserPreferencesController#index.""" + raise NotImplementedError("port Api::UserPreferencesController#index") + +def show(inp: Input) -> Output: + """`user_preferences:show` — DO arm. Source: Api::UserPreferencesController#show.""" + raise NotImplementedError("port Api::UserPreferencesController#show") + +def update(inp: Input) -> Output: + """`user_preferences:update` — DO arm. Source: Api::UserPreferencesController#update.""" + raise NotImplementedError("port Api::UserPreferencesController#update") + +def update_all(inp: Input) -> Output: + """`user_preferences:update_all` — DO arm. Source: Api::UserPreferencesController#update_all.""" + raise NotImplementedError("port Api::UserPreferencesController#update_all") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/user_roles.py b/.claude/harvest/osm-website-rs/python/osm/controllers/user_roles.py new file mode 100644 index 0000000..9d54caf --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/user_roles.py @@ -0,0 +1,30 @@ +"""@generated DO arm — faithful mirror of the `user_roles` controller. +`osm.controllers.user_roles.(inp)` free functions (re-exported as +`osm.user_roles`); standalone, not methods on the model. Call: +`osm.controllers.user_roles.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`user_roles:create` — DO arm. Source: UserRolesController#create.""" + raise NotImplementedError("port UserRolesController#create") + +def delete(inp: Input) -> Output: + """`user_roles:delete` — DO arm. Source: UserRolesController#destroy.""" + raise NotImplementedError("port UserRolesController#destroy") + +def in_role(inp: Input) -> Output: + """`user_roles:in_role` — DO arm. Source: UserRolesController#in_role.""" + raise NotImplementedError("port UserRolesController#in_role") + +def not_in_role(inp: Input) -> Output: + """`user_roles:not_in_role` — DO arm. Source: UserRolesController#not_in_role.""" + raise NotImplementedError("port UserRolesController#not_in_role") + +def require_valid_role(inp: Input) -> Output: + """`user_roles:require_valid_role` — DO arm. Source: UserRolesController#require_valid_role.""" + raise NotImplementedError("port UserRolesController#require_valid_role") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/users.py b/.claude/harvest/osm-website-rs/python/osm/controllers/users.py new file mode 100644 index 0000000..c937c47 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/users.py @@ -0,0 +1,62 @@ +"""@generated DO arm — faithful mirror of the `users` controller. +`osm.controllers.users.(inp)` free functions (re-exported as +`osm.users`); standalone, not methods on the model. Call: +`osm.controllers.users.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def auth_failure(inp: Input) -> Output: + """`users:auth_failure` — DO arm. Source: UsersController#auth_failure.""" + raise NotImplementedError("port UsersController#auth_failure") + +def auth_success(inp: Input) -> Output: + """`users:auth_success` — DO arm. Source: UsersController#auth_success.""" + raise NotImplementedError("port UsersController#auth_success") + +def check_signup_allowed(inp: Input) -> Output: + """`users:check_signup_allowed?` — DO arm. Source: UsersController#check_signup_allowed?.""" + raise NotImplementedError("port UsersController#check_signup_allowed?") + +def create(inp: Input) -> Output: + """`users:create` — DO arm. Source: UsersController#create.""" + raise NotImplementedError("port UsersController#create") + +def details(inp: Input) -> Output: + """`users:details` — DO arm. Source: Api::UsersController#details.""" + raise NotImplementedError("port Api::UsersController#details") + +def go_public(inp: Input) -> Output: + """`users:go_public` — DO arm. Source: UsersController#go_public.""" + raise NotImplementedError("port UsersController#go_public") + +def list(inp: Input) -> Output: + """`users:list` — DO arm. Source: Api::UsersController#index.""" + raise NotImplementedError("port Api::UsersController#index") + +def new_form(inp: Input) -> Output: + """`users:new_form` — DO arm. Source: UsersController#new.""" + raise NotImplementedError("port UsersController#new") + +def save_new_user(inp: Input) -> Output: + """`users:save_new_user` — DO arm. Source: UsersController#save_new_user.""" + raise NotImplementedError("port UsersController#save_new_user") + +def show(inp: Input) -> Output: + """`users:show` — DO arm. Sources (canonical tile): Api::UsersController#show, UsersController#show.""" + raise NotImplementedError("port Api::UsersController#show") + +def user_params(inp: Input) -> Output: + """`users:user_params` — DO arm. Source: UsersController#user_params.""" + raise NotImplementedError("port UsersController#user_params") + +def valid_turnstile_response(inp: Input) -> Output: + """`users:valid_turnstile_response?` — DO arm. Source: UsersController#valid_turnstile_response?.""" + raise NotImplementedError("port UsersController#valid_turnstile_response?") + +def welcome_options(inp: Input) -> Output: + """`users:welcome_options` — DO arm. Source: UsersController#welcome_options.""" + raise NotImplementedError("port UsersController#welcome_options") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/versions.py b/.claude/harvest/osm-website-rs/python/osm/controllers/versions.py new file mode 100644 index 0000000..69d3205 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/versions.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `versions` controller. +`osm.controllers.versions.(inp)` free functions (re-exported as +`osm.versions`); standalone, not methods on the model. Call: +`osm.controllers.versions.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`versions:show` — DO arm. Source: Api::VersionsController#show.""" + raise NotImplementedError("port Api::VersionsController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/visibilities.py b/.claude/harvest/osm-website-rs/python/osm/controllers/visibilities.py new file mode 100644 index 0000000..9a75444 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/visibilities.py @@ -0,0 +1,18 @@ +"""@generated DO arm — faithful mirror of the `visibilities` controller. +`osm.controllers.visibilities.(inp)` free functions (re-exported as +`osm.visibilities`); standalone, not methods on the model. Call: +`osm.controllers.visibilities.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`visibilities:create` — DO arm. Source: Api::ChangesetComments::VisibilitiesController#create.""" + raise NotImplementedError("port Api::ChangesetComments::VisibilitiesController#create") + +def delete(inp: Input) -> Output: + """`visibilities:delete` — DO arm. Source: Api::ChangesetComments::VisibilitiesController#destroy.""" + raise NotImplementedError("port Api::ChangesetComments::VisibilitiesController#destroy") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/ways.py b/.claude/harvest/osm-website-rs/python/osm/controllers/ways.py new file mode 100644 index 0000000..b942deb --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/ways.py @@ -0,0 +1,30 @@ +"""@generated DO arm — faithful mirror of the `ways` controller. +`osm.controllers.ways.(inp)` free functions (re-exported as +`osm.ways`); standalone, not methods on the model. Call: +`osm.controllers.ways.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def create(inp: Input) -> Output: + """`ways:create` — DO arm. Source: Api::WaysController#create.""" + raise NotImplementedError("port Api::WaysController#create") + +def delete(inp: Input) -> Output: + """`ways:delete` — DO arm. Source: Api::WaysController#destroy.""" + raise NotImplementedError("port Api::WaysController#destroy") + +def list(inp: Input) -> Output: + """`ways:list` — DO arm. Sources (canonical tile): Api::Nodes::WaysController#index, Api::WaysController#index.""" + raise NotImplementedError("port Api::Nodes::WaysController#index") + +def show(inp: Input) -> Output: + """`ways:show` — DO arm. Sources (canonical tile): Api::WaysController#show, WaysController#show.""" + raise NotImplementedError("port Api::WaysController#show") + +def update(inp: Input) -> Output: + """`ways:update` — DO arm. Source: Api::WaysController#update.""" + raise NotImplementedError("port Api::WaysController#update") + diff --git a/.claude/harvest/osm-website-rs/python/osm/controllers/webgl_error_panes.py b/.claude/harvest/osm-website-rs/python/osm/controllers/webgl_error_panes.py new file mode 100644 index 0000000..1b8ba21 --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/controllers/webgl_error_panes.py @@ -0,0 +1,14 @@ +"""@generated DO arm — faithful mirror of the `webgl_error_panes` controller. +`osm.controllers.webgl_error_panes.(inp)` free functions (re-exported as +`osm.webgl_error_panes`); standalone, not methods on the model. Call: +`osm.controllers.webgl_error_panes.show(inp)`. +""" +from typing import Any + +Input = dict # the Rails params bag; typed params are the next ruff brick +Output = Any + +def show(inp: Input) -> Output: + """`webgl_error_panes:show` — DO arm. Source: WebglErrorPanesController#show.""" + raise NotImplementedError("port WebglErrorPanesController#show") + diff --git a/.claude/harvest/osm-website-rs/python/osm/models.py b/.claude/harvest/osm-website-rs/python/osm/models.py new file mode 100644 index 0000000..7ff58eb --- /dev/null +++ b/.claude/harvest/osm-website-rs/python/osm/models.py @@ -0,0 +1,337 @@ +"""@generated by ogar-render-askama render_python — ruff → OGAR (THINK arm). +OSM domain models as dataclasses; associations become typed id fields. +""" +from __future__ import annotations +from dataclasses import dataclass, field +from typing import Any, List, Optional + +@dataclass +class Acl: + pass + +@dataclass +class ApplicationRecord: + pass + +@dataclass +class Changeset: + CLASS_ID: int = 0x0F04 # canonical concept `osm_changeset` + user: Optional[int] = None + changeset_tags: List[int] = field(default_factory=list) + nodes: List[int] = field(default_factory=list) + ways: List[int] = field(default_factory=list) + relations: List[int] = field(default_factory=list) + old_nodes: List[int] = field(default_factory=list) + old_ways: List[int] = field(default_factory=list) + old_relations: List[int] = field(default_factory=list) + comments: List[int] = field(default_factory=list) + subscriptions: List[int] = field(default_factory=list) + subscribers: List[int] = field(default_factory=list) + +@dataclass +class ChangesetComment: + changeset: Optional[int] = None + author: Optional[int] = None + +@dataclass +class ChangesetSubscription: + subscriber: Optional[int] = None + changeset: Optional[int] = None + +@dataclass +class ChangesetTag: + changeset: Optional[int] = None + +@dataclass +class Community: + pass + +@dataclass +class DiaryComment: + user: Optional[int] = None + diary_entry: Optional[int] = None + +@dataclass +class DiaryEntry: + user: Optional[int] = None + language: Optional[int] = None + comments: List[int] = field(default_factory=list) + visible_comments: List[int] = field(default_factory=list) + subscriptions: List[int] = field(default_factory=list) + subscribers: List[int] = field(default_factory=list) + +@dataclass +class DiaryEntrySubscription: + user: Optional[int] = None + diary_entry: Optional[int] = None + +@dataclass +class Follow: + follower: Optional[int] = None + following: Optional[int] = None + +@dataclass +class GeoRecord_Coord: + pass + +@dataclass +class Issue: + reportable: Optional[int] = None + reported_user: Optional[int] = None + user_resolved: Optional[int] = None + user_updated: Optional[int] = None + reports: List[int] = field(default_factory=list) + comments: List[int] = field(default_factory=list) + +@dataclass +class IssueComment: + issue: Optional[int] = None + user: Optional[int] = None + +@dataclass +class Language: + diary_entries: List[int] = field(default_factory=list) + +@dataclass +class Message: + sender: Optional[int] = None + recipient: Optional[int] = None + +@dataclass +class ModerationZone: + creator: Optional[int] = None + revoker: Optional[int] = None + +@dataclass +class Node: + CLASS_ID: int = 0x0F01 # canonical concept `osm_node` + changeset: Optional[int] = None + old_nodes: List[int] = field(default_factory=list) + way_nodes: List[int] = field(default_factory=list) + ways: List[int] = field(default_factory=list) + element_tags: List[int] = field(default_factory=list) + old_way_nodes: List[int] = field(default_factory=list) + ways_via_history: List[int] = field(default_factory=list) + containing_relation_members: List[int] = field(default_factory=list) + containing_relations: List[int] = field(default_factory=list) + +@dataclass +class NodeTag: + CLASS_ID: int = 0x0F05 # canonical concept `osm_element_tag` + node: Optional[int] = None + +@dataclass +class Note: + CLASS_ID: int = 0x0F08 # canonical concept `osm_note` + author: Optional[int] = None + comments: List[int] = field(default_factory=list) + all_comments: List[int] = field(default_factory=list) + subscriptions: List[int] = field(default_factory=list) + subscribers: List[int] = field(default_factory=list) + +@dataclass +class NoteComment: + note: Optional[int] = None + author: Optional[int] = None + +@dataclass +class NoteSubscription: + user: Optional[int] = None + note: Optional[int] = None + +@dataclass +class Oauth2Application: + owner: Optional[int] = None + +@dataclass +class OldNode: + CLASS_ID: int = 0x0F01 # canonical concept `osm_node` + changeset: Optional[int] = None + redaction: Optional[int] = None + current_node: Optional[int] = None + old_tags: List[int] = field(default_factory=list) + +@dataclass +class OldNodeTag: + CLASS_ID: int = 0x0F05 # canonical concept `osm_element_tag` + old_node: Optional[int] = None + +@dataclass +class OldRelation: + CLASS_ID: int = 0x0F03 # canonical concept `osm_relation` + changeset: Optional[int] = None + redaction: Optional[int] = None + current_relation: Optional[int] = None + old_members: List[int] = field(default_factory=list) + old_tags: List[int] = field(default_factory=list) + +@dataclass +class OldRelationMember: + CLASS_ID: int = 0x0F06 # canonical concept `osm_relation_member` + old_relation: Optional[int] = None + member: Optional[int] = None + +@dataclass +class OldRelationTag: + CLASS_ID: int = 0x0F05 # canonical concept `osm_element_tag` + old_relation: Optional[int] = None + +@dataclass +class OldWay: + CLASS_ID: int = 0x0F02 # canonical concept `osm_way` + changeset: Optional[int] = None + redaction: Optional[int] = None + current_way: Optional[int] = None + old_nodes: List[int] = field(default_factory=list) + old_tags: List[int] = field(default_factory=list) + +@dataclass +class OldWayNode: + CLASS_ID: int = 0x0F07 # canonical concept `osm_way_node` + old_way: Optional[int] = None + node: Optional[int] = None + way: Optional[int] = None + +@dataclass +class OldWayTag: + CLASS_ID: int = 0x0F05 # canonical concept `osm_element_tag` + old_way: Optional[int] = None + +@dataclass +class Redaction: + user: Optional[int] = None + old_nodes: List[int] = field(default_factory=list) + old_ways: List[int] = field(default_factory=list) + old_relations: List[int] = field(default_factory=list) + +@dataclass +class Relation: + CLASS_ID: int = 0x0F03 # canonical concept `osm_relation` + changeset: Optional[int] = None + old_relations: List[int] = field(default_factory=list) + relation_members: List[int] = field(default_factory=list) + element_tags: List[int] = field(default_factory=list) + containing_relation_members: List[int] = field(default_factory=list) + containing_relations: List[int] = field(default_factory=list) + +@dataclass +class RelationMember: + CLASS_ID: int = 0x0F06 # canonical concept `osm_relation_member` + relation: Optional[int] = None + member: Optional[int] = None + +@dataclass +class RelationTag: + CLASS_ID: int = 0x0F05 # canonical concept `osm_element_tag` + relation: Optional[int] = None + +@dataclass +class Report: + issue: Optional[int] = None + user: Optional[int] = None + +@dataclass +class SocialLink: + user: Optional[int] = None + +@dataclass +class SpammyPhrase: + pass + +@dataclass +class Trace: + CLASS_ID: int = 0x0F09 # canonical concept `osm_gpx_trace` + user: Optional[int] = None + tags: List[int] = field(default_factory=list) + points: List[int] = field(default_factory=list) + +@dataclass +class Tracepoint: + trace: Optional[int] = None + +@dataclass +class Tracetag: + trace: Optional[int] = None + +@dataclass +class User: + CLASS_ID: int = 0x0F0A # canonical concept `osm_user` + traces: List[int] = field(default_factory=list) + diary_entries: List[int] = field(default_factory=list) + diary_comments: List[int] = field(default_factory=list) + diary_entry_subscriptions: List[int] = field(default_factory=list) + diary_subscriptions: List[int] = field(default_factory=list) + messages: List[int] = field(default_factory=list) + new_messages: List[int] = field(default_factory=list) + sent_messages: List[int] = field(default_factory=list) + muted_messages: List[int] = field(default_factory=list) + follows: List[int] = field(default_factory=list) + followings: List[int] = field(default_factory=list) + preferences: List[int] = field(default_factory=list) + changesets: List[int] = field(default_factory=list) + changeset_comments: List[int] = field(default_factory=list) + changeset_subscriptions: List[int] = field(default_factory=list) + note_comments: List[int] = field(default_factory=list) + notes: List[int] = field(default_factory=list) + note_subscriptions: List[int] = field(default_factory=list) + subscribed_notes: List[int] = field(default_factory=list) + oauth2_applications: List[int] = field(default_factory=list) + access_grants: List[int] = field(default_factory=list) + access_tokens: List[int] = field(default_factory=list) + blocks: List[int] = field(default_factory=list) + blocks_created: List[int] = field(default_factory=list) + blocks_revoked: List[int] = field(default_factory=list) + mutes: List[int] = field(default_factory=list) + muted_users: List[int] = field(default_factory=list) + roles: List[int] = field(default_factory=list) + issues: List[int] = field(default_factory=list) + issue_comments: List[int] = field(default_factory=list) + reports: List[int] = field(default_factory=list) + social_links: List[int] = field(default_factory=list) + +@dataclass +class UserBlock: + user: Optional[int] = None + creator: Optional[int] = None + revoker: Optional[int] = None + +@dataclass +class UserMute: + owner: Optional[int] = None + subject: Optional[int] = None + +@dataclass +class UserNotificationPreferences: + pass + +@dataclass +class UserPreference: + user: Optional[int] = None + +@dataclass +class UserRole: + user: Optional[int] = None + granter: Optional[int] = None + +@dataclass +class Way: + CLASS_ID: int = 0x0F02 # canonical concept `osm_way` + changeset: Optional[int] = None + old_ways: List[int] = field(default_factory=list) + way_nodes: List[int] = field(default_factory=list) + nodes: List[int] = field(default_factory=list) + element_tags: List[int] = field(default_factory=list) + containing_relation_members: List[int] = field(default_factory=list) + containing_relations: List[int] = field(default_factory=list) + +@dataclass +class WayNode: + CLASS_ID: int = 0x0F07 # canonical concept `osm_way_node` + way: Optional[int] = None + node: Optional[int] = None + +@dataclass +class WayTag: + CLASS_ID: int = 0x0F05 # canonical concept `osm_element_tag` + way: Optional[int] = None + diff --git a/crates/ogar-render-askama/examples/render_python.rs b/crates/ogar-render-askama/examples/render_python.rs new file mode 100644 index 0000000..0063aa6 --- /dev/null +++ b/crates/ogar-render-askama/examples/render_python.rs @@ -0,0 +1,325 @@ +//! Render the OSM Rails harvest → a **Python import-shape** package — the +//! Python counterpart of `render_osm` (which emits Rust). Same substrate, two +//! back-ends: proves OGAR is a bidirectional per-class transpiler whose emit +//! side is language-pluggable. +//! +//! `cargo run -p ogar-render-askama --example render_python -- ` +//! +//! Emits, under `/osm/`: +//! - `__init__.py` — package marker; re-exports the models + `CLASS_IDS`. +//! - `models.py` — one `@dataclass` per THINK class (associations → typed +//! id fields), each carrying its `CLASS_ID`. +//! - `.py` — the DO arm: one module per container, `def (inp)` +//! free functions (`osm.node.show(inp)`), NOT methods. +//! +//! and, one level up, `ogar_sdk.py` — the thin substrate-pull SDK: the codebook +//! as a dict + `class_id(concept)` / `render_classid(concept, app_prefix)`, the +//! Python mirror of the Rust `lance_graph_contract::ogar_codebook` contract. The +//! same SDK pulls odoo (`0x02`) concepts — the shape is domain-agnostic. +use ogar_vocab::{canonical_concept_id, AssociationKind}; +use std::collections::BTreeMap; +use std::fs; +use std::path::Path; + +/// Rails class name → OGAR canonical concept (Geo domain `0x0FXX`). `None` for +/// app-social entities that aren't canonical geodata concepts. +fn ground(rails: &str) -> Option<&'static str> { + Some(match rails { + "Node" | "OldNode" => "osm_node", + "Way" | "OldWay" => "osm_way", + "Relation" | "OldRelation" => "osm_relation", + "Changeset" => "osm_changeset", + "NodeTag" | "WayTag" | "RelationTag" | "OldNodeTag" | "OldWayTag" + | "OldRelationTag" => "osm_element_tag", + "RelationMember" | "OldRelationMember" => "osm_relation_member", + "WayNode" | "OldWayNode" => "osm_way_node", + "Note" => "osm_note", + "Trace" => "osm_gpx_trace", + "User" => "osm_user", + _ => return None, + }) +} + +/// PascalCase / dotted → snake_case (module / fn / field stem). +fn snake(name: &str) -> String { + let mut out = String::new(); + let mut prev = false; + for c in name.chars() { + if c.is_ascii_alphanumeric() { + if c.is_ascii_uppercase() && prev { + out.push('_'); + } + out.push(c.to_ascii_lowercase()); + prev = c.is_ascii_lowercase() || c.is_ascii_digit(); + } else { + if !out.is_empty() && !out.ends_with('_') { + out.push('_'); + } + prev = false; + } + } + let s = out.trim_matches('_').to_string(); + if s.is_empty() { + "anon".into() + } else { + s + } +} + +/// A safe Python identifier: snake + escape the handful of keywords a container +/// or verb hits + avoid a leading digit. +fn pyify(name: &str) -> String { + let s = snake(name); + const KW: &[&str] = &[ + "False", "None", "True", "and", "as", "assert", "async", "await", "break", "class", + "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", + "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "raise", "return", + "try", "while", "with", "yield", "match", "case", "type", + ]; + if s.is_empty() { + "action".into() + } else if KW.contains(&s.as_str()) { + format!("{s}_") + } else if s.as_bytes()[0].is_ascii_digit() { + format!("_{s}") + } else { + s + } +} + +/// OGAR attribute `type_name` → Python annotation. +fn py_type(type_name: Option<&str>) -> &'static str { + match type_name.unwrap_or("") { + "string" | "str" | "text" => "str", + "u8" | "u16" | "u32" | "u64" | "i8" | "i16" | "i32" | "i64" | "integer" | "int" => "int", + "bool" | "boolean" => "bool", + "f32" | "f64" | "float" | "decimal" => "float", + _ => "Any", + } +} + +fn main() { + let mut args = std::env::args().skip(1); + let src = args + .next() + .unwrap_or_else(|| "/home/user/_src-osm-website".into()); + let out_arg = args.next().unwrap_or_else(|| { + "/home/user/OGAR/.claude/harvest/osm-website-rs/python".into() + }); + let out = Path::new(&out_arg); + let pkg = out.join("osm"); + fs::create_dir_all(&pkg).unwrap(); + + let src_path = Path::new(&src); + let mut classes = ogar_from_rails::extract_with(src_path, "osm"); + if classes.is_empty() { + classes = ogar_from_rails::extract_with(&src_path.join("app/models"), "osm"); + } + classes.sort_by(|a, b| a.name.cmp(&b.name)); + for c in classes.iter_mut() { + if let Some(concept) = ground(&c.name) { + c.canonical_concept = Some(concept.to_string()); + } + } + + // ── models.py — one @dataclass per THINK class ── + let mut models = String::from( + "\"\"\"@generated by ogar-render-askama render_python — ruff → OGAR (THINK arm).\n\ + OSM domain models as dataclasses; associations become typed id fields.\n\"\"\"\n\ + from __future__ import annotations\nfrom dataclasses import dataclass, field\n\ + from typing import Any, List, Optional\n\n", + ); + let mut class_ids: Vec<(String, u16)> = Vec::new(); + for c in &classes { + let cls = c.name.replace("::", "_"); + models.push_str(&format!("@dataclass\nclass {cls}:\n")); + if let Some(concept) = &c.canonical_concept { + if let Some(id) = canonical_concept_id(concept) { + models.push_str(&format!( + " CLASS_ID: int = 0x{id:04X} # canonical concept `{concept}`\n" + )); + class_ids.push((cls.clone(), id)); + } + } + let mut wrote = false; + for a in &c.attributes { + models.push_str(&format!( + " {}: Optional[{}] = None\n", + pyify(&a.name), + py_type(a.type_name.as_deref()) + )); + wrote = true; + } + for a in &c.associations { + let fname = pyify(&a.name); + match a.kind { + AssociationKind::HasMany | AssociationKind::HasAndBelongsToMany => { + models.push_str(&format!( + " {fname}: List[int] = field(default_factory=list)\n" + )); + } + // BelongsTo / HasOne / any future single-target kind → one FK id. + _ => { + models.push_str(&format!(" {fname}: Optional[int] = None\n")); + } + } + wrote = true; + } + if !wrote { + models.push_str(" pass\n"); + } + models.push('\n'); + } + fs::write(pkg.join("models.py"), &models).unwrap(); + + // ── DO arm: a faithful osm/controllers/ subpackage — one module per source + // controller by its own verbatim name (`osm.controllers.nodes.show(inp)`), + // re-exported at `osm.` for the ergonomic surface. Mirrors the Rust + // `controllers` module + `pub use controllers::*`. No singularisation. ── + let ctrl = pkg.join("controllers"); + fs::create_dir_all(&ctrl).unwrap(); + let rail_root: &Path = if src_path.join("app/controllers").is_dir() { + src_path + } else if src_path.ends_with("app/models") { + src_path.parent().and_then(|p| p.parent()).unwrap_or(src_path) + } else { + src_path + }; + let rail = ogar_from_rails::extract_action_rail(rail_root, "osm"); + let mut tree: BTreeMap>> = BTreeMap::new(); + for r in &rail { + tree.entry(r.part_of.clone()) + .or_default() + .entry(r.is_a.clone()) + .or_default() + .push((r.controller.clone(), r.action.clone())); + } + let mut containers: Vec = Vec::new(); + let mut fn_count = 0usize; + for (part_of, isas) in &tree { + let module = pyify(part_of); + let mut body = format!( + "\"\"\"@generated DO arm — faithful mirror of the `{part_of}` controller.\n\ + `osm.controllers.{module}.(inp)` free functions (re-exported as\n\ + `osm.{module}`); standalone, not methods on the model. Call:\n\ + `osm.controllers.{module}.show(inp)`.\n\"\"\"\n\ + from typing import Any\n\n\ + Input = dict # the Rails params bag; typed params are the next ruff brick\n\ + Output = Any\n\n", + ); + let mut seen = std::collections::HashSet::new(); + for (is_a, sources) in isas { + let fname = pyify(is_a); + if !seen.insert(fname.clone()) { + continue; + } + let mut srcs: Vec = + sources.iter().map(|(c, a)| format!("{c}#{a}")).collect(); + srcs.sort(); + srcs.dedup(); + let cite = if srcs.len() == 1 { + format!("Source: {}", srcs[0]) + } else { + format!("Sources (canonical tile): {}", srcs.join(", ")) + }; + body.push_str(&format!( + "def {fname}(inp: Input) -> Output:\n \ + \"\"\"`{part_of}:{is_a}` — DO arm. {cite}.\"\"\"\n \ + raise NotImplementedError(\"port {}\")\n\n", + srcs[0] + )); + fn_count += 1; + } + fs::write(ctrl.join(format!("{module}.py")), &body).unwrap(); + containers.push(module); + } + containers.sort(); + containers.dedup(); + + // osm/controllers/__init__.py — the subpackage; re-imports each controller. + let mut ctrl_init = String::from( + "\"\"\"@generated `controllers` subpackage — faithful 1:1 mirror of\n\ + `app/controllers/`, each module named by its controller (verbatim).\n\"\"\"\n", + ); + for m in &containers { + ctrl_init.push_str(&format!("from . import {m} as {m}\n")); + } + fs::write(ctrl.join("__init__.py"), &ctrl_init).unwrap(); + + // ── osm/__init__.py — package re-exports + CLASS_IDS ── + // Re-export each controller at the package root (the ergonomic surface over + // the faithful `controllers` subpackage — `osm.nodes` ≡ `osm.controllers.nodes`). + let mut init = String::from( + "\"\"\"@generated OSM package (ruff → OGAR, Python import shape).\n\ + Models: `from osm.models import Node`.\n\ + DO arm (faithful): `osm.controllers.nodes.show(inp)`.\n\ + DO arm (re-exported): `osm.nodes.show(inp)`.\n\"\"\"\n\ + from . import models as models\n\ + from . import controllers as controllers\n", + ); + for m in &containers { + init.push_str(&format!("from .controllers import {m} as {m}\n")); + } + init.push_str("\nCLASS_IDS = {\n"); + for (cls, id) in &class_ids { + init.push_str(&format!(" \"{cls}\": 0x{id:04X},\n")); + } + init.push_str("}\n"); + fs::write(pkg.join("__init__.py"), &init).unwrap(); + + // ── ogar_sdk.py — the substrate-pull SDK (domain-agnostic) ── + // The codebook subset the SDK ships is domain-agnostic: OSM (0x0F) here, + // plus a couple odoo/commerce (0x02) concepts to show cross-app pull. + let sdk = r#""""ogar_sdk — thin Python client over the OGAR codebook substrate. + +The Python mirror of Rust `lance_graph_contract::ogar_codebook`: pull a concept's +stable classid, or compose a render-classid with an app prefix. Domain-agnostic — +OSM (0x0F) and odoo/commerce (0x02) pull identically. + + >>> from ogar_sdk import class_id, render_classid + >>> class_id("osm_node") + 3841 + >>> hex(render_classid("account_move", 0x0002)) # odoo, canon-high + '0x2020002' +""" +from typing import Optional + +# The pulled substrate — a subset of ogar-vocab's CODEBOOK (concept -> u16 id). +CODEBOOK = { + # 0x0F — Geo (OpenStreetMap) + "osm_node": 0x0F01, "osm_way": 0x0F02, "osm_relation": 0x0F03, + "osm_changeset": 0x0F04, "osm_element_tag": 0x0F05, "osm_relation_member": 0x0F06, + "osm_way_node": 0x0F07, "osm_note": 0x0F08, "osm_gpx_trace": 0x0F09, "osm_user": 0x0F0A, + # 0x02 — Commerce (odoo / ERP) — same pull, different domain + "commercial_document": 0x0202, "product": 0x0207, "accounting_account": 0x0208, +} +# Convenience alias used in the odoo docstring example. +CODEBOOK["account_move"] = CODEBOOK["commercial_document"] + + +def class_id(concept: str) -> Optional[int]: + """Resolve a canonical-concept string to its stable u16 codebook id.""" + return CODEBOOK.get(concept) + + +def render_classid(concept: str, app_prefix: int) -> Optional[int]: + """Compose a 32-bit render classid: canon (concept) HIGH, custom (prefix) LOW. + + Mirrors the post-2026-07-02 canon-high flip: `(concept << 16) | prefix`. + """ + cid = class_id(concept) + if cid is None: + return None + return (cid << 16) | (app_prefix & 0xFFFF) +"#; + fs::write(out.join("ogar_sdk.py"), sdk).unwrap(); + + println!( + "rendered Python: {} models ({} with CLASS_ID) + DO arm {fn_count} fns across {} \ + modules; SDK ogar_sdk.py -> {}", + classes.len(), + class_ids.len(), + containers.len(), + out.display() + ); +}