scheming 0.1.0 → 0.3.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: a71514dd3a8b1f9640a40adf0bbfd928cab9abe7b6981fad8ac0e25a1c7add01
4
- data.tar.gz: edad4ab18d9c22efebbdc39b9a7c74d451e9a41b9b85892a743bb0dc726301b2
3
+ metadata.gz: bc01781074d4363c7a93440ca775680ad40e390eadf0dd84501501f96aad242f
4
+ data.tar.gz: c5356c5b7beb9d74f6489db0d4024973755fc5c2b6a5c015a97d4b21d612191c
5
5
  SHA512:
6
- metadata.gz: daaff46c5331a1dd747fadfd50701f497225d05104d443dce75c0b8d244445943cea917e5d2ad39a2daf2fbe271ea08edd0930ac351a12dd1ff552c05b6fb590
7
- data.tar.gz: 28f7756667869ff46d076f74dc89849d65a5fc3609c2c472d85f02cfe16143c74936ac7d16bb2d577650b53df159d9402d34926999f6e8aa3808d721dec2afc9
6
+ metadata.gz: d5ebcaf385cbf2148e37d326c06bd49bd6aa584c9d419096dbb8a7e5f909c191c93b1bc1a294c2a4589c9bf2a9902bf775d73679c440134ebae600ce25e9f110
7
+ data.tar.gz: 169ff09cbed7450f5d22754db231e98b5752d98fc00b8dfd2613cb0f0054c59efa24e4b8e86331b32823e76341de46685b8a45abda5416396cdd3b81f8809890
data/CHANGELOG.md CHANGED
@@ -3,3 +3,36 @@
3
3
  ## [0.1.0] - 2024-04-26
4
4
 
5
5
  - Initial release
6
+
7
+ ## [0.2.0] - 2024-05-01
8
+
9
+ ### Added
10
+
11
+ - Support for `optional` fields
12
+
13
+ # Example:
14
+ ```ruby
15
+ LineItem = Scheming.object do
16
+ attribute :id, Integer
17
+ attribute :name, String
18
+ attribute :taxable, :bool
19
+ attribute :price, Float
20
+
21
+ optional
22
+
23
+ attribute :desc, Nullable(String)
24
+ attribute :item_type, Enum('entertainment', 'staple')
25
+ end
26
+ ```
27
+
28
+ ## [0.3.0] - 2024-05-01
29
+
30
+ ### Bugfix
31
+
32
+ - JSON Schema for Float was `numeric` instead of `number`
33
+
34
+ - JSON Schema production of `Enum` **must** be an array
35
+
36
+ ### Enhancement
37
+
38
+ - Ensure all types produce valid JSON Schema
data/Gemfile CHANGED
@@ -6,6 +6,7 @@ source 'https://rubygems.org'
6
6
  gemspec
7
7
 
8
8
  gem 'factory_bot', '~> 6.4'
9
+ gem 'json-schema', '~> 4.3'
9
10
  gem 'pry', '~> 0.14.2'
10
11
  gem 'rake', '~> 13.0'
11
12
  gem 'rspec', '~> 3.0'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scheming (0.1.0)
