jsonapi-resources-anchor 2.15.2 → 2.17.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: 5d5f54585ae913c5533f99b312ebe1b2dd25736bc5b8cf49731c446ceb5ca02c
4
- data.tar.gz: 138faf01fc6905fbaeb840e6a7f101f32ab59a5f9053daaa0092d61ad94ee996
3
+ metadata.gz: '0238cc2e7793daaed5680e5fb3329bc0880c2ef343703250f91a8df3ab33dce4'
4
+ data.tar.gz: f13faa34fa9f7e448610f43a044b955899092ee566129249f2190a8dfebaa48f
5
5
  SHA512:
6
- metadata.gz: 11c448a453c9c3e7c6588f215416d5490a0639f6b70c04fe8e9db9c66d528342f0adc520696d210d7772896ed1493b51c3078c31b922e7837cfa0f0fe5521db4
7
- data.tar.gz: 617bfc58d632a35abe3241011f9c537587fb42accd6337ffa8f0a9509a9ff421c57705bd9fc27b1fdafc5457f6b80355625be829b1794281ecc50902cc626221
6
+ metadata.gz: fd5b60395a3f22729fd1913d74f63a944c089f4c2be831d7342e06788a7833b242e77db7dec6f0e536eb2d9d48e4cdcbd63f7a8276b95df4cd40a47378e66215
7
+ data.tar.gz: 8130d269f7f622d6a37a9b78a218ab9d19df5f4a59fdffed70827533b55da228a72b9f86e76d14e60d1c80b75e34cbbce43e63299a3adff4ad17622995b5dbfc
@@ -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
data/lib/anchor/config.rb CHANGED
@@ -31,5 +31,13 @@ module Anchor
31
31
  @rbs = "off"
32
32
  @rbs_sig_path = Rails.root.join("sig")
33
33
  end
34
+
35
+ def with_config(**overrides)
36
+ originals = overrides.keys.index_with { |key| public_send(key) }
37
+ overrides.each { |key, val| public_send("#{key}=", val) }
38
+ yield
39
+ ensure
40
+ originals.each { |key, val| public_send("#{key}=", val) }
41
+ end
34
42
  end
35
43
  end
@@ -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.2"
2
+ VERSION = "2.17.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.2
4
+ version: 2.17.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-06-16 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
@@ -111,6 +111,7 @@ files:
111
111
  - lib/anchor/inference/jsonapi/infer.rb
112
112
  - lib/anchor/inference/jsonapi/infer/anchor_def.rb
113
113
  - lib/anchor/inference/jsonapi/infer/base.rb
114
+ - lib/anchor/inference/jsonapi/infer/filter.rb
114
115
  - lib/anchor/inference/jsonapi/infer/rbs.rb
115
116
  - lib/anchor/inference/jsonapi/infer/relationship_references.rb
116
117
  - lib/anchor/inference/jsonapi/infer/resource.rb
@@ -127,6 +128,7 @@ files:
127
128
  - lib/anchor/json_schema/resource.rb
128
129
  - lib/anchor/json_schema/schema_generator.rb
129
130
  - lib/anchor/json_schema/serializer.rb
131
+ - lib/anchor/region.rb
130
132
  - lib/anchor/schema.rb
131
133
  - lib/anchor/schema_generator.rb
132
134
  - lib/anchor/type_script/file_structure.rb
@@ -140,6 +142,7 @@ files:
140
142
  - lib/anchor/types/inference/active_record.rb
141
143
  - lib/anchor/types/inference/rbs.rb
142
144
  - lib/anchor/version.rb
145
+ - lib/anchor/walk.rb
143
146
  - lib/jsonapi-resources-anchor.rb
144
147
  homepage:
145
148
  licenses: