syntax_tree-json 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e254feef0c7698c445f1f926957850da544b82e3d708a4dced11fad5df81de94
4
- data.tar.gz: 868de6d426b3a22e66f8ddf8e09df6756ca020cf808bd30d909f8994acfd0bef
3
+ metadata.gz: c676b951d917802a8fde6f1f143a31f1709c32567cb8e9863012366da44ce4d5
4
+ data.tar.gz: f6341a94367cb2e1d071683a522cf2458fa37f3e56a9bc7fc9abfc38efa6c476
5
5
  SHA512:
6
- metadata.gz: fc062e3bba849e2948de7219e075b4c06c05b49465b2acfbe0237227989a3847f58031424631fb8954ea31e91e100856d66ede53984fb51033438af13f63e95f
7
- data.tar.gz: 5fa6ffe9d9bc18f560e160556369e7717cacd5cf8a0eb172b9f6e33d0d812b51a78e24466ae2ef80bb03c2952cca71a864dab9033d74112ba68adbc87f6e1480
6
+ metadata.gz: 3c70f7298f8292e2b3759d33afb2028f3d550207cba7de7ac02b1fa6ab1f03f1a2914a8258e84f94710bd3ee6dbc4fa6ade42e67fda6e13476b1cbc1a9f527a0
7
+ data.tar.gz: d390116edbbdf9169be5d6734b7532e467eaaf684031fa74e8b5f7ad16dba03a438763fa1924e73fd9f4cd1202f6b7ec951607f79069ee1b3b96d7b13bb67e87
@@ -4,3 +4,7 @@ updates:
4
4
  directory: "/"
5
5
  schedule:
6
6
  interval: "daily"
7
+ - package-ecosystem: "github-actions"
8
+ directory: "/"
9
+ schedule:
10
+ interval: "daily"
@@ -0,0 +1,22 @@
1
+ name: Dependabot auto-merge
2
+ on: pull_request
3
+
4
+ permissions:
5
+ contents: write
6
+ pull-requests: write
7
+
8
+ jobs:
9
+ dependabot:
10
+ runs-on: ubuntu-latest
11
+ if: ${{ github.actor == 'dependabot[bot]' }}
12
+ steps:
13
+ - name: Dependabot metadata
14
+ id: metadata
15
+ uses: dependabot/fetch-metadata@v1.3.3
16
+ with:
17
+ github-token: "${{ secrets.GITHUB_TOKEN }}"
18
+ - name: Enable auto-merge for Dependabot PRs
19
+ run: gh pr merge --auto --merge "$PR_URL"
20
+ env:
21
+ PR_URL: ${{github.event.pull_request.html_url}}
22
+ GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
@@ -1,7 +1,8 @@
1
1
  name: Main
2
2
  on:
3
3
  - push
4
- - pull_request_target
4
+ - pull_request
5
+
5
6
  jobs:
6
7
  ci:
7
8
  name: CI
@@ -10,23 +11,15 @@ jobs:
10
11
  CI: true
11
12
  steps:
12
13
  - uses: actions/checkout@master
14
+ with:
15
+ submodules: recursive
16
+
13
17
  - uses: ruby/setup-ruby@v1
14
18
  with:
15
19
  bundler-cache: true
16
20
  ruby-version: '3.1'
21
+
17
22
  - name: Test
18
- run: bundle exec rake test
19
- automerge:
20
- name: AutoMerge
21
- needs: ci
22
- runs-on: ubuntu-latest
23
- if: github.event_name == 'pull_request_target' && github.actor == 'dependabot[bot]'
24
- steps:
25
- - uses: actions/github-script@v3
26
- with:
27
- script: |
28
- github.pulls.merge({
29
- owner: context.payload.repository.owner.login,
30
- repo: context.payload.repository.name,
31
- pull_number: context.payload.pull_request.number
32
- })
23
+ run: |
24
+ bundle exec rake test
25
+ bundle exec rake stree:check
data/.gitmodules ADDED
@@ -0,0 +1,3 @@
1
+ [submodule "test/JSONTestSuite"]
2
+ path = test/JSONTestSuite
3
+ url = git@github.com:nst/JSONTestSuite.git
data/CHANGELOG.md CHANGED
@@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.3.0] - 2022-08-09
10
+
11
+ ### Changed
12
+
13
+ - Dropped `json` as a dependency, doing all parsing in-gem.
14
+
9
15
  ## [0.2.0] - 2022-05-13
10
16
 
11
17
  ### Changed