4
+ scheming (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -16,6 +16,8 @@ GEM
16
16
  minitest (>= 5.1)
17
17
  mutex_m
18
18
  tzinfo (~> 2.0)
19
+ addressable (2.8.6)
20
+ public_suffix (>= 2.0.2, < 6.0)
19
21
  ast (2.4.2)
20
22
  base64 (0.2.0)
21
23
  bigdecimal (3.1.7)
@@ -29,6 +31,8 @@ GEM
29
31
  i18n (1.14.4)
30
32
  concurrent-ruby (~> 1.0)
31
33
  json (2.7.2)
34
+ json-schema (4.3.0)
35
+ addressable (>= 2.8)
32
36
  language_server-protocol (3.17.0.3)
33
37
  method_source (1.1.0)
34
38
  minitest (5.22.3)
@@ -40,6 +44,7 @@ GEM
40
44
  pry (0.14.2)
41
45
  coderay (~> 1.1)
42
46
  method_source (~> 1.0)
47
+ public_suffix (5.0.5)
43
48
  racc (1.7.3)
44
49
  rainbow (3.1.1)
45
50
  rake (13.2.1)
@@ -81,6 +86,7 @@ PLATFORMS
81
86
 
82
87
  DEPENDENCIES
83
88
  factory_bot (~> 6.4)
89
+ json-schema (~> 4.3)
84
90
  pry (~> 0.14.2)
85
91
  rake (~> 13.0)
86
92
  rspec (~> 3.0)
data/README.md CHANGED
@@ -18,9 +18,12 @@ LineItem = Scheming.object do
18
18
  attribute :id, Integer
19
19
  attribute :name, String
20
20
  attribute :taxable, :bool
21
- attribute :desc, Nullable(String)
22
21
  attribute :price, Float
23
- attribute :type, Enum('entertainment', 'staple')
22
+
23
+ optional
24
+
25
+ attribute :desc, Nullable(String)
26
+ attribute :item_type, Enum('entertainment', 'staple')
24
27
  end
25
28
 
26
29
  Receipt = Scheming.object do
@@ -43,7 +46,7 @@ Scheming::Schema.json(Receipt)
43
46
  items: {
44
47
  type: 'object',
45
48
  additionalProperties: false,
46
- required: %i[id name taxable desc price item_type],
49
+ required: %i[id name taxable price],
47
50
  properties: {
48
51
  id: { type: 'integer' },
49
52
  name: { type: 'string' },
@@ -54,15 +57,15 @@ Scheming::Schema.json(Receipt)
54
57
  { type: 'null' }
55
58
  ]
56
59
  },
57
- price: { type: 'numeric' },
60
+ price: { type: 'number' },
58
61
  item_type: {
59
62
  type: 'string',
60
- enum: %w[entertainment staple].to_set
63
+ enum: ['intertainment', 'staple']
61
64
  }
62
65
  }
63
66
  }
64
67
  },
65
- total: { type: 'numeric' }
68
+ total: { type: 'number' }
66
69
  }
67
70
  }
68
71
  ```
@@ -7,6 +7,7 @@ class Scheming::DSL::DataBuilder
7
7
  def initialize(builder = Scheming::Attribute::ListBuilder.new)
8
8
  @builder = builder
9
9
  @resolver = Scheming::DSL::TypeResolver
10
+ @required = true
10
11
  end
11
12
 
12
13
  # @param field_name [Symbol]
@@ -14,11 +15,19 @@ class Scheming::DSL::DataBuilder
14
15
  # @param null [Boolean]
15
16
  # @return [void]
16
17
  def attribute(field_name, type_spec)
17
- type = @resolver.resolve(type_spec)
18
- @builder = @builder.attribute(field_name, type:)
18
+ @builder = @builder.attribute(
19
+ field_name,
20
+ type: @resolver.resolve(type_spec),
21
+ is_required: @required
22
+ )
19
23
  nil
20
24
  end
21
25
 
26
+ # Mark all arrtibutes after this as optional
27
+ def optional
28
+ @required = false
29
+ end
30
+
22
31
  # @return [Class]
23
32
  def build
24
33
  list = @builder.build
@@ -6,7 +6,7 @@ module Scheming::Schema
6
6
  module Constants
7
7
  NULL = { type: 'null' }.freeze
8
8
  INTEGER = { type: 'integer' }.freeze
9
- FLOAT = { type: 'numeric' }.freeze
9
+ FLOAT = { type: 'number' }.freeze
10
10
  STRING = { type: 'string' }.freeze
11
11
  BOOLEAN = { type: 'boolean' }.freeze
12
12
  end
@@ -68,7 +68,7 @@ module Scheming::Schema
68
68
 
69
69
  refine Scheming::Type::Enum do
70
70
  def schema
71
- type.schema.merge(enum: values).freeze
71
+ type.schema.merge(enum: values.to_a.freeze).freeze
72
72
  end
73
73
  end
74
74
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Scheming
4
- VERSION = '0.1.0'
4
+ VERSION = '0.3.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scheming
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Falk
@@ -39,10 +39,12 @@ files:
39
39
  - lib/scheming/type.rb
40
40
  - lib/scheming/version.rb
41
41
  - sig/scheming.rbs
42
- homepage:
42
+ homepage: https://github.com/benfalk/scheming
43
43
  licenses:
44
44
  - MIT
45
45
  metadata:
46
+ source_code_uri: https://github.com/benfalk/scheming
47
+ changelog_uri: https://raw.githubusercontent.com/benfalk/scheming/main/CHANGELOG.md
46
48
  rubygems_mfa_required: 'true'
47
49
  post_install_message:
48
50
  rdoc_options: []