jsonapi-resources-anchor 2.15.1 → 2.16.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: 5f44e1bcdbc48e8901c4cb5357fb7990b9941c0ad43717d12a0205d712648df0
4
- data.tar.gz: 8ab3a2d26e535943cbf20897fe9d9c71d88de6c2c577d232bdbb4d603da1a188
3
+ metadata.gz: 8b9afc04c9c59a4f335d1fa3aa40315f95ca9a7aaa93c00cf2f0efe3e55cc696
4
+ data.tar.gz: 97bca89ce7e80fe1b7f3fd483d724c07bb22a0531b0414c5cd4f40fa7f760e4a
5
5
  SHA512:
6
- metadata.gz: 657bf977322522f66ce8e834bedb62d93ede3d518d006827ae1e22e05d0ae50c8e717ba6cd4b63b08d17142024696785abd5472775e64179701680bd1bd72757
7
- data.tar.gz: bb9a45159038719f0ded55b3d9d7fd54e166a2acb880229b777c2bb7aee90205604484ea3fb7a8a9ce8a3dade1eac7e368ccc9dc832aa35585b527cbf87cec95
6
+ metadata.gz: 828d73a8dcf74a00f4de0aa85d66c830775d187d65555599a2452e285666832b97a8fe2ed3a8cedad75cffc850349cca38b8991c4d638c5775d0a416e0fce034
7
+ data.tar.gz: 4995651e8c865620224d9515e816f767940232d3b6395274f4db488e0712e421e38997d47bcf472bf8f9d6f7f66ea3027109fe7f7ee9c55367f9ea741ffa458e
@@ -12,6 +12,8 @@ module Anchor
12
12
  def literals(values) = union(values.map { |value| literal(value) })
13
13
  def reference(...) = Anchor::Types::Reference.new(...)
14
14
  def references(names) = union(names.map { |name| reference(name) })
15
+ def resource(...) = Anchor::Types::Resource.new(...)
16
+ def resources(names) = union(names.map { |name| resource(name) })
15
17
  def record(value_type = Anchor::Types::Unknown) = Anchor::Types::Record.new(value_type)
16
18
 
17
19
  def boolean = Anchor::Types::Boolean
@@ -46,9 +46,9 @@ module Anchor::Inference::JSONAPI::Infer
46
46
  polymorphic = anchor_relationship.resources.present?
47
47
 
48
48
  base_type = if polymorphic
49
- references(anchor_relationship.resources.map(&:anchor_schema_name))
49
+ resources(anchor_relationship.resources.map(&:anchor_schema_name))
50
50
  else
51
- reference(anchor_relationship.resource.anchor_schema_name)
51
+ resource(anchor_relationship.resource.anchor_schema_name)
52
52
  end
53
53
 
54
54
  if rel.is_a?(::JSONAPI::Relationship::ToMany)
@@ -0,0 +1,13 @@
1
+ module Anchor::Inference::JSONAPI::Infer
2
+ class Filter < Base
3
+ def infer = object(properties)
4
+
5
+ private
6
+
7
+ def properties
8
+ filters.map { |name, _opts| property(name.to_s, unknown) }
9
+ end
10
+
11
+ def filters = @klass._allowed_filters
12
+ end
13
+ end
@@ -16,7 +16,7 @@ module Anchor::Inference::JSONAPI::Infer
16
16
  return unknown
17
17
  end
18
18
 
19
- return reference(rel.resource_klass.anchor_schema_name) unless rel.polymorphic?
19
+ return resource(rel.resource_klass.anchor_schema_name) unless rel.polymorphic?
20
20
 
21
21
  version = nil
22
22
  version ||= rel.respond_to?(:polymorphic_types) && :new # 0.11.0.beta2
@@ -27,10 +27,10 @@ module Anchor::Inference::JSONAPI::Infer
27
27
  when :old then rel.class.polymorphic_types
28
28
  end
29
29
 
30
- return reference(rel.resource_klass.anchor_schema_name) unless polymorphic_types
30
+ return resource(rel.resource_klass.anchor_schema_name) unless polymorphic_types
31
31
 
32
32
  resource_klasses = polymorphic_types.map { |t| @klass.resource_klass_for(t) }
33
- union(resource_klasses.map { |rk| reference(rk.anchor_schema_name) })
33
+ resources(resource_klasses.map(&:anchor_schema_name))
34
34
  end
35
35
 
36
36
  def relationships = @klass._relationships
@@ -27,7 +27,7 @@ module Anchor::JSONSchema
27
27
  # @return [Anchor::Types::Object]
28
28
  def root_object
29
29
  properties = resources.map do |resource|
30
- Types::Property.new(resource.anchor_schema_name.underscore, Types::Reference.new(resource.anchor_schema_name))
30
+ Types::Property.new(resource.anchor_schema_name.underscore, Types::Resource.new(resource.anchor_schema_name))
31
31
  end
