dami 1.0.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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +306 -0
  3. data/LICENSE +21 -0
  4. data/README.md +106 -0
  5. data/bin/dami +10 -0
  6. data/docs/01.Getting_Started.md +220 -0
  7. data/docs/02.Models_and_Fields.md +244 -0
  8. data/docs/03.Querying.md +387 -0
  9. data/docs/04.Creating_Updating_Deleting.md +226 -0
  10. data/docs/05.Validation.md +259 -0
  11. data/docs/06.Protection.md +160 -0
  12. data/docs/07.Associations.md +239 -0
  13. data/docs/08.Scopes.md +99 -0
  14. data/docs/09.Migrations.md +165 -0
  15. data/docs/10.Flows_and_Commands.md +181 -0
  16. data/docs/11.Localization.md +435 -0
  17. data/docs/12.TheDamiWay.md +227 -0
  18. data/docs/Manifesto.md +305 -0
  19. data/docs/site.md +477 -0
  20. data/lib/dami/actions/command.rb +80 -0
  21. data/lib/dami/actions/context.rb +63 -0
  22. data/lib/dami/actions/draft.rb +36 -0
  23. data/lib/dami/actions/flow.rb +42 -0
  24. data/lib/dami/adapters/base.rb +40 -0
  25. data/lib/dami/adapters/sqlite/connection.rb +122 -0
  26. data/lib/dami/adapters/sqlite/core.rb +17 -0
  27. data/lib/dami/adapters/sqlite/query.rb +353 -0
  28. data/lib/dami/adapters/sqlite/schema.rb +135 -0
  29. data/lib/dami/cli.rb +117 -0
  30. data/lib/dami/configuration.rb +246 -0
  31. data/lib/dami/core.rb +98 -0
  32. data/lib/dami/dsl_guardrails.rb +45 -0
  33. data/lib/dami/errors.rb +89 -0
  34. data/lib/dami/inflector.rb +245 -0
  35. data/lib/dami/localization.rb +131 -0
  36. data/lib/dami/migration.rb +84 -0
  37. data/lib/dami/migrator.rb +105 -0
  38. data/lib/dami/plugins/associations.rb +284 -0
  39. data/lib/dami/plugins/nested_attributes.rb +180 -0
  40. data/lib/dami/plugins/protection.rb +30 -0
  41. data/lib/dami/plugins/validations.rb +90 -0
  42. data/lib/dami/query/builder.rb +132 -0
  43. data/lib/dami/query/enumerable.rb +62 -0
  44. data/lib/dami/query/persistence.rb +133 -0
  45. data/lib/dami/record_proxy.rb +32 -0
  46. data/lib/dami/result.rb +27 -0
  47. data/lib/dami/schema/diff.rb +84 -0
  48. data/lib/dami/schema/dumper.rb +60 -0
  49. data/lib/dami/schema/generator.rb +69 -0
  50. data/lib/dami/schema/introspector.rb +34 -0
  51. data/lib/dami/schema/loader.rb +58 -0
  52. data/lib/dami/schema.rb +13 -0
  53. data/lib/dami/validation_rules.rb +72 -0
  54. data/lib/dami/version.rb +3 -0
  55. data/lib/dami.rb +32 -0
  56. metadata +218 -0
