dynamicschema 1.0.0.beta01 → 1.0.0.beta02
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +82 -0
- data/dynamicschema.gemspec +1 -1
- data/lib/dynamic_schema/buildable.rb +24 -0
- data/lib/dynamic_schema/definable.rb +36 -0
- data/lib/dynamic_schema/receiver.rb +3 -1
- data/lib/dynamic_schema.rb +3 -1
- metadata +4 -3
- data/lib/dynamic_schema/definition.rb +0 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0251af8d67cb7dbbaeea74a21dd72dd2385e2449d4aa41c48753f4b05428dfed
|
4
|
+
data.tar.gz: ce213906df2fe4facdf469717c61f5138aa3cae7469ba0ac3d5dc21e6dadd958
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48b889c8c37b1a454819a5ea8de9d63179348b7cede7ce043f0972bef384012cb9ed3a4aaabe8a739f3d51e21bee0f3315231fc5ea6b80cab48c945f3ac17919
|
7
|
+
data.tar.gz: 3b317ae13cfb0d558fe8f77267136e2132842780f39331ccf192e7f5b65d397ea1ac8bb3fa8d615f38afb9c1adf09a227a689921d63237525b8f6fc04b040cfa
|
data/README.md
CHANGED
@@ -57,6 +57,9 @@ You can find a full OpenAI request example in the `/examples` folder of this rep
|
|
57
57
|
- [as Option](#as-option)
|
58
58
|
- [in Option (Values Only)](#in-option)
|
59
59
|
- [arguments Option](#arguments-option)
|
60
|
+
- [Class Schema](#class-schemas)
|
61
|
+
- [Definable](#definable)
|
62
|
+
- [Buildable](#buildable)
|
60
63
|
- [Validation Methods](#validation-methods)
|
61
64
|
- [Validation Rules](#validation-rules)
|
62
65
|
- [validate!](#validate)
|
@@ -414,6 +417,85 @@ result = schema.build! do
|
|
414
417
|
end
|
415
418
|
```
|
416
419
|
|
420
|
+
## Class Schemas
|
421
|
+
|
422
|
+
DynamicSchema provides a number of modules you can include into your own classes to simplify
|
423
|
+
their definition and construction.
|
424
|
+
|
425
|
+
### Definable
|
426
|
+
|
427
|
+
The `Definable` module, when inclued in a class, will add a `schema` class method to your class.
|
428
|
+
You can call `schema` with a block and define a schema directly inside your class. The `schema`
|
429
|
+
method can be called repeatedly, with subsequent calls augmenting, any preexsiting schema.
|
430
|
+
|
431
|
+
This can be used in a class hierarchy to augment base class schemas in derived classes.
|
432
|
+
|
433
|
+
```
|
434
|
+
class DatabaSettings
|
435
|
+
include DynamicSchema::Definable
|
436
|
+
|
437
|
+
schema do
|
438
|
+
database do
|
439
|
+
host String
|
440
|
+
port String
|
441
|
+
name String
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
445
|
+
def initalize( attributes = {} )
|
446
|
+
# validate the attributes
|
447
|
+
schema_builder = DynamicSchema::Builder.new.define( &class.schema )
|
448
|
+
schema_builder.validate!( attributes )
|
449
|
+
# initialize from the given attributes here
|
450
|
+
@host = attributes[ :database ][ :host ]
|
451
|
+
@port = attributes[ :database ][ :port ]
|
452
|
+
@name = attributes[ :database ][ :name ]
|
453
|
+
end
|
454
|
+
|
455
|
+
end
|
456
|
+
```
|
457
|
+
|
458
|
+
### Buildable
|
459
|
+
|
460
|
+
The `Buildable` module can be included in a class, in addition to `Definable` to faciliate
|
461
|
+
building that class using a schema assisted builder pattern. The `Buildable` module adds
|
462
|
+
`build!` and `build` methods to the class which can be used to build that class, with and
|
463
|
+
without validation respectivelly.
|
464
|
+
|
465
|
+
These methods accept both a hash with attitbutes that follow the schema, as well as a block
|
466
|
+
that can be used to build the class instance. The attributes and block can be used simultanously.
|
467
|
+
|
468
|
+
**Important** Note that `Buildable` requires that the initializer accept a `Hash` of attributes.
|
469
|
+
|
470
|
+
```
|
471
|
+
class DatabaSettings
|
472
|
+
include DynamicSchema::Definable
|
473
|
+
include DynamicSchema::Buildable
|
474
|
+
|
475
|
+
schema do
|
476
|
+
database do
|
477
|
+
adapter Symbol
|
478
|
+
host String
|
479
|
+
port String
|
480
|
+
name String
|
481
|
+
end
|
482
|
+
end
|
483
|
+
|
484
|
+
def initalize( attributes = {} )
|
485
|
+
# assign the attributes
|
486
|
+
# ...
|
487
|
+
end
|
488
|
+
|
489
|
+
end
|
490
|
+
|
491
|
+
database_settings = DatabaSettings.build! adapter: :pg do
|
492
|
+
host "localhost"
|
493
|
+
port "127.0.0.1"
|
494
|
+
name "mydb"
|
495
|
+
end
|
496
|
+
|
497
|
+
```
|
498
|
+
|
417
499
|
## Validation
|
418
500
|
|
419
501
|
DynamicSchema provides three different methods for validating Hash structures against your
|
data/dynamicschema.gemspec
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
module DynamicSchema
|
2
|
+
module Buildable
|
3
|
+
|
4
|
+
def self.included( base )
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
def build( attributes = nil, &block )
|
11
|
+
@_builder ||= Builder.new.define( &self.schema )
|
12
|
+
new( @_builder.build( attributes, &block ) )
|
13
|
+
end
|
14
|
+
|
15
|
+
def build!( attributes = nil, &block )
|
16
|
+
@_builder ||= Builder.new.define( &self.schema )
|
17
|
+
new( @_builder.build!( attributes, &block ) )
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module DynamicSchema
|
2
|
+
module Definable
|
3
|
+
|
4
|
+
def self.included( base )
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
def schema( &block )
|
11
|
+
@_schema ||= []
|
12
|
+
@_schema << block if block_given?
|
13
|
+
schema_blocks = _collect_schema
|
14
|
+
proc do
|
15
|
+
schema_blocks.each do | block |
|
16
|
+
instance_eval( &block )
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def _collect_schema
|
24
|
+
schema_blocks = []
|
25
|
+
if superclass.singleton_methods.include?( :_collect_schema )
|
26
|
+
schema_blocks.concat( superclass._collect_schema )
|
27
|
+
end
|
28
|
+
schema_blocks.concat( @_schema ) if defined?( @_schema )
|
29
|
+
schema_blocks
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -103,7 +103,9 @@ module DynamicSchema
|
|
103
103
|
@defaults_assigned[ method ] = false
|
104
104
|
@values[ name ] = value
|
105
105
|
else
|
106
|
-
|
106
|
+
::Kernel.raise ::NoMethodError,
|
107
|
+
"There is no schema value or object '#{method}' defined in this scope which includes: " \
|
108
|
+
"#{@schema.keys.join( ', ' )}."
|
107
109
|
end
|
108
110
|
end
|
109
111
|
|
data/lib/dynamic_schema.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require_relative 'dynamic_schema/errors'
|
2
2
|
require_relative 'dynamic_schema/builder'
|
3
|
-
|
3
|
+
|
4
|
+
require_relative 'dynamic_schema/definable'
|
5
|
+
require_relative 'dynamic_schema/buildable'
|
4
6
|
|
5
7
|
module DynamicSchema
|
6
8
|
def self.define( schema = {}, &block )
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamicschema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta02
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kristoph Cichocki-Romanov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -55,10 +55,11 @@ files:
|
|
55
55
|
- README.md
|
56
56
|
- dynamicschema.gemspec
|
57
57
|
- lib/dynamic_schema.rb
|
58
|
+
- lib/dynamic_schema/buildable.rb
|
58
59
|
- lib/dynamic_schema/builder.rb
|
59
60
|
- lib/dynamic_schema/builder_methods/conversion.rb
|
60
61
|
- lib/dynamic_schema/builder_methods/validation.rb
|
61
|
-
- lib/dynamic_schema/
|
62
|
+
- lib/dynamic_schema/definable.rb
|
62
63
|
- lib/dynamic_schema/errors.rb
|
63
64
|
- lib/dynamic_schema/receiver.rb
|
64
65
|
- lib/dynamic_schema/resolver.rb
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require_relative 'builder'
|
2
|
-
|
3
|
-
module DynamicSchema
|
4
|
-
module Definition
|
5
|
-
|
6
|
-
def schema( schema = nil, &block )
|
7
|
-
return @_schema_builder if ( schema.nil? || schema.empty? ) && !block
|
8
|
-
@_schema_builder = DynamicSchema::Builder.new( schema ).define( &block )
|
9
|
-
end
|
10
|
-
|
11
|
-
def build_with_schema( attributes = nil, &block )
|
12
|
-
raise RuntimeError, "The schema has not been defined." if @_schema_builder.nil?
|
13
|
-
@_schema_builder.build( attributes, &block )
|
14
|
-
end
|
15
|
-
|
16
|
-
def build_with_schema!( attributes = nil, &block )
|
17
|
-
raise RuntimeError, "The schema has not been defined." if @_schema_builder.nil?
|
18
|
-
@_schema_builder.build!( attributes, &block )
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|