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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +306 -0
- data/LICENSE +21 -0
- data/README.md +106 -0
- data/bin/dami +10 -0
- data/docs/01.Getting_Started.md +220 -0
- data/docs/02.Models_and_Fields.md +244 -0
- data/docs/03.Querying.md +387 -0
- data/docs/04.Creating_Updating_Deleting.md +226 -0
- data/docs/05.Validation.md +259 -0
- data/docs/06.Protection.md +160 -0
- data/docs/07.Associations.md +239 -0
- data/docs/08.Scopes.md +99 -0
- data/docs/09.Migrations.md +165 -0
- data/docs/10.Flows_and_Commands.md +181 -0
- data/docs/11.Localization.md +435 -0
- data/docs/12.TheDamiWay.md +227 -0
- data/docs/Manifesto.md +305 -0
- data/docs/site.md +477 -0
- data/lib/dami/actions/command.rb +80 -0
- data/lib/dami/actions/context.rb +63 -0
- data/lib/dami/actions/draft.rb +36 -0
- data/lib/dami/actions/flow.rb +42 -0
- data/lib/dami/adapters/base.rb +40 -0
- data/lib/dami/adapters/sqlite/connection.rb +122 -0
- data/lib/dami/adapters/sqlite/core.rb +17 -0
- data/lib/dami/adapters/sqlite/query.rb +353 -0
- data/lib/dami/adapters/sqlite/schema.rb +135 -0
- data/lib/dami/cli.rb +117 -0
- data/lib/dami/configuration.rb +246 -0
- data/lib/dami/core.rb +98 -0
- data/lib/dami/dsl_guardrails.rb +45 -0
- data/lib/dami/errors.rb +89 -0
- data/lib/dami/inflector.rb +245 -0
- data/lib/dami/localization.rb +131 -0
- data/lib/dami/migration.rb +84 -0
- data/lib/dami/migrator.rb +105 -0
- data/lib/dami/plugins/associations.rb +284 -0
- data/lib/dami/plugins/nested_attributes.rb +180 -0
- data/lib/dami/plugins/protection.rb +30 -0
- data/lib/dami/plugins/validations.rb +90 -0
- data/lib/dami/query/builder.rb +132 -0
- data/lib/dami/query/enumerable.rb +62 -0
- data/lib/dami/query/persistence.rb +133 -0
- data/lib/dami/record_proxy.rb +32 -0
- data/lib/dami/result.rb +27 -0
- data/lib/dami/schema/diff.rb +84 -0
- data/lib/dami/schema/dumper.rb +60 -0
- data/lib/dami/schema/generator.rb +69 -0
- data/lib/dami/schema/introspector.rb +34 -0
- data/lib/dami/schema/loader.rb +58 -0
- data/lib/dami/schema.rb +13 -0
- data/lib/dami/validation_rules.rb +72 -0
- data/lib/dami/version.rb +3 -0
- data/lib/dami.rb +32 -0
- metadata +218 -0
data/lib/dami/schema.rb
ADDED
|
@@ -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
|
data/lib/dami/version.rb
ADDED
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: []
|