@@ -0,0 +1,13 @@
1
+ require_relative 'schema/dumper'
2
+ require_relative 'schema/loader'
3
+ require_relative 'schema/introspector'
4
+ require_relative 'schema/diff'
5
+ require_relative 'schema/generator'
6
+
7
+ module Dami
8
+ # This method provides the DSL context for db/schema.rb
9
+ def self.define_schema(&block)
10
+ # This is intentionally a placeholder. The Schema::Loader will provide
11
+ # the actual implementation when it loads the schema file.
12
+ end
13
+ end
@@ -0,0 +1,72 @@
1
+ # File: lib/dami/validation_rules.rb
2
+
3
+ module Dami
4
+ # Numeric coercion used by the min/max rules: accepts Integer, Float, numeric
5
+ # strings ("12.50"); returns nil for anything else so decimals are compared
6
+ # as decimals instead of being truncated by to_i.
7
+ def self.numeric(value)
8
+ return value if value.is_a?(Numeric)
9
+ Float(value.to_s)
10
+ rescue ArgumentError, TypeError
11
+ nil
12
+ end
13
+
14
+ # This method now handles both registering the rule logic AND their default messages.
15
+ def self.register_default_rules!(registry: :default)
16
+ # Register the validation rule checks
17
+ rules(registry, {
18
+ required: { check: ->(v) { !v.nil? && !v.to_s.strip.empty? } },
19
+ presence: { check: ->(v) { !v.nil? && !v.to_s.strip.empty? } },
20
+ email: { check: ->(v) { v.to_s =~ /\A[^@\s]+@[^@\s]+\z/ } },
21
+ inclusion: ->(vals) { { check: ->(v) { vals.include?(v) } } },
22
+ format: ->(pattern) { { check: ->(v) { v.nil? || v.to_s.match?(pattern) } } },
23
+ min_length: ->(min) { { check: ->(v) { v.to_s.length >= min } } },
24
+ max_length: ->(max) { { check: ->(v) { v.to_s.length <= max } } },
25
+ min: ->(min) { { check: ->(v) { (n = Dami.numeric(v)) && n >= min } } },
26
+ max: ->(max) { { check: ->(v) { (n = Dami.numeric(v)) && n <= max } } }
27
+ })
28
+
29
+ # Register default messages in the translation system
30
+ Dami.localize :validations do
31
+ en do
32
+ set :required, "is required"
33
+ set :presence, "is required"
34
+ set :email, "must be valid email"
35
+ set :inclusion, "is not in the list of accepted values"
36
+ set :format, "has invalid format"
37
+ set :min_length, ->(min) { "must be at least #{min} characters" }
38
+ set :max_length, ->(max) { "must be at most #{max} characters" }
39
+ set :min, ->(min) { "must be at least #{min}" }
40
+ set :max, ->(max) { "must be at most #{max}" }
41
+ end
42
+ end
43
+
44
+ # Keep @rule_messages for backwards compatibility
45
+ @rule_messages ||= {}
46
+ @rule_messages[registry] = {
47
+ required: "is required",
48
+ presence: "is required",
49
+ email: "must be valid email",
50
+ inclusion: "is not in the list of accepted values",
51
+ format: "has invalid format",
52
+ min_length: ->(min) { "must be at least #{min} characters" },
53
+ max_length: ->(max) { "must be at most #{max} characters" },
54
+ min: ->(min) { "must be at least #{min}" },
55
+ max: ->(max) { "must be at most #{max}" }
56
+ }
57
+ end
58
+
59
+ def self.override_messages(registry, messages)
60
+ # Override in both systems
61
+ @rule_messages ||= {}
62
+ @rule_messages[registry] ||= {}
63
+ @rule_messages[registry].merge!(messages)
64
+
65
+ # Also override in translation system
66
+ Dami.localize :validations do
67
+ en do
68
+ messages.each { |key, value| set key, value }
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,3 @@
1
+ module Dami
2
+ VERSION = "1.0.0"
3
+ end
data/lib/dami.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ require_relative "dami/version"
3
+ require_relative "dami/inflector"
4
+ require_relative "dami/localization"
5
+ require_relative "dami/actions/draft"
6
+ require_relative "dami/actions/command"
7
+ require_relative "dami/actions/flow"
8
+ require_relative "dami/actions/context"
9
+ require_relative "dami/dsl_guardrails"
10
+ require_relative "dami/errors"
11
+ require_relative "dami/result"
12
+ require_relative "dami/plugins/associations"
13
+ require_relative "dami/plugins/nested_attributes"
14
+ require_relative "dami/plugins/validations"
15
+ require_relative "dami/plugins/protection"
16
+ require_relative "dami/record_proxy"
17
+ require_relative "dami/adapters/base"
18
+ require_relative "dami/adapters/sqlite/core"
19
+ require_relative "dami/migration"
20
+ require_relative "dami/migrator"
21
+ require_relative "dami/schema"
22
+ require_relative "dami/configuration"
23
+ require_relative "dami/validation_rules"
24
+ require_relative "dami/query/builder"
25
+ require_relative "dami/core"
26
+
27
+ module Dami
28
+ plugin Plugins::Validations
29
+ plugin Plugins::Associations
30
+ plugin Plugins::Protection
31
+ plugin Plugins::NestedAttributes
32
+ end
metadata ADDED
@@ -0,0 +1,218 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dami
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Steven Garcia
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: thor
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.2'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.2'
26
+ - !ruby/object:Gem::Dependency
27
+ name: connection_pool
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.4'
33
+ - - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: '4'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '2.4'
43
+ - - "<"
44
+ - !ruby/object:Gem::Version
45
+ version: '4'
46
+ - !ruby/object:Gem::Dependency
47
+ name: sqlite3
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '2.0'
53
+ type: :runtime
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.0'
60
+ - !ruby/object:Gem::Dependency
61
+ name: minitest
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '5.16'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '5.16'
74
+ - !ruby/object:Gem::Dependency
75
+ name: minitest-reporters
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '1.6'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '1.6'
88
+ - !ruby/object:Gem::Dependency
89
+ name: rake
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '13.0'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '13.0'
102
+ - !ruby/object:Gem::Dependency
103
+ name: benchmark-ips
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '2.8'
109
+ type: :development
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '2.8'
116
+ - !ruby/object:Gem::Dependency
117
+ name: ruby-prof
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '1.6'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '1.6'
130
+ description: Dami is a modern, minimal ORM focusing on a clean query DSL, explicit
131
+ data validation, and secure attribute protection.
132
+ email:
133
+ - stevendgarcia@gmail.com
134
+ executables:
135
+ - dami
136
+ extensions: []
137
+ extra_rdoc_files: []
138
+ files:
139
+ - CHANGELOG.md
140
+ - LICENSE
141
+ - README.md
142
+ - bin/dami
143
+ - docs/01.Getting_Started.md
144
+ - docs/02.Models_and_Fields.md
145
+ - docs/03.Querying.md
146
+ - docs/04.Creating_Updating_Deleting.md
147
+ - docs/05.Validation.md
148
+ - docs/06.Protection.md
149
+ - docs/07.Associations.md
150
+ - docs/08.Scopes.md
151
+ - docs/09.Migrations.md
152
+ - docs/10.Flows_and_Commands.md
153
+ - docs/11.Localization.md
154
+ - docs/12.TheDamiWay.md
155
+ - docs/Manifesto.md
156
+ - docs/site.md
157
+ - lib/dami.rb
158
+ - lib/dami/actions/command.rb
159
+ - lib/dami/actions/context.rb
160
+ - lib/dami/actions/draft.rb
161
+ - lib/dami/actions/flow.rb
162
+ - lib/dami/adapters/base.rb
163
+ - lib/dami/adapters/sqlite/connection.rb
164
+ - lib/dami/adapters/sqlite/core.rb
165
+ - lib/dami/adapters/sqlite/query.rb
166
+ - lib/dami/adapters/sqlite/schema.rb
167
+ - lib/dami/cli.rb
168
+ - lib/dami/configuration.rb
169
+ - lib/dami/core.rb
170
+ - lib/dami/dsl_guardrails.rb
171
+ - lib/dami/errors.rb
172
+ - lib/dami/inflector.rb
173
+ - lib/dami/localization.rb
174
+ - lib/dami/migration.rb
175
+ - lib/dami/migrator.rb
176
+ - lib/dami/plugins/associations.rb
177
+ - lib/dami/plugins/nested_attributes.rb
178
+ - lib/dami/plugins/protection.rb
179
+ - lib/dami/plugins/validations.rb
180
+ - lib/dami/query/builder.rb
181
+ - lib/dami/query/enumerable.rb
182
+ - lib/dami/query/persistence.rb
183
+ - lib/dami/record_proxy.rb
184
+ - lib/dami/result.rb
185
+ - lib/dami/schema.rb
186
+ - lib/dami/schema/diff.rb
187
+ - lib/dami/schema/dumper.rb
188
+ - lib/dami/schema/generator.rb
189
+ - lib/dami/schema/introspector.rb
190
+ - lib/dami/schema/loader.rb
191
+ - lib/dami/validation_rules.rb
192
+ - lib/dami/version.rb
193
+ homepage: https://github.com/activestylus/dami
194
+ licenses:
195
+ - MIT
196
+ metadata:
197
+ source_code_uri: https://github.com/activestylus/dami
198
+ changelog_uri: https://github.com/activestylus/dami/blob/main/CHANGELOG.md
199
+ documentation_uri: https://github.com/activestylus/dami/tree/main/docs
200
+ rubygems_mfa_required: 'true'
201
+ rdoc_options: []
202
+ require_paths:
203
+ - lib
204
+ required_ruby_version: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '3.0'
209
+ required_rubygems_version: !ruby/object:Gem::Requirement
210
+ requirements:
211
+ - - ">="
212
+ - !ruby/object:Gem::Version
213
+ version: '0'
214
+ requirements: []
215
+ rubygems_version: 4.0.17
216
+ specification_version: 4
217
+ summary: A lightweight, policy oriented ORM for Ruby.
218
+ test_files: []