scheming 0.6.0 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c861bcba1706b9ffe842a7d13cb55b047479d57a1c7e44a6e7fa7a934c83819a
4
- data.tar.gz: 8837b76f3fa1c0c334387432a8c466085a96064482b4ff1dd00bbabc2b69c1ae
3
+ metadata.gz: 670c2fce2ac13e3ae6d64790ef6fbcad0f0de413c06bb2fc3300e24686315495
4
+ data.tar.gz: 599cd2a5d28aed9215a011b896a7eb5a207f14f2a7ca55dcd9299abed4100e32
5
5
  SHA512:
6
- metadata.gz: c8d822270972cb4abc4837c89fa8084b78132af50acc829e7b610fe74cb5ce6bc517ea579528b489b774daa4aec17dd971704ad7f54c3113589d0fee225b22ed
7
- data.tar.gz: 3c72a5b224d4d345ee050045d75f72ae74413e1bb78be6f1203795b4ed015f5327ca2e998a05712e086aef4b5d4925818c09c3afb98c5ffb1ac94ba1b6374296
6
+ metadata.gz: fb6bc063479d9b7fc4f3769d966102b0c9fccc971727bb5e72962186227dfb55d3921b40b3a26b5454defc36f1f48cf1afba680b6221ed4b84bee12ae16cce5f
7
+ data.tar.gz: 711e2a1f8b035ff4aa33dca7955f810cbd7e11774d221f7a2ad0da59623ce5424e4fc02a92fefac78117a1ed37b35fa3a24799547121e97daaebd523a722ef63
data/.rubocop.yml CHANGED
@@ -18,3 +18,6 @@ Style/ClassAndModuleChildren:
18
18
 
19
19
  Layout/LineLength:
20
20
  Max: 90
21
+
22
+ Lint/EmptyClass:
23
+ AllowComments: true
data/.solargraph.yml ADDED
@@ -0,0 +1,28 @@
1
+ ---
2
+ include:
3
+ - "**/*.rb"
4
+ exclude:
5
+ - spec/**/*
6
+ - test/**/*
7
+ - vendor/**/*
8
+ - ".bundle/**/*"
9
+ require: []
10
+ domains: []
11
+ reporters:
12
+ - rubocop
13
+ - require_not_found
14
+ - typecheck
15
+ formatter:
16
+ rubocop:
17
+ cops: safe
18
+ except: []
19
+ only: []
20
+ extra_args: []
21
+ require_paths: [
22
+ 'factory_bot',
23
+ 'json_schemer',
24
+ 'pry',
25
+ 'set'
26
+ ]
27
+ plugins: []
28
+ max_files: 5000
data/CHANGELOG.md CHANGED
@@ -1,12 +1,59 @@
1
1
  ## [Unreleased]
2
2
 
3
- ## [0.6.0]
3
+ ## [0.7.0] - 2024-05-10
4
+
5
+ ### Added
6
+
7
+ - `Tuple` type added
8
+
9
+ #### Example
10
+ ```ruby
11
+ EmailTemplate = Scheming.object do
12
+ attribute :id, Integer
13
+ attribute :data, Tuple(String, Array(String))
14
+ end
15
+
16
+ Scheming::Schema.json(EmailTemplate)
17
+ # =>
18
+ {
19
+ type: 'object',
20
+ additionalProperties: false,
21
+ required: %w[id data],
22
+ properties: {
23
+ id: { type: 'integer' },
24
+ data: {
25
+ type: 'array',
26
+ prefixItems: [
27
+ { type: 'string' },
28
+ {
29
+ type: 'array',
30
+ items: { type: 'string' }
31
+ }
32
+ ]
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ ### Enhancement
39
+
40
+ - Added `solorgraph` to the development process and added
41
+ it's typecheck to the default `rake` task.
42
+
43
+ - Reduced string allocations when generating required field
44
+ names for objects with the JSON schema format.
45
+
46
+ ### Bugfix
47
+
48
+ - Incorrect type syntax corrected as reported by `solargraph`.
49
+
50
+ ## [0.6.0] - 2024-05-04
4
51
 
5
52
  ### Added
6
53
 
7
54
  - `Union` type added
8
55
 
9
- # Example
56
+ #### Example
10
57
  ```ruby
11
58
  Order = Scheming.object do
12
59
  attribute :id, Union(String, Integer)
@@ -15,10 +62,17 @@
15
62
  Scheming::Schema.json(Order)
16
63
  # =>
17
64
  {
18
- oneOf: [
19
- { type: 'string' },
20
- { type: 'integer' }
21
- ]
65
+ type: 'object',
66
+ additionalProperties: false,
67
+ required: %w[id],
68
+ properties: {
69
+ id: {
70
+ oneOf: [
71
+ { type: 'string' },
72
+ { type: 'integer' }
73
+ ]
74
+ }
75
+ }
22
76
  }
