scheming 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9200950b341609a10673661255198aacf8012bdb89b89868d66eed91aa11c395
4
- data.tar.gz: 175243bb9bd5204b93b5f59f2e0b403163c86ed745a01a23c2e987bc2aab2813
3
+ metadata.gz: b21c99fc59c9fe7da35644b47be93b2d6bba2f13f4ef814008a64c92f2235323
4
+ data.tar.gz: c0ff8026a852f0b8e4c91bf86aa4a172502a12b3c89dcd693527863dc7cf58aa
5
5
  SHA512:
6
- metadata.gz: 9c83e51b6db0200f0d222250e690696061ecf581bad11e4c5916df828cfef2d6ae01da50349d7a1cdea2097b7a235fe19950c48ec0b11f628522ed734a100e48
7
- data.tar.gz: b35ebaf5d8d1a30b1538471d153a7da1ed648037c84c89ec2132742bad94fcfee0b0d4744b0c82b3f36de924d30a39579e881a812f4d1ba6fc3bff9c46283415
6
+ metadata.gz: 93fa8e2cd04de2c77495754fe04aa2cbd84070a862835c83ef535a7830b6e41337b401f2e35dbf297434397523e24b50c8cb97063745fe58d61f881114187424
7
+ data.tar.gz: 61c3cf8462b6d9075e593d00fa76921bbb7958e1ac2590f2a4683ff5c2aeac40b28209e579270eff279cea0261d6d1ea8194a0a87d2ebd3b56f93f8bfc8a2966
data/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.5.0] - 2024-05-02
4
+
5
+ ### Added
6
+
7
+ - Support for `generic` definitions
8
+
9
+ # Example
10
+ ```ruby
11
+ Point = Scheming.generic do |(type)|
12
+ Object(x: type, y: type)
13
+ end
14
+
15
+ Scheming::Schema.json(Point)
16
+ # =>
17
+ {
18
+ type: 'object',
19
+ additionalProperties: false,
20
+ required: %i[x y],
21
+ properties: {
22
+ x: { type: 'number' },
23
+ y: { type: 'number' }
24
+ }
25
+ }
26
+ ```
27
+
3
28
  ## [0.4.0] - 2024-05-02
4
29
 
5
30
  ### Breaking Change
@@ -35,6 +60,8 @@
35
60
 
36
61
  ### Enhancement
37
62
 
63
+ - Ensure all types produce valid JSON Schema
64
+
38
65
  ## [0.2.0] - 2024-05-01
39
66
 
40
67
  ### Added
@@ -56,8 +83,6 @@
56
83
  end
57
84
  ```
58
85
 
59
- - Ensure all types produce valid JSON Schema
60
-
61
86
  ## [0.1.0] - 2024-04-26
62
87
 
63
88
  - Initial release
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scheming (0.4.0)
4
+ scheming (0.5.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -27,9 +27,14 @@ LineItem = Scheming.object do
27
27
  attribute :item_type, Enum('entertainment', 'staple')
28
28
  end
29
29
 
30
+ Point = Scheming.generic do |(type)|
31
+ Object(x: type, y: type)
32
+ end
33
+
30
34
  Receipt = Scheming.object do
31
35
  attribute :line_items, Array(LineItem)
32
36
  attribute :total, Float
37
+ attribute :location, Point[Float]
33
38
  end
34
39
  ```
35
40
 
@@ -40,7 +45,7 @@ Scheming::Schema.json(Receipt)
40
45
  {
41
46
  type: 'object',
42
47
  additionalProperties: false,
43
- required: %i[line_items total],
48
+ required: %i[line_items total location],
44
49
  properties: {
45
50
  line_items: {
46
51
  type: 'array',
@@ -61,12 +66,21 @@ Scheming::Schema.json(Receipt)
61
66
  price: { type: 'number' },
62
67
  item_type: {
63
68
  type: 'string',
64
- enum: ['intertainment', 'staple']
69
+ enum: %w[entertainment staple]
65
70
  }
66
71
  }
67
72
  }
68
73
  },
69
- total: { type: 'number' }
74
+ total: { type: 'number' },
75
+ location: {
76
+ type: 'object',
77
+ additionalProperties: false,
78
+ required: %i[x y],
79
+ properties: {
80
+ x: { type: 'number' },
81
+ y: { type: 'number' }
82
+ }
83
+ }
70
84
  }
71
85
  }
72
86
  ```
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ # = Generic
4
+ #
5
+ # Many types can be "templated" in a way where
6
+ # some types get swapped in and out. Perhaps
7
+ # the most common example for this is with a
8
+ # two dimensional `Point` structure. We could
9
+ # have a point with `Float` coordinates OR they
10
+ # could also be `Integer`:
11
+ #
12
+ # ```ruby
13
+ # Object(x: Float, y: Float)
14
+ # Object(x: Integer, y: Integer)
15
+ # ```
16
+ #
17
+ # Instead of having two defintions we can have
18
+ # a single generic that defins both:
19
+ #
20
+ # ```ruby
21
+ # Point = Scheming::Generic.new do |(t)|
22
+ # Object(x: t, y: t)
23
+ # end
24
+ #
25
+ # Point[Float]
26
+ #
27
+ # Point[Integer]
28
+ # ```
29
+ #
30
+ class Scheming::Generic
31
+ def initialize(&proto_type)
32
+ @proto_type = proto_type
33
+ end
34
+
35
+ # @param types [Scheming::Type::Base]
36
+ def [](*types)
37
+ Scheming::DSL::DataBuilder
38
+ .new
39
+ .instance_exec(types, &@proto_type)
40
+ end
41
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Scheming
4
- VERSION = '0.4.0'
4
+ VERSION = '0.5.0'
5
5
  end
data/lib/scheming.rb CHANGED
@@ -10,6 +10,7 @@ module Scheming
10
10
  require_relative 'scheming/attribute'
11
11
  require_relative 'scheming/type'
12
12
  require_relative 'scheming/schema'
13
+ require_relative 'scheming/generic'
13
14
  require_relative 'scheming/dsl'
14
15
 
15
16
  # @return [Class]
@@ -18,4 +19,7 @@ module Scheming
18
19
  builder.instance_exec(&)
19
20
  builder.build
20
21
  end
22
+
23
+ # @return [Scheming::Generic]
24
+ def self.generic(&) = Scheming::Generic.new(&)
21
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scheming
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Falk
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-02 00:00:00.000000000 Z
11
+ date: 2024-05-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Ergonomic Data Design for the Masses
14
14
  email:
@@ -35,6 +35,7 @@ files:
35
35
  - lib/scheming/dsl/tagging.rb
36
36
  - lib/scheming/dsl/type_resolver.rb
37
37
  - lib/scheming/dsl/type_specs.rb
38
+ - lib/scheming/generic.rb
38
39
  - lib/scheming/schema.rb
39
40
  - lib/scheming/schema/json.rb
40
41
  - lib/scheming/type.rb