data/Gemfile.lock CHANGED
@@ -1,8 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- syntax_tree-json (0.2.0)
5
- json
4
+ syntax_tree-json (0.3.0)
6
5
  prettier_print
7
6
  syntax_tree (>= 2.0.1)
8
7
 
@@ -10,8 +9,7 @@ GEM
10
9
  remote: https://rubygems.org/
11
10
  specs:
12
11
  docile (1.4.0)
13
- json (2.6.1)
14
- minitest (5.15.0)
12
+ minitest (5.16.2)
15
13
  prettier_print (0.1.0)
16
14
  rake (13.0.6)
17
15
  simplecov (0.21.2)
@@ -20,10 +18,11 @@ GEM
20
18
  simplecov_json_formatter (~> 0.1)
21
19
  simplecov-html (0.12.3)
22
20
  simplecov_json_formatter (0.1.4)
23
- syntax_tree (2.5.0)
21
+ syntax_tree (3.3.0)
24
22
  prettier_print
25
23
 
26
24
  PLATFORMS
25
+ arm64-darwin-21
27
26
  x86_64-darwin-21
28
27
  x86_64-linux
29
28
 
data/Rakefile CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "bundler/gem_tasks"
4
4
  require "rake/testtask"
5
+ require "syntax_tree/rake_tasks"
5
6
 
6
7
  Rake::TestTask.new(:test) do |t|
7
8
  t.libs << "test"
@@ -9,4 +10,10 @@ Rake::TestTask.new(:test) do |t|
9
10
  t.test_files = FileList["test/**/*_test.rb"]
10
11
  end
11
12
 
13
+ SOURCE_FILES =
14
+ FileList[%w[Gemfile Rakefile syntax_tree-json.gemspec lib/**/*.rb test/*.rb]]
15
+
16
+ SyntaxTree::Rake::CheckTask.new { |t| t.source_files = SOURCE_FILES }
17
+ SyntaxTree::Rake::WriteTask.new { |t| t.source_files = SOURCE_FILES }
18
+
12
19
  task default: :test
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SyntaxTree
4
+ module JSON
5
+ module AST
6
+ # This is the parent node of all of the nodes in the AST.
7
+ class Node
8
+ def format(q)
9
+ accept(Format.new(q))
10
+ end
11
+
12
+ def pretty_print(q)
13
+ accept(PrettyPrint.new(q))
14
+ end
15
+ end
16
+
17
+ # This represents an array in the tree.
18
+ class Array < Node
19
+ attr_reader :values
20
+
21
+ def initialize(values:)
22
+ @values = values
23
+ end
24
+
25
+ def accept(visitor)
26
+ visitor.visit_array(self)
27
+ end
28
+
29
+ def child_nodes
30
+ values
31
+ end
32
+
33
+ alias deconstruct child_nodes
34
+
35
+ def deconstruct_keys(keys)
36
+ { values: values }
37
+ end
38
+ end
39
+
40
+ # This represents a false in the tree.
41
+ class False < Node
42
+ def accept(visitor)
43
+ visitor.visit_false(self)
44
+ end
45
+
46
+ def child_nodes
47
+ []
48
+ end
49
+
50
+ alias deconstruct child_nodes
51
+
52
+ def deconstruct_keys(keys)
53
+ {}
54
+ end
55
+ end
56
+
57
+ # This represents a null in the tree.
58
+ class Null < Node
59
+ def accept(visitor)
60
+ visitor.visit_null(self)
61
+ end
62
+
63
+ def child_nodes
64
+ []
65
+ end
66
+
67
+ alias deconstruct child_nodes
68
+
69
+ def deconstruct_keys(keys)
70
+ {}
71
+ end
72
+ end
73
+
74
+ # This represents a number in the tree.
75
+ class Number < Node
76
+ attr_reader :value
77
+
78
+ def initialize(value:)
79
+ @value = value
80
+ end
81
+
82
+ def accept(visitor)
83
+ visitor.visit_number(self)
84
+ end
85
+
86
+ def child_nodes
87
+ []
88
+ end
89
+
90
+ alias deconstruct child_nodes
91
+
92
+ def deconstruct_keys(keys)
93
+ { value: value }
94
+ end
95
+ end
96
+
97
+ # This represents an object in the tree.
98
+ class Object < Node
99
+ attr_reader :values
100
+
101
+ def initialize(values:)
102
+ @values = values
103
+ end
104
+
105
+ def accept(visitor)
106
+ visitor.visit_object(self)
107
+ end
108
+
109
+ def child_nodes
110
+ values.values
111
+ end
112
+
113
+ alias deconstruct child_nodes
114
+
115
+ def deconstruct_keys(keys)
116
+ { values: values }
117
+ end
118
+ end
119
+
120
+ # This is the top of the JSON syntax tree.
121
+ class Root < Node
122
+ attr_reader :value
123
+
124
+ def initialize(value:)
125
+ @value = value
126
+ end
127
+
128
+ def accept(visitor)
129
+ visitor.visit_root(self)
130
+ end
131
+
132
+ def child_nodes
133
+ [value]
134
+ end
135
+
136
+ alias deconstruct child_nodes
137
+
138
+ def deconstruct_keys(keys)
139
+ { value: value }
140
+ end
141
+ end
142
+
143
+ # This represents a string in the tree.
144
+ class String < Node
145
+ attr_reader :value
146
+
147
+ def initialize(value:)
148
+ @value = value
149
+ end
150
+
151
+ def accept(visitor)
152
+ visitor.visit_string(self)
153
+ end
154
+
155
+ def child_nodes
156
+ []
157
+ end
158
+
159
+ alias deconstruct child_nodes
160
+
161
+ def deconstruct_keys(keys)
162
+ { value: value }
163
+ end
164
+ end
165
+
166
+ # This represents a true in the tree.
167
+ class True < Node
168
+ def accept(visitor)
169
+ visitor.visit_true(self)
170
+ end
171
+
172
+ def child_nodes
173
+ []
174
+ end
175
+
176
+ alias deconstruct child_nodes
177
+
178
+ def deconstruct_keys(keys)
179
+ {}
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SyntaxTree
4
+ module JSON
5
+ # This class is a visitor responsible for formatting the AST.
6
+ class Format < Visitor
7
+ attr_reader :q
8
+
9
+ def initialize(q)
10
+ @q = q
11
+ end
12
+
13
+ # Visit an AST::Array node.
14
+ def visit_array(node)
15
+ q.group do
16
+ q.text("[")
17
+
18
+ q.indent do
19
+ q.breakable("")
20
+ q.seplist(node.values) { |value| visit(value) }
21
+ end
22
+
23
+ q.breakable("")
24
+ q.text("]")
25
+ end
26
+ end
27
+
28
+ # Visit an AST::False node.
29
+ def visit_false(node)
30
+ q.text("false")
31
+ end
32
+
33
+ # Visit an AST::Null node.
34
+ def visit_null(node)
35
+ q.text("null")
36
+ end
37
+
38
+ # Visit an AST::Number node.
39
+ def visit_number(node)
40
+ q.text(node.value)
41
+ end
42
+
43
+ # Visit an AST::Object node.
44
+ def visit_object(node)
45
+ q.group do
46
+ q.text("{")
47
+
48
+ q.indent do
49
+ q.breakable
50
+ q.seplist(node.values, nil, :each_pair) do |key, value|
51
+ q.group do
52
+ q.text(key)
53
+ q.text(": ")
54
+ visit(value)
55
+ end
56
+ end
57
+ end
58
+
59
+ q.breakable
60
+ q.text("}")
61
+ end
62
+ end
63
+
64
+ # Visit an AST::Root node.
65
+ def visit_root(node)
66
+ visit(node.value)
67
+ q.breakable(force: true)
68
+ end
69
+
70
+ # Visit an AST::String node.
71
+ def visit_string(node)
72
+ q.text(node.value)
73
+ end
74
+
75
+ # Visit an AST::True node.
76
+ def visit_true(node)
77
+ q.text("true")
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SyntaxTree
4
+ module JSON
5
+ # This class is responsible for converting from a plain string input into
6
+ # an AST.
7
+ class Parser
8
+ class ParseError < StandardError
9
+ end
10
+
11
+ attr_reader :source
12
+
13
+ def initialize(source)
14
+ @source = source
15
+ end
16
+
17
+ def parse
18
+ if parse_item(make_tokens) in [value, []]
19
+ AST::Root.new(value: value)
20
+ else
21
+ raise ParseError, "unexpected tokens after value"
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ # This represents a parsed token from the source.
28
+ class Token
29
+ attr_reader :type, :value
30
+
31
+ def initialize(type:, value: nil)
32
+ @type = type
33
+ @value = value
34
+ end
35
+
36
+ def deconstruct_keys(keys)
37
+ { type: type, value: value }
38
+ end
39
+ end
40
+
41
+ def make_tokens
42
+ buffer = source.dup.force_encoding("UTF-8")
43
+ raise ParseError, "invalid UTF-8" unless buffer.valid_encoding?
44
+
45
+ tokens = []
46
+ buffer.gsub!(/\A\s+/, "")
47
+
48
+ until buffer.empty?
49
+ tokens << case buffer
50
+ in /\A[\{\}\[\],:]/
51
+ Token.new(type: $&.to_sym)
52
+ in /\A-?(0|[1-9]\d*)(\.\d+)?([Ee][-+]?\d+)?/
53
+ Token.new(type: :number, value: $&)
54
+ in %r{\A"[^"\\\t\n\x00]*(?:\\[bfnrtu\\/"][^"\\]*)*"}
55
+ Token.new(type: :string, value: $&)
56
+ in /\Atrue/
57
+ Token.new(type: :true)
58
+ in /\Afalse/
59
+ Token.new(type: :false)
60
+ in /\Anull/
61
+ Token.new(type: :null)
62
+ else
63
+ raise ParseError, "unexpected token: #{buffer[0]}"
64
+ end
65
+
66
+ buffer = $'.gsub(/\A\s+/, "")
67
+ end
68
+
69
+ tokens
70
+ end
71
+
72
+ def parse_array(tokens)
73
+ values = []
74
+
75
+ loop do
76
+ value, tokens = parse_item(tokens)
77
+ values << value
78
+
79
+ case tokens
80
+ in [Token[type: :"]"], *rest]
81
+ return AST::Array.new(values: values), rest
82
+ in [Token[type: :","], *rest]
83
+ tokens = rest
84
+ else
85
+ raise ParseError, "expected ',' or ']' after array value"
86
+ end
87
+ end
88
+ end
89
+
90
+ def parse_object(tokens)
91
+ values = {}
92
+
93
+ loop do
94
+ if tokens in [{ type: :string, value: key }, { type: :":" }, *tokens]
95
+ value, tokens = parse_item(tokens)
96
+ values[key] = value
97
+
98
+ case tokens
99
+ in [{ type: :"}" }, *rest]
100
+ return AST::Object.new(values: values), rest
101
+ in [{ type: :"," }, *rest]
102
+ tokens = rest
103
+ else
104
+ raise ParseError, "expected ',' or '}' after object value"
105
+ end
106
+ else
107
+ raise ParseError, "expected key and ':' after opening '{'"
108
+ end
109
+ end
110
+ end
111
+
112
+ def parse_item(tokens)
113
+ case tokens
114
+ in [{ type: :"[" }, { type: :"]" }, *rest]
115
+ [AST::Array.new(values: []), rest]
116
+ in [{ type: :"[" }, *rest]
117
+ parse_array(rest)
118
+ in [{ type: :"{" }, { type: :"}" }, *rest]
119
+ [AST::Object.new(values: {}), rest]
120
+ in [{ type: :"{" }, *rest]
121
+ parse_object(rest)
122
+ in [{ type: :false }, *rest]
123
+ [AST::False.new, rest]
124
+ in [{ type: :true }, *rest]
125
+ [AST::True.new, rest]
126
+ in [{ type: :null }, *rest]
127
+ [AST::Null.new, rest]
128
+ in [{ type: :string, value: value }, *rest]
129
+ [AST::String.new(value: value), rest]
130
+ in [{ type: :number, value: }, *rest]
131
+ [AST::Number.new(value: value), rest]
132
+ else
133
+ raise ParseError, "unexpected token: #{tokens.first&.type}"
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SyntaxTree
4
+ module JSON
5
+ # This class is a visitor responsible for pretty-printing the AST.
6
+ class PrettyPrint < Visitor
7
+ attr_reader :q
8
+
9
+ def initialize(q)
10
+ @q = q
11
+ end
12
+
13
+ # Visit an AST::Array node.
14
+ def visit_array(node)
15
+ group("array") { field("values", node.values) }
16
+ end
17
+
18
+ # Visit an AST::False node.
19
+ def visit_false(node)
20
+ q.text("false")
21
+ end
22
+
23
+ # Visit an AST::Null node.
24
+ def visit_null(node)
25
+ q.text("null")
26
+ end
27
+
28
+ # Visit an AST::Number node.
29
+ def visit_number(node)
30
+ group("number") { field("value", node.value) }
31
+ end
32
+
33
+ # Visit an AST::Object node.
34
+ def visit_object(node)
35
+ group("object") { field("values", node.values) }
36
+ end
37
+
38
+ # Visit an AST::Root node.
39
+ def visit_root(node)
40
+ group("root") { field("value", node.value) }
41
+ end
42
+
43
+ # Visit an AST::String node.
44
+ def visit_string(node)
45
+ group("string") { field("value", node.value) }
46
+ end
47
+
48
+ # Visit an AST::True node.
49
+ def visit_true(node)
50
+ q.text("true")
51
+ end
52
+
53
+ private
54
+
55
+ def field(name, value)
56
+ q.breakable
57
+ q.text("#{name}=")
58
+ q.pp(value)
59
+ end
60
+
61
+ def group(name)
62
+ q.group do
63
+ q.text("(#{name}")
64
+ q.nest(2) { yield }
65
+ q.breakable("")
66
+ q.text(")")
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SyntaxTree
4
4
  module JSON
5
- VERSION = "0.2.0"
5
+ VERSION = "0.3.0"
6
6
  end
7
7
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SyntaxTree
4
+ module JSON
5
+ # This is the parent class of any visitors for this AST.
6
+ class Visitor
7
+ def visit(node)
8
+ node&.accept(self)
9
+ end
10
+
11
+ def visit_all(nodes)
12
+ nodes.map { |node| visit(node) }
13
+ end
14
+
15
+ def visit_child_nodes(node)
16
+ visit_all(node.child_nodes)
17
+ end
18
+
19
+ # Visit an AST::Array node.
20
+ alias visit_array visit_child_nodes
21
+
22
+ # Visit an AST::False node.
23
+ alias visit_false visit_child_nodes
24
+
25
+ # Visit an AST::Null node.
26
+ alias visit_null visit_child_nodes
27
+
28
+ # Visit an AST::Number node.
29
+ alias visit_number visit_child_nodes
30
+
31
+ # Visit an AST::Object node.
32
+ alias visit_object visit_child_nodes
33
+
34
+ # Visit an AST::Root node.
35
+ alias visit_root visit_child_nodes
36
+
37
+ # Visit an AST::String node.
38
+ alias visit_string visit_child_nodes
39
+
40
+ # Visit an AST::True node.
41
+ alias visit_true visit_child_nodes
42
+ end
43
+ end
44
+ end
@@ -1,131 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "json"
4
3
  require "prettier_print"
5
4
  require "syntax_tree"
6
5
 
6
+ require_relative "json/ast"
7
+ require_relative "json/parser"
7
8
  require_relative "json/version"
9
+ require_relative "json/visitor"
10
+
11
+ require_relative "json/format"
12
+ require_relative "json/pretty_print"
8
13
 
9
14
  module SyntaxTree
10
15
  module JSON
11
- # This is always the root of the syntax tree.
12
- class RootNode < Struct.new(:object)
13
- def format(q)
14
- object.format(q)
15
- q.breakable(force: true)
16
- end
17
-
18
- def pretty_print(q)
19
- q.group(2, "(root", ")") do
20
- q.breakable
21
- q.text("object=")
22
- q.pp(object)
23
- end
24
- end
25
- end
26
-
27
- # This contains an object node. The values argument to the struct is a hash.
28
- class ObjectNode < Struct.new(:values)
29
- def format(q)
30
- q.group do
31
- q.text("{")
32
-
33
- q.indent do
34
- q.breakable
35
- q.seplist(values, nil, :each_pair) do |key, value|
36
- q.group do
37
- q.text(key.to_json)
38
- q.text(": ")
39
- value.format(q)
40
- end
41
- end
42
- end
43
-
44
- q.breakable
45
- q.text("}")
46
- end
47
- end
48
-
49
- def pretty_print(q)
50
- q.group(2, "(object", ")") do
51
- q.breakable
52
- q.text("values=")
53
- q.pp(values)
54
- end
55
- end
56
- end
57
-
58
- # This contains an array node. The values argument to the struct is an
59
- # array.
60
- class ArrayNode < Struct.new(:values)
61
- def format(q)
62
- q.group do
63
- q.text("[")
64
-
65
- q.indent do
66
- q.breakable("")
67
- q.seplist(values) { |value| value.format(q) }
68
- end
69
-
70
- q.breakable("")
71
- q.text("]")
72
- end
73
- end
74
-
75
- def pretty_print(q)
76
- q.group(2, "(array", ")") do
77
- q.breakable
78
- q.text("values=")
79
- q.pp(values)
80
- end
81
- end
82
- end
83
-
84
- # This contains a literal node. The value argument to the struct is a
85
- # literal value like a string, number, or boolean.
86
- class LiteralNode < Struct.new(:value)
87
- def format(q)
88
- q.text(value.to_json)
89
- end
90
-
91
- def pretty_print(q)
92
- q.group(2, "(literal", ")") do
93
- q.breakable
94
- q.text("value=")
95
- q.text(value.inspect)
96
- end
97
- end
98
- end
99
-
100
16
  class << self
101
17
  def format(source, maxwidth = 80)
102
- formatter = PrettierPrint.new([], maxwidth)
103
- parse(source).format(formatter)
104
-
105
- formatter.flush
106
- formatter.output.join
18
+ PrettierPrint.format(+"", maxwidth) do |q|
19
+ parse(source).accept(Format.new(q))
20
+ end
107
21
  end
108
22
 
109
23
  def parse(source)
110
- RootNode.new(translate(::JSON.parse(source)))
24
+ Parser.new(source).parse
111
25
  end
112
26
 
113
27
  def read(filepath)
114
28
  File.read(filepath)
115
29
  end
116
-
117
- private
118
-
119
- def translate(object)
120
- case object
121
- when Hash
122
- ObjectNode.new(object.to_h { |key, value| [key, translate(value)] })
123
- when Array
124
- ArrayNode.new(object.map { |value| translate(value) })
125
- else
126
- LiteralNode.new(object)
127
- end
128
- end
129
30
  end
130
31
  end
131
32
 
@@ -3,27 +3,26 @@
3
3
  require_relative "lib/syntax_tree/json/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = "syntax_tree-json"
7
- spec.version = SyntaxTree::JSON::VERSION
8
- spec.authors = ["Kevin Newton"]
9
- spec.email = ["kddnewton@gmail.com"]
6
+ spec.name = "syntax_tree-json"
7
+ spec.version = SyntaxTree::JSON::VERSION
8
+ spec.authors = ["Kevin Newton"]
9
+ spec.email = ["kddnewton@gmail.com"]
10
10
 
11
- spec.summary = "Syntax Tree support for JSON"
12
- spec.homepage = "https://github.com/ruby-syntax-tree/syntax_tree-json"
13
- spec.license = "MIT"
14
- spec.metadata = { "rubygems_mfa_required" => "true" }
11
+ spec.summary = "Syntax Tree support for JSON"
12
+ spec.homepage = "https://github.com/ruby-syntax-tree/syntax_tree-json"
13
+ spec.license = "MIT"
14
+ spec.metadata = { "rubygems_mfa_required" => "true" }
15
15
 
16
- spec.files = Dir.chdir(__dir__) do
17
- `git ls-files -z`.split("\x0").reject do |f|
18
- f.match(%r{^(test|spec|features)/})
16
+ spec.files =
17
+ Dir.chdir(__dir__) do
18
+ `git ls-files -z`.split("\x0")
19
+ .reject { |f| f.match(%r{^(test|spec|features)/}) }
19
20
  end
20
- end
21
21
 
22
- spec.bindir = "exe"
23
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.bindir = "exe"
23
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  spec.require_paths = %w[lib]
25
25
 
26
- spec.add_dependency "json"
27
26
  spec.add_dependency "prettier_print"
28
27
  spec.add_dependency "syntax_tree", ">= 2.0.1"
29
28
 
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syntax_tree-json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Newton
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-14 00:00:00.000000000 Z
11
+ date: 2022-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: json
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: prettier_print
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -116,8 +102,10 @@ extensions: []
116
102
  extra_rdoc_files: []
117
103
  files:
118
104
  - ".github/dependabot.yml"
105
+ - ".github/workflows/auto-merge.yml"
119
106
  - ".github/workflows/main.yml"
120
107
  - ".gitignore"
108
+ - ".gitmodules"
121
109
  - CHANGELOG.md
122
110
  - Gemfile
123
111
  - Gemfile.lock
@@ -127,7 +115,12 @@ files:
127
115
  - bin/console
128
116
  - bin/setup
129
117
  - lib/syntax_tree/json.rb
118
+ - lib/syntax_tree/json/ast.rb
119
+ - lib/syntax_tree/json/format.rb
120
+ - lib/syntax_tree/json/parser.rb
121
+ - lib/syntax_tree/json/pretty_print.rb
130
122
  - lib/syntax_tree/json/version.rb
123
+ - lib/syntax_tree/json/visitor.rb
131
124
  - syntax_tree-json.gemspec
132
125
  homepage: https://github.com/ruby-syntax-tree/syntax_tree-json
133
126
  licenses: