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 +4 -4
- data/lib/anchor/concerns/typeable.rb +2 -0
- data/lib/anchor/config.rb +8 -0
- data/lib/anchor/inference/jsonapi/infer/anchor_def.rb +2 -2
- data/lib/anchor/inference/jsonapi/infer/filter.rb +13 -0
- data/lib/anchor/inference/jsonapi/infer/relationship_references.rb +3 -3
- data/lib/anchor/json_schema/schema_generator.rb +1 -1
- data/lib/anchor/region.rb +14 -0
- data/lib/anchor/type_script/file_structure.rb +3 -4
- data/lib/anchor/type_script/multifile_save_service.rb +9 -24
- data/lib/anchor/types.rb +45 -0
- data/lib/anchor/version.rb +1 -1
- data/lib/anchor/walk.rb +11 -0
- data/lib/jsonapi-resources-anchor.rb +1 -0
- metadata +5 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '0238cc2e7793daaed5680e5fb3329bc0880c2ef343703250f91a8df3ab33dce4'
|
|
4
|
+
data.tar.gz: f13faa34fa9f7e448610f43a044b955899092ee566129249f2190a8dfebaa48f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
49
|
+
resources(anchor_relationship.resources.map(&:anchor_schema_name))
|
|
50
50
|
else
|
|
51
|
-
|
|
51
|
+
resource(anchor_relationship.resource.anchor_schema_name)
|
|
52
52
|
end
|
|
53
53
|
|
|
54
54
|
if rel.is_a?(::JSONAPI::Relationship::ToMany)
|
|
@@ -16,7 +16,7 @@ module Anchor::Inference::JSONAPI::Infer
|
|
|
16
16
|
return unknown
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
return
|
|
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
|
|
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
|
-
|
|
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::
|
|
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
|
-
[
|
|
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::
|
|
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
|
|
56
|
-
|
|
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
|
|
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
|
data/lib/anchor/version.rb
CHANGED
data/lib/anchor/walk.rb
ADDED
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.
|
|
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-
|
|
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:
|