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 +4 -4
- data/lib/anchor/concerns/typeable.rb +2 -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 -14
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8b9afc04c9c59a4f335d1fa3aa40315f95ca9a7aaa93c00cf2f0efe3e55cc696
|
|
4
|
+
data.tar.gz: 97bca89ce7e80fe1b7f3fd483d724c07bb22a0531b0414c5cd4f40fa7f760e4a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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.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-
|
|
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:
|