23
77
  ```
24
78
 
@@ -48,7 +102,7 @@
48
102
 
49
103
  - Support for `generic` definitions
50
104
 
51
- # Example
105
+ #### Example
52
106
  ```ruby
53
107
  Point = Scheming.generic do |(type)|
54
108
  Object(x: type, y: type)
data/Gemfile CHANGED
@@ -11,3 +11,4 @@ gem 'pry', '~> 0.14.2'
11
11
  gem 'rake', '~> 13.0'
12
12
  gem 'rspec', '~> 3.0'
13
13
  gem 'rubocop', '~> 1.21'
14
+ gem 'solargraph'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- scheming (0.6.0)
4
+ scheming (0.7.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,18 +17,22 @@ GEM
17
17
  mutex_m
18
18
  tzinfo (~> 2.0)
19
19
  ast (2.4.2)
20
+ backport (1.2.0)
20
21
  base64 (0.2.0)
22
+ benchmark (0.3.0)
21
23
  bigdecimal (3.1.7)
22
24
  coderay (1.1.3)
23
25
  concurrent-ruby (1.2.3)
24
26
  connection_pool (2.4.1)
25
27
  diff-lcs (1.5.1)
26
28
  drb (2.2.1)
29
+ e2mmap (0.1.0)
27
30
  factory_bot (6.4.6)
28
31
  activesupport (>= 5.0.0)
29
32
  hana (1.3.7)
30
33
  i18n (1.14.4)
31
34
  concurrent-ruby (~> 1.0)
35
+ jaro_winkler (1.5.6)
32
36
  json (2.7.2)
33
37
  json_schemer (2.2.1)
34
38
  base64
@@ -36,10 +40,16 @@ GEM
36
40
  hana (~> 1.3)
37
41
  regexp_parser (~> 2.0)
38
42
  simpleidn (~> 0.2)
43
+ kramdown (2.4.0)
44
+ rexml
45
+ kramdown-parser-gfm (1.1.0)
46
+ kramdown (~> 2.0)
39
47
  language_server-protocol (3.17.0.3)
40
48
  method_source (1.1.0)
41
49
  minitest (5.22.3)
42
50
  mutex_m (0.2.0)
51
+ nokogiri (1.16.4-x86_64-linux)
52
+ racc (~> 1.4)
43
53
  parallel (1.24.0)
44
54
  parser (3.3.1.0)
45
55
  ast (~> 2.4.1)
@@ -50,7 +60,10 @@ GEM
50
60
  racc (1.7.3)
51
61
  rainbow (3.1.1)
52
62
  rake (13.2.1)
63
+ rbs (2.8.4)
53
64
  regexp_parser (2.9.0)
65
+ reverse_markdown (2.1.1)
66
+ nokogiri
54
67
  rexml (3.2.6)
55
68
  rspec (3.13.0)
56
69
  rspec-core (~> 3.13.0)
@@ -81,12 +94,31 @@ GEM
81
94
  ruby-progressbar (1.13.0)
82
95
  simpleidn (0.2.2)
83
96
  unf (~> 0.1.4)
97
+ solargraph (0.50.0)
98
+ backport (~> 1.2)
99
+ benchmark
100
+ bundler (~> 2.0)
101
+ diff-lcs (~> 1.4)
102
+ e2mmap
103
+ jaro_winkler (~> 1.5)
104
+ kramdown (~> 2.3)
105
+ kramdown-parser-gfm (~> 1.1)
106
+ parser (~> 3.0)
107
+ rbs (~> 2.0)
108
+ reverse_markdown (~> 2.0)
109
+ rubocop (~> 1.38)
110
+ thor (~> 1.0)
111
+ tilt (~> 2.0)
112
+ yard (~> 0.9, >= 0.9.24)
113
+ thor (1.3.1)
114
+ tilt (2.3.0)
84
115
  tzinfo (2.0.6)
85
116
  concurrent-ruby (~> 1.0)
86
117
  unf (0.1.4)
87
118
  unf_ext
88
119
  unf_ext (0.0.9.1)
89
120
  unicode-display_width (2.5.0)
121
+ yard (0.9.36)
90
122
 
91
123
  PLATFORMS
92
124
  x86_64-linux
@@ -99,6 +131,7 @@ DEPENDENCIES
99
131
  rspec (~> 3.0)
100
132
  rubocop (~> 1.21)
101
133
  scheming!
134
+ solargraph
102
135
 
103
136
  BUNDLED WITH
104
137
  2.4.5
data/Rakefile CHANGED
@@ -9,4 +9,9 @@ require 'rubocop/rake_task'
9
9
 
10
10
  RuboCop::RakeTask.new
11
11
 
12
- task default: %i[spec rubocop]
12
+ desc 'Run the type checker'
13
+ task :typecheck do
14
+ sh 'bundle exec solargraph typecheck --level typed'
15
+ end
16
+
17
+ task default: %i[spec rubocop typecheck]
@@ -36,6 +36,7 @@ class Scheming::Attribute::List
36
36
  end
37
37
  alias [] attr
38
38
 
39
+ # @return [Array<Scheming::Attribute>]
39
40
  def required = each.select(&:is_required)
40
41
 
41
42
  # @return [Hash<Symbol, Scheming::Attribute>]
@@ -9,7 +9,7 @@ class Scheming::DSL::Tagging
9
9
  # creation of an [Scheming::Attribute]
10
10
  #
11
11
  class Tag
12
- # @param name [Symbo]
12
+ # @param name [Symbol]
13
13
  # @param data [Hash<Symbol, Object>]
14
14
  def initialize(name, data)
15
15
  @name = name
@@ -33,4 +33,11 @@ module Scheming::DSL::TypeSpecs
33
33
  end
34
34
  Scheming::Type::Union.new(types)
35
35
  end
36
+
37
+ def Tuple(*type_specs) # rubocop:disable Naming/MethodName
38
+ types = type_specs.map do |type_spec|
39
+ Scheming::DSL::TypeResolver.resolve(type_spec)
40
+ end
41
+ Scheming::Type::Tuple.new(types.freeze)
42
+ end
36
43
  end
@@ -31,7 +31,7 @@ module Scheming::Schema
31
31
  def required
32
32
  attributes
33
33
  .required
34
- .map! { |attr| attr.field_name.to_s.freeze }
34
+ .map! { |attr| attr.field_name.name }
35
35
  .freeze
36
36
  end
37
37
 
@@ -49,6 +49,18 @@ module Scheming::Schema
49
49
  def schema = { oneOf: types.map(&:schema).freeze }
50
50
  end
51
51
 
52
+ refine Scheming::Type::Tuple do
53
+ # @!attribute [r] types
54
+ # @return [Array<Scheming::Type::Base>]
55
+
56
+ def schema
57
+ {
58
+ type: 'array',
59
+ prefixItems: types.map(&:schema).freeze
60
+ }.freeze
61
+ end
62
+ end
63
+
52
64
  refine Scheming::Type::Nullable do
53
65
  # @!attribute [r] type
54
66
  # @return [Scheming::Type::Base]
data/lib/scheming/type.rb CHANGED
@@ -1,5 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # This is a redundant require statement; however,
4
+ # for some reason Solargraph will not honor the
5
+ # path for `set` in it's config. For this reson
6
+ # we need to require it here to prevent typecheck
7
+ # errors.
8
+ require 'set' # rubocop:disable Lint/RedundantRequireStatement
9
+
3
10
  # = Type
4
11
  #
5
12
  # Everything needed to describe and work
@@ -11,7 +18,11 @@ module Scheming::Type
11
18
  # Any and all shared functionality comes from
12
19
  # this base type definition.
13
20
  #
14
- Base = Class.new
21
+ class Base
22
+ # This class left empty on purpose. Acts
23
+ # merely as a tag which all types inherit
24
+ # back to.
25
+ end
15
26
 
16
27
  # = Object Type Definition
17
28
  #
@@ -30,6 +41,25 @@ module Scheming::Type
30
41
  end
31
42
  end
32
43
 
44
+ # = Tuple Type Definition
45
+ #
46
+ # Specifies a type which specifies specific types
47
+ # in a fixed order. Another way to think of it is
48
+ # like an [Scheming::Type::Object] but without named
49
+ # attribute fields.
50
+ #
51
+ class Tuple < Base
52
+ # @return [Array<Scheming::Type::Base>]
53
+ attr_reader :types
54
+
55
+ # @param types [Array<Scheming::Type::Base>]
56
+ def initialize(types)
57
+ super()
58
+ @types = types
59
+ freeze
60
+ end
61
+ end
62
+
33
63
  # = Nullable Type Definition
34
64
  #
35
65
  # Type wrapper that describes a type can be either
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Scheming
4
- VERSION = '0.6.0'
4
+ VERSION = '0.7.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.6.0
4
+ version: 0.7.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-04 00:00:00.000000000 Z
11
+ date: 2024-05-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Ergonomic Data Design for the Masses
14
14
  email:
@@ -19,6 +19,7 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - ".rspec"
21
21
  - ".rubocop.yml"
22
+ - ".solargraph.yml"
22
23
  - CHANGELOG.md
23
24
  - Gemfile
24
25
  - Gemfile.lock