32
32
 
33
33
  Types::Object.new(properties)
@@ -0,0 +1,14 @@
1
+ module Anchor
2
+ class Region
3
+ def initialize(start_marker:, end_marker:)
4
+ @start_marker = start_marker
5
+ @end_marker = end_marker
6
+ end
7
+
8
+ def present?(text) = text.match?(regex)
9
+ def replace(text:, content:) = text.gsub(regex) { content[regex] }
10
+ def fence(content) = [@start_marker, content, @end_marker].join("\n")
11
+
12
+ def regex = /#{Regexp.escape(@start_marker)}(.*?)#{Regexp.escape(@end_marker)}/m
13
+ end
14
+ end
@@ -42,10 +42,8 @@ module Anchor::TypeScript
42
42
  export_string = FileUtils.export_code(@definition.name)
43
43
 
44
44
  if manually_editable
45
- start_autogen = "// START AUTOGEN\n"
46
- end_autogen = "// END AUTOGEN\n"
47
45
  unedited_export_def = "type #{@name} = Model;\n"
48
- [start_autogen, imports_string, typedef, end_autogen, unedited_export_def, export_string].join("\n")
46
+ [Anchor::TypeScript::MultifileSaveService.default_region.fence([imports_string, typedef].join("\n")), unedited_export_def, export_string].join("\n")
49
47
  else
50
48
  [imports_string, typedef, export_string].join("\n")
51
49
  end
@@ -80,8 +78,9 @@ module Anchor::TypeScript
80
78
  case type
81
79
  when Anchor::Types::Array, Anchor::Types::Maybe, Anchor::Types::Identity then references_from_type(type.type)
82
80
  when Anchor::Types::Union then type.types.flat_map { |t| references_from_type(t) }
83
- when Anchor::Types::Reference then [type]
81
+ when Anchor::Types::Resource then [type]
84
82
  when Anchor::Types::Unknown.singleton_class then []
83
+ else []
85
84
  end.uniq.sort_by(&:anchor_schema_name)
86
85
  end
87
86
 
@@ -1,9 +1,5 @@
1
1
  module Anchor::TypeScript
2
2
  class MultifileSaveService
3
- START_MARKER = "// START AUTOGEN\n"
4
- END_MARKER = "\n// END AUTOGEN\n"
5
- REGEX = /#{Regexp.escape(START_MARKER)}(.*?)#{Regexp.escape(END_MARKER)}/m
6
-
7
3
  def self.call(...)
8
4
  new(...).call
9
5
  end
@@ -23,6 +19,12 @@ module Anchor::TypeScript
23
19
  modified_files
24
20
  end
25
21
 
22
+ def self.default_region
23
+ start_marker = "// START AUTOGEN\n"
24
+ end_marker = "// END AUTOGEN\n"
25
+ Anchor::Region.new(start_marker:, end_marker:)
26
+ end
27
+
26
28
  private
27
29
 
28
30
  def sha_hash_path
@@ -52,11 +54,8 @@ module Anchor::TypeScript
52
54
 
53
55
  existing_content = File.read(path)
54
56
 
55
- new_content = if manually_editable?(existing_content)
56
- replace_between(
57
- existing: existing_content,
58
- new: result.text,
59
- )
57
+ new_content = if manually_editable_file?(existing_content)
58
+ self.class.default_region.replace(text: existing_content, content: result.text)
60
59
  else
61
60
  result.text
62
61
  end
@@ -65,20 +64,6 @@ module Anchor::TypeScript
65
64
  result.name
66
65
  end
67
66
 
68
- def manually_editable?(text)
69
- !text.match(REGEX).nil?
70
- end
71
-
72
- def replace_between(existing:, new:)
73
- new_content = extract_between(new)
74
- raise "Was @generator initialized with manually_editable: false?" unless new_content
75
-
76
- existing.gsub(REGEX, "#{START_MARKER}\n#{new_content}\n#{END_MARKER}")
77
- end
78
-
79
- def extract_between(text)
80
- match = text.match(REGEX)
81
- match[1].strip
82
- end
67
+ def manually_editable_file?(text) = self.class.default_region.present?(text)
83
68
  end
84
69
  end
data/lib/anchor/types.rb CHANGED
@@ -1,5 +1,48 @@
1
1
  module Anchor
2
2
  module Types
