scheming 0.2.0 → 0.4.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: ff00e122a5534ba54406fa8ffbf47b936fa564fdb26fd601299b0a8f508ebff1
4
- data.tar.gz: e45e06743f0bc67d1176b7d6489127e476fd8e80e3ae67a2787d544cda7213df
3
+ metadata.gz: 9200950b341609a10673661255198aacf8012bdb89b89868d66eed91aa11c395
4
+ data.tar.gz: 175243bb9bd5204b93b5f59f2e0b403163c86ed745a01a23c2e987bc2aab2813
5
5
  SHA512:
6
- metadata.gz: d2a00a25d768946d55420bbd27a47fe598068f806d438b37930a62455647d65be1f72f5961be55e8e82723befa11713dad504fdebce532d228b521dcc3abc3f3
7
- data.tar.gz: dbef726a89b0831591327eb7a23c6686f566f0b8ec790fb58b0b2214615bb7b32419b6267a1edff4418b69dba9794e18e3744e6e816fbeffb20aa41cd5b160b5
6
+ metadata.gz: 9c83e51b6db0200f0d222250e690696061ecf581bad11e4c5916df828cfef2d6ae01da50349d7a1cdea2097b7a235fe19950c48ec0b11f628522ed734a100e48
7
+ data.tar.gz: b35ebaf5d8d1a30b1538471d153a7da1ed648037c84c89ec2132742bad94fcfee0b0d4744b0c82b3f36de924d30a39579e881a812f4d1ba6fc3bff9c46283415
data/CHANGELOG.md CHANGED
@@ -1,8 +1,39 @@
1
1
  ## [Unreleased]
2
2
 
3
- ## [0.1.0] - 2024-04-26
3
+ ## [0.4.0] - 2024-05-02
4
4
 
5
- - Initial release
5
+ ### Breaking Change
6
+
7
+ - Opting for a `tag` system to work with attributes instead
8
+ of a blanket lexical scope like `optional` to work with
9
+ attributes. The long term goal is to expand out the tagging
10
+ system so that it can support much more than we can
11
+ anticipate today.
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
+ tag(:optional)
22
+ attribute :desc, Nullable(String)
23
+
24
+ tag(:optional)
25
+ attribute :item_type, Enum('entertainment', 'staple')
26
+ end
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
6
37
 
7
38
  ## [0.2.0] - 2024-05-01
8
39
 
@@ -24,3 +55,9 @@
24
55
  attribute :item_type, Enum('entertainment', 'staple')
25
56
  end
26
57
  ```
58
+
59
+ - Ensure all types produce valid JSON Schema
60
+
61
+ ## [0.1.0] - 2024-04-26
62
+
63
+ - Initial release
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.4.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
@@ -20,9 +20,10 @@ LineItem = Scheming.object do
20
20
  attribute :taxable, :bool
21
21
  attribute :price, Float
22
22
 
23
- optional
24
-
23
+ tag(:optional)
25
24
  attribute :desc, Nullable(String)
25
+
26
+ tag(:optional)
26
27
  attribute :item_type, Enum('entertainment', 'staple')
27
28
  end
28
29
 
@@ -57,15 +58,15 @@ Scheming::Schema.json(Receipt)
57
58
  { type: 'null' }
58
59
  ]
59
60
  },
60
- price: { type: 'numeric' },
61
+ price: { type: 'number' },
61
62
  item_type: {
62
63
  type: 'string',
63
- enum: Set['intertainment', 'staple']
64
+ enum: ['intertainment', 'staple']
64
65
  }
65
66
  }
66
67
  }
67
68
  },
68
- total: { type: 'numeric' }
69
+ total: { type: 'number' }
69
70
  }
70
71
  }
71
72
  ```
@@ -7,7 +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
+ @tagging = Scheming::DSL::Tagging.new
11
11
  end
12
12
 
13
13
  # @param field_name [Symbol]
@@ -18,14 +18,17 @@ class Scheming::DSL::DataBuilder
18
18
  @builder = @builder.attribute(
19
19
  field_name,
20
20
  type: @resolver.resolve(type_spec),
21
- is_required: @required
21
+ **@tagging.attribute_params
22
22
  )
23
+ @tagging.reset!
23
24
  nil
24
25
  end
25
26
 
26
- # Mark all arrtibutes after this as optional
27
- def optional
28
- @required = false
27
+ # @param name [Symbol]
28
+ # @param args [Hash<Symbol, Object>]
29
+ def tag(name, **args)
30
+ @tagging.tag!(name, args)
31
+ nil
29
32
  end
30
33
 
31
34
  # @return [Class]
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ # = Type Resolver
4
+ class Scheming::DSL::Tagging
5
+ # = Attribute Tag
6
+ #
7
+ # Simple representation of a concept
8
+ # that can be used to aid in the
9
+ # creation of an [Scheming::Attribute]
10
+ #
11
+ class Tag
12
+ # @param name [Symbo]
13
+ # @data [Hash<Symbol, Object>]
14
+ def initialize(name, data)
15
+ @name = name
16
+ @data = data
17
+ end
18
+ end
19
+ private_constant :Tag
20
+
21
+ def initialize
22
+ # @type [Hash<Symbol, Tag>]
23
+ @tags = {}
24
+ end
25
+
26
+ # @return [void]
27
+ def reset!
28
+ @tags.clear
29
+ nil
30
+ end
31
+
32
+ # @param taglist [Hash<Symbol, Object>]
33
+ # @param name [Symbol]
34
+ # @return [Tag]
35
+ def tag!(name, data)
36
+ @tags[name] = Tag.new(name, data)
37
+ end
38
+
39
+ def attribute_params
40
+ {
41
+ is_required: missing?(:optional)
42
+ }
43
+ end
44
+
45
+ def missing?(name) = !has?(name)
46
+ def has?(name) = @tags.key?(name)
47
+ end
data/lib/scheming/dsl.rb CHANGED
@@ -8,6 +8,7 @@
8
8
  # who need to know.
9
9
  #
10
10
  module Scheming::DSL
11
+ require_relative 'dsl/tagging'
11
12
  require_relative 'dsl/type_specs'
12
13
  require_relative 'dsl/data_builder'
13
14
  require_relative 'dsl/object_type_def'
@@ -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.2.0'
4
+ VERSION = '0.4.0'
5
5
  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.2.0
4
+ version: 0.4.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-01 00:00:00.000000000 Z
11
+ date: 2024-05-02 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Ergonomic Data Design for the Masses
14
14
  email:
@@ -32,6 +32,7 @@ files:
32
32
  - lib/scheming/dsl.rb
33
33
  - lib/scheming/dsl/data_builder.rb
34
34
  - lib/scheming/dsl/object_type_def.rb
35
+ - lib/scheming/dsl/tagging.rb
35
36
  - lib/scheming/dsl/type_resolver.rb
36
37
  - lib/scheming/dsl/type_specs.rb
37
38
  - lib/scheming/schema.rb
@@ -39,7 +40,7 @@ files:
39
40
  - lib/scheming/type.rb
40
41
  - lib/scheming/version.rb
41
42
  - sig/scheming.rbs
42
- homepage:
43
+ homepage: https://github.com/benfalk/scheming
43
44
  licenses:
44
45
  - MIT
45
46
  metadata: