acts_as_calculator_editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +107 -0
  4. data/Rakefile +8 -0
  5. data/app/assets/javascripts/acts_as_calculator_editor/application.js +26 -0
  6. data/app/assets/javascripts/acts_as_calculator_editor/dentaku_tokenizer.js +139 -0
  7. data/app/assets/javascripts/acts_as_calculator_editor/expression_editor_controller.js +380 -0
  8. data/app/assets/javascripts/acts_as_calculator_editor/list_filter_controller.js +39 -0
  9. data/app/assets/javascripts/acts_as_calculator_editor/template_editor_controller.js +86 -0
  10. data/app/assets/stylesheets/acts_as_calculator_editor/application.css +2 -0
  11. data/app/controllers/acts_as_calculator_editor/application_controller.rb +115 -0
  12. data/app/controllers/acts_as_calculator_editor/exports_controller.rb +41 -0
  13. data/app/controllers/acts_as_calculator_editor/formula_versions_controller.rb +128 -0
  14. data/app/controllers/acts_as_calculator_editor/formulas_controller.rb +94 -0
  15. data/app/controllers/acts_as_calculator_editor/lookup_tables_controller.rb +112 -0
  16. data/app/controllers/acts_as_calculator_editor/templates_controller.rb +130 -0
  17. data/app/controllers/acts_as_calculator_editor/validations_controller.rb +23 -0
  18. data/app/helpers/acts_as_calculator_editor/application_helper.rb +85 -0
  19. data/app/jobs/acts_as_calculator_editor/application_job.rb +6 -0
  20. data/app/mailers/acts_as_calculator_editor/application_mailer.rb +8 -0
  21. data/app/models/acts_as_calculator_editor/application_record.rb +7 -0
  22. data/app/views/acts_as_calculator_editor/formula_versions/_expression_field.html.erb +64 -0
  23. data/app/views/acts_as_calculator_editor/formula_versions/_variable_fields.html.erb +51 -0
  24. data/app/views/acts_as_calculator_editor/formula_versions/index.html.erb +45 -0
  25. data/app/views/acts_as_calculator_editor/formula_versions/new.html.erb +80 -0
  26. data/app/views/acts_as_calculator_editor/formula_versions/show.html.erb +75 -0
  27. data/app/views/acts_as_calculator_editor/formulas/_form.html.erb +23 -0
  28. data/app/views/acts_as_calculator_editor/formulas/edit.html.erb +11 -0
  29. data/app/views/acts_as_calculator_editor/formulas/index.html.erb +71 -0
  30. data/app/views/acts_as_calculator_editor/formulas/new.html.erb +10 -0
  31. data/app/views/acts_as_calculator_editor/formulas/show.html.erb +72 -0
  32. data/app/views/acts_as_calculator_editor/lookup_tables/_entry_fields.html.erb +24 -0
  33. data/app/views/acts_as_calculator_editor/lookup_tables/_form.html.erb +47 -0
  34. data/app/views/acts_as_calculator_editor/lookup_tables/edit.html.erb +12 -0
  35. data/app/views/acts_as_calculator_editor/lookup_tables/index.html.erb +67 -0
  36. data/app/views/acts_as_calculator_editor/lookup_tables/new.html.erb +11 -0
  37. data/app/views/acts_as_calculator_editor/lookup_tables/show.html.erb +71 -0
  38. data/app/views/acts_as_calculator_editor/shared/_error_message.html.erb +12 -0
  39. data/app/views/acts_as_calculator_editor/shared/_export_panel.html.erb +52 -0
  40. data/app/views/acts_as_calculator_editor/shared/_flash.html.erb +8 -0
  41. data/app/views/acts_as_calculator_editor/shared/_page_header.html.erb +16 -0
  42. data/app/views/acts_as_calculator_editor/shared/error.html.erb +11 -0
  43. data/app/views/acts_as_calculator_editor/templates/_form.html.erb +124 -0
  44. data/app/views/acts_as_calculator_editor/templates/_lexxy_toolbar.html.erb +101 -0
  45. data/app/views/acts_as_calculator_editor/templates/index.html.erb +83 -0
  46. data/app/views/acts_as_calculator_editor/templates/new.html.erb +13 -0
  47. data/app/views/acts_as_calculator_editor/templates/preview.html.erb +29 -0
  48. data/app/views/acts_as_calculator_editor/templates/show.html.erb +111 -0
  49. data/app/views/layouts/acts_as_calculator_editor/application.html.erb +52 -0
  50. data/config/importmap.rb +13 -0
  51. data/config/routes.rb +46 -0
  52. data/lib/acts_as_calculator_editor/build_export_document.rb +37 -0
  53. data/lib/acts_as_calculator_editor/build_sample_result.rb +26 -0
  54. data/lib/acts_as_calculator_editor/cast_entry_rows.rb +52 -0
  55. data/lib/acts_as_calculator_editor/cast_export_decimal.rb +19 -0
  56. data/lib/acts_as_calculator_editor/cast_variable_rows.rb +90 -0
  57. data/lib/acts_as_calculator_editor/delete_lookup_table.rb +54 -0
  58. data/lib/acts_as_calculator_editor/engine.rb +32 -0
  59. data/lib/acts_as_calculator_editor/export_formulas.rb +89 -0
  60. data/lib/acts_as_calculator_editor/export_lookup_tables.rb +49 -0
  61. data/lib/acts_as_calculator_editor/export_owner_reference.rb +18 -0
  62. data/lib/acts_as_calculator_editor/export_templates.rb +51 -0
  63. data/lib/acts_as_calculator_editor/publish_lookup_table.rb +53 -0
  64. data/lib/acts_as_calculator_editor/render_template_preview.rb +60 -0
  65. data/lib/acts_as_calculator_editor/validate_expression.rb +127 -0
  66. data/lib/acts_as_calculator_editor/version.rb +5 -0
  67. data/lib/acts_as_calculator_editor.rb +76 -0
  68. data/lib/tasks/acts_as_calculator_editor_tasks.rake +6 -0
  69. metadata +248 -0
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ require "active_support"
6
+ require "active_support/core_ext/date/calculations"
7
+ require "active_support/core_ext/module/attribute_accessors"
8
+ require "active_support/core_ext/object/blank"
9
+
10
+ require "acts_as_calculator"
11
+
12
+ # Lexxy's engine touches Action Text unconditionally, so the railtie has to be loaded
13
+ # before it — and a gemspec dependency does not do that. `spec.add_dependency "actiontext"`
14
+ # only guarantees the gem is resolved and on the load path; `ActionText::TagHelper` is
15
+ # defined by `action_text/engine`, which nothing requires unless the host writes
16
+ # `require "rails/all"` or names the railtie itself. A host that hand-picks railties (the
17
+ # normal thing for an app that does not use every framework — our own spec/dummy does it)
18
+ # would boot straight into `NameError: uninitialized constant ActionText::TagHelper` from
19
+ # lexxy's `to_prepare` block. Verified by booting without this line.
20
+ #
21
+ # This holds on both Lexxy code paths: the Rails 8.0/8.1 fallback prepends onto
22
+ # `ActionText::TagHelper`, and the newer adapter path configures
23
+ # `config.action_text.editors`. `lexxy.attachable` references `ActionText::Attachable`
24
+ # either way. Requiring the engine also pulls `ActiveStorage::Engine` transitively — that
25
+ # is Action Text's own dependency, not something this gem asks for: no ActiveStorage route
26
+ # needs mounting for `lexxy_rich_text_area_tag` (docs/lexxy-decision.md §1).
27
+ require "action_text/engine"
28
+
29
+ # Must be required here, not left to the host. `lexxy` is a runtime dependency in our
30
+ # gemspec, but Bundler.require only requires gems listed at the top level of the host's
31
+ # Gemfile — a transitive dependency is resolved and put on the load path, never required.
32
+ # Without this line `Lexxy::Engine` is never defined, so Propshaft's per-engine
33
+ # "propshaft.append_assets_path" initializer never sweeps lexxy's `app/assets`, and
34
+ # `pin "lexxy"` fails at render time with "Importmap skipped missing path: lexxy.js" —
35
+ # a warning in the log, a silently editor-less page in the browser.
36
+ # Same reasoning as the `require "acts_as_calculator"` above it.
37
+ require "lexxy"
38
+
39
+ require_relative "acts_as_calculator_editor/version"
40
+ require_relative "acts_as_calculator_editor/engine"
41
+
42
+ # Plain requires rather than Zeitwerk, matching the core gem: these are the engine's own
43
+ # Decrees and they live in lib/, which an engine does not autoload.
44
+ require_relative "acts_as_calculator_editor/cast_entry_rows"
45
+ require_relative "acts_as_calculator_editor/cast_export_decimal"
46
+ require_relative "acts_as_calculator_editor/cast_variable_rows"
47
+ require_relative "acts_as_calculator_editor/export_owner_reference"
48
+ require_relative "acts_as_calculator_editor/export_lookup_tables"
49
+ require_relative "acts_as_calculator_editor/export_formulas"
50
+ require_relative "acts_as_calculator_editor/export_templates"
51
+ require_relative "acts_as_calculator_editor/build_export_document"
52
+ require_relative "acts_as_calculator_editor/build_sample_result"
53
+ require_relative "acts_as_calculator_editor/render_template_preview"
54
+ require_relative "acts_as_calculator_editor/publish_lookup_table"
55
+ require_relative "acts_as_calculator_editor/delete_lookup_table"
56
+ require_relative "acts_as_calculator_editor/validate_expression"
57
+
58
+ module ActsAsCalculatorEditor
59
+ # Extension point for owner-scoped authoring, deliberately empty in v1.
60
+ #
61
+ # Every `calculator_*` identity is `[key, scope, owner]`, but there is no way to enumerate
62
+ # a host application's valid owner classes from inside this gem, and a free-text
63
+ # `owner_type` field is worse than none — `ResolveImportOwner` will refuse anything that
64
+ # is not an ActiveRecord model, and re-owning a formula silently re-targets every future
65
+ # calculation of that key (docs/core-gem-contract.md §2.7). So the forms author global
66
+ # (nil-owner) rows only.
67
+ #
68
+ # A host that wants owner selection sets this to the classes it will offer:
69
+ #
70
+ # ActsAsCalculatorEditor.owner_classes = [Company, Region]
71
+ #
72
+ # and the Frontend Engineer's forms render a select over them. The Decrees underneath
73
+ # (`PublishLookupTable`, `ValidateExpression`, the exporters) already take and honour an
74
+ # `owner:`, so nothing below the view layer has to change.
75
+ mattr_accessor :owner_classes, default: []
76
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # desc "Explaining what the task does"
4
+ # task :acts_as_calculator_editor do
5
+ # # Task goes here
6
+ # end
metadata ADDED
@@ -0,0 +1,248 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_calculator_editor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - lautarograc
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-08-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: acts_as_calculator
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: lexxy
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: actionpack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '8.0'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '9'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '8.0'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '9'
61
+ - !ruby/object:Gem::Dependency
62
+ name: actiontext
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '8.0'
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: '9'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '8.0'
78
+ - - "<"
79
+ - !ruby/object:Gem::Version
80
+ version: '9'
81
+ - !ruby/object:Gem::Dependency
82
+ name: activerecord
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '8.0'
88
+ - - "<"
89
+ - !ruby/object:Gem::Version
90
+ version: '9'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '8.0'
98
+ - - "<"
99
+ - !ruby/object:Gem::Version
100
+ version: '9'
101
+ - !ruby/object:Gem::Dependency
102
+ name: activesupport
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '8.0'
108
+ - - "<"
109
+ - !ruby/object:Gem::Version
110
+ version: '9'
111
+ type: :runtime
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '8.0'
118
+ - - "<"
119
+ - !ruby/object:Gem::Version
120
+ version: '9'
121
+ - !ruby/object:Gem::Dependency
122
+ name: railties
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '8.0'
128
+ - - "<"
129
+ - !ruby/object:Gem::Version
130
+ version: '9'
131
+ type: :runtime
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '8.0'
138
+ - - "<"
139
+ - !ruby/object:Gem::Version
140
+ version: '9'
141
+ description: A mountable Rails engine providing a Hotwire/Lexxy rich text editor,
142
+ CRUD, validation preview, and JSON export for acts_as_calculator formulas and templates.
143
+ Writes exclusively through acts_as_calculator's own service objects, in-process,
144
+ rather than duplicating its persistence or calculation logic — so the host need
145
+ not enable the core gem's HTTP API.
146
+ email:
147
+ - lautarograciani2106@gmail.com
148
+ executables: []
149
+ extensions: []
150
+ extra_rdoc_files: []
151
+ files:
152
+ - MIT-LICENSE
153
+ - README.md
154
+ - Rakefile
155
+ - app/assets/javascripts/acts_as_calculator_editor/application.js
156
+ - app/assets/javascripts/acts_as_calculator_editor/dentaku_tokenizer.js
157
+ - app/assets/javascripts/acts_as_calculator_editor/expression_editor_controller.js
158
+ - app/assets/javascripts/acts_as_calculator_editor/list_filter_controller.js
159
+ - app/assets/javascripts/acts_as_calculator_editor/template_editor_controller.js
160
+ - app/assets/stylesheets/acts_as_calculator_editor/application.css
161
+ - app/controllers/acts_as_calculator_editor/application_controller.rb
162
+ - app/controllers/acts_as_calculator_editor/exports_controller.rb
163
+ - app/controllers/acts_as_calculator_editor/formula_versions_controller.rb
164
+ - app/controllers/acts_as_calculator_editor/formulas_controller.rb
165
+ - app/controllers/acts_as_calculator_editor/lookup_tables_controller.rb
166
+ - app/controllers/acts_as_calculator_editor/templates_controller.rb
167
+ - app/controllers/acts_as_calculator_editor/validations_controller.rb
168
+ - app/helpers/acts_as_calculator_editor/application_helper.rb
169
+ - app/jobs/acts_as_calculator_editor/application_job.rb
170
+ - app/mailers/acts_as_calculator_editor/application_mailer.rb
171
+ - app/models/acts_as_calculator_editor/application_record.rb
172
+ - app/views/acts_as_calculator_editor/formula_versions/_expression_field.html.erb
173
+ - app/views/acts_as_calculator_editor/formula_versions/_variable_fields.html.erb
174
+ - app/views/acts_as_calculator_editor/formula_versions/index.html.erb
175
+ - app/views/acts_as_calculator_editor/formula_versions/new.html.erb
176
+ - app/views/acts_as_calculator_editor/formula_versions/show.html.erb
177
+ - app/views/acts_as_calculator_editor/formulas/_form.html.erb
178
+ - app/views/acts_as_calculator_editor/formulas/edit.html.erb
179
+ - app/views/acts_as_calculator_editor/formulas/index.html.erb
180
+ - app/views/acts_as_calculator_editor/formulas/new.html.erb
181
+ - app/views/acts_as_calculator_editor/formulas/show.html.erb
182
+ - app/views/acts_as_calculator_editor/lookup_tables/_entry_fields.html.erb
183
+ - app/views/acts_as_calculator_editor/lookup_tables/_form.html.erb
184
+ - app/views/acts_as_calculator_editor/lookup_tables/edit.html.erb
185
+ - app/views/acts_as_calculator_editor/lookup_tables/index.html.erb
186
+ - app/views/acts_as_calculator_editor/lookup_tables/new.html.erb
187
+ - app/views/acts_as_calculator_editor/lookup_tables/show.html.erb
188
+ - app/views/acts_as_calculator_editor/shared/_error_message.html.erb
189
+ - app/views/acts_as_calculator_editor/shared/_export_panel.html.erb
190
+ - app/views/acts_as_calculator_editor/shared/_flash.html.erb
191
+ - app/views/acts_as_calculator_editor/shared/_page_header.html.erb
192
+ - app/views/acts_as_calculator_editor/shared/error.html.erb
193
+ - app/views/acts_as_calculator_editor/templates/_form.html.erb
194
+ - app/views/acts_as_calculator_editor/templates/_lexxy_toolbar.html.erb
195
+ - app/views/acts_as_calculator_editor/templates/index.html.erb
196
+ - app/views/acts_as_calculator_editor/templates/new.html.erb
197
+ - app/views/acts_as_calculator_editor/templates/preview.html.erb
198
+ - app/views/acts_as_calculator_editor/templates/show.html.erb
199
+ - app/views/layouts/acts_as_calculator_editor/application.html.erb
200
+ - config/importmap.rb
201
+ - config/routes.rb
202
+ - lib/acts_as_calculator_editor.rb
203
+ - lib/acts_as_calculator_editor/build_export_document.rb
204
+ - lib/acts_as_calculator_editor/build_sample_result.rb
205
+ - lib/acts_as_calculator_editor/cast_entry_rows.rb
206
+ - lib/acts_as_calculator_editor/cast_export_decimal.rb
207
+ - lib/acts_as_calculator_editor/cast_variable_rows.rb
208
+ - lib/acts_as_calculator_editor/delete_lookup_table.rb
209
+ - lib/acts_as_calculator_editor/engine.rb
210
+ - lib/acts_as_calculator_editor/export_formulas.rb
211
+ - lib/acts_as_calculator_editor/export_lookup_tables.rb
212
+ - lib/acts_as_calculator_editor/export_owner_reference.rb
213
+ - lib/acts_as_calculator_editor/export_templates.rb
214
+ - lib/acts_as_calculator_editor/publish_lookup_table.rb
215
+ - lib/acts_as_calculator_editor/render_template_preview.rb
216
+ - lib/acts_as_calculator_editor/validate_expression.rb
217
+ - lib/acts_as_calculator_editor/version.rb
218
+ - lib/tasks/acts_as_calculator_editor_tasks.rake
219
+ homepage: https://github.com/lautarograc/acts_as_calculator_editor
220
+ licenses:
221
+ - MIT
222
+ metadata:
223
+ rubygems_mfa_required: 'true'
224
+ homepage_uri: https://github.com/lautarograc/acts_as_calculator_editor
225
+ source_code_uri: https://github.com/lautarograc/acts_as_calculator_editor
226
+ changelog_uri: https://github.com/lautarograc/acts_as_calculator_editor/blob/main/CHANGELOG.md
227
+ bug_tracker_uri: https://github.com/lautarograc/acts_as_calculator_editor/issues
228
+ post_install_message:
229
+ rdoc_options: []
230
+ require_paths:
231
+ - lib
232
+ required_ruby_version: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - ">="
235
+ - !ruby/object:Gem::Version
236
+ version: 3.2.0
237
+ required_rubygems_version: !ruby/object:Gem::Requirement
238
+ requirements:
239
+ - - ">="
240
+ - !ruby/object:Gem::Version
241
+ version: '0'
242
+ requirements: []
243
+ rubygems_version: 3.5.16
244
+ signing_key:
245
+ specification_version: 4
246
+ summary: Hotwire UI (Lexxy editor) and CRUD for authoring acts_as_calculator formulas
247
+ and templates.
248
+ test_files: []