3
+ class NodeStream
4
+ include Enumerable
5
+
6
+ def initialize(root) = @root = root
7
+
8
+ def each(&blk)
9
+ return enum_for(:each) unless blk
10
+ walk(@root, &blk)
11
+ end
12
+
13
+ def of_kind(klass)
14
+ select { |n| n.is_a?(Class) ? n <= klass : n.is_a?(klass) }
15
+ end
16
+
17
+ def enums = of_kind(Anchor::Types::Enum)
18
+ def references = of_kind(Anchor::Types::Reference)
19
+ def resources = of_kind(Anchor::Types::Resource)
20
+
21
+ private
22
+
23
+ def walk(node, &blk)
24
+ yield(node)
25
+ Anchor::Types.children(node).each { |c| walk(c, &blk) }
26
+ end
27
+ end
28
+
29
+ class << self
30
+ def children(node) = default_children(node)
31
+
32
+ def default_children(node)
33
+ case node
34
+ when Anchor::Types::Array, Anchor::Types::Maybe, Anchor::Types::Identity then [node.type]
35
+ when Anchor::Types::Union, Anchor::Types::Intersection then node.types
36
+ when Anchor::Types::Record then [node.value_type]
37
+ when Anchor::Types::Object then node.properties
38
+ when Anchor::Types::Property then [node.type]
39
+ else []
40
+ end
41
+ end
42
+
43
+ def each_node(node) = Anchor::Types::NodeStream.new(node)
44
+ end
45
+
3
46
  class String; end
4
47
  class Float; end
5
48
  class Integer; end
@@ -66,6 +109,8 @@ module Anchor
66
109
  end
67
110
  end
68
111
 
112
+ class Resource < Reference; end
113
+
69
114
  Property = Data.define(:name, :type, :optional, :description) do
70
115
  def initialize(name:, type:, optional: false, description: nil)
71
116
  super
@@ -1,3 +1,3 @@
1
1
  module Anchor
2
- VERSION = "2.15.1"
2
+ VERSION = "2.16.0"
3
3
  end
@@ -0,0 +1,11 @@
1
+ module Anchor
2
+ module Types
3
+ class Walk
4
+ def self.call(...) = new(...).call
5
+
6
+ def initialize(type)
7
+ @type = type
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,5 @@
1
1
  require "anchor/types"
2
+ require "anchor/region"
2
3
  require "anchor/anchor"
3
4
  require "anchor/config"
4
5
  require "anchor/schema_generator"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi-resources-anchor
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.15.1
4
+ version: 2.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-06 00:00:00.000000000 Z
11
+ date: 2026-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jsonapi-resources
@@ -31,9 +31,6 @@ dependencies:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '7.0'
34
- - - "<"
35
- - !ruby/object:Gem::Version
36
- version: '8.1'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -41,9 +38,6 @@ dependencies:
41
38
  - - ">="
42
39
  - !ruby/object:Gem::Version
43
40
  version: '7.0'
44
- - - "<"
45
- - !ruby/object:Gem::Version
46
- version: '8.1'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: rspec-rails
49
43
  requirement: !ruby/object:Gem::Requirement
@@ -51,9 +45,6 @@ dependencies:
51
45
  - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '7.0'
54
- - - "<"
55
- - !ruby/object:Gem::Version
56
- version: '8.1'
57
48
  type: :development
58
49
  prerelease: false
59
50
  version_requirements: !ruby/object:Gem::Requirement
@@ -61,9 +52,6 @@ dependencies:
61
52
  - - ">="
62
53
  - !ruby/object:Gem::Version
63
54
  version: '7.0'
64
- - - "<"
65
- - !ruby/object:Gem::Version
66
- version: '8.1'
67
55
  - !ruby/object:Gem::Dependency
68
56
  name: yard
69
57
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +111,7 @@ files:
123
111
  - lib/anchor/inference/jsonapi/infer.rb
124
112
  - lib/anchor/inference/jsonapi/infer/anchor_def.rb
125
113
  - lib/anchor/inference/jsonapi/infer/base.rb
114
+ - lib/anchor/inference/jsonapi/infer/filter.rb
126
115
  - lib/anchor/inference/jsonapi/infer/rbs.rb
127
116
  - lib/anchor/inference/jsonapi/infer/relationship_references.rb
128
117
  - lib/anchor/inference/jsonapi/infer/resource.rb
@@ -139,6 +128,7 @@ files:
139
128
  - lib/anchor/json_schema/resource.rb
140
129
  - lib/anchor/json_schema/schema_generator.rb
141
130
  - lib/anchor/json_schema/serializer.rb
131
+ - lib/anchor/region.rb
142
132
  - lib/anchor/schema.rb
143
133
  - lib/anchor/schema_generator.rb
144
134
  - lib/anchor/type_script/file_structure.rb
@@ -152,6 +142,7 @@ files:
152
142
  - lib/anchor/types/inference/active_record.rb
153
143
  - lib/anchor/types/inference/rbs.rb
154
144
  - lib/anchor/version.rb
145
+ - lib/anchor/walk.rb
155
146
  - lib/jsonapi-resources-anchor.rb
156
147
  homepage:
157
148
  licenses: