query-ruby 0.1.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 +7 -0
- data/.github/dependabot.yml +15 -0
- data/.github/workflows/ci.yml +38 -0
- data/.gitignore +30 -0
- data/.node-version +1 -0
- data/.npm-version +1 -0
- data/.prettierignore +2 -0
- data/.rspec +1 -0
- data/.rubocop.yml +130 -0
- data/.ruby-version +1 -0
- data/.tool-versions +3 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +249 -0
- data/LICENSE +19 -0
- data/README.md +3 -0
- data/Rakefile +5 -0
- data/VERSION +1 -0
- data/bin/query +52 -0
- data/lib/query/combiner.rb +33 -0
- data/lib/query/decompiler.rb +41 -0
- data/lib/query/node/base_10.rb +22 -0
- data/lib/query/node/base_16.rb +17 -0
- data/lib/query/node/base_2.rb +17 -0
- data/lib/query/node/base_8.rb +17 -0
- data/lib/query/node/boolean.rb +46 -0
- data/lib/query/node/decimal.rb +25 -0
- data/lib/query/node/key.rb +17 -0
- data/lib/query/node/key_value.rb +23 -0
- data/lib/query/node/number.rb +27 -0
- data/lib/query/node/operator.rb +35 -0
- data/lib/query/node/part.rb +21 -0
- data/lib/query/node/query.rb +17 -0
- data/lib/query/node/range.rb +23 -0
- data/lib/query/node/string.rb +17 -0
- data/lib/query/node/text.rb +17 -0
- data/lib/query/node/value.rb +27 -0
- data/lib/query/node.rb +9 -0
- data/lib/query/parser/boolean.rb +24 -0
- data/lib/query/parser/key.rb +11 -0
- data/lib/query/parser/key_value.rb +13 -0
- data/lib/query/parser/number.rb +158 -0
- data/lib/query/parser/operator.rb +42 -0
- data/lib/query/parser/part.rb +11 -0
- data/lib/query/parser/query.rb +15 -0
- data/lib/query/parser/range.rb +32 -0
- data/lib/query/parser/string.rb +44 -0
- data/lib/query/parser/text.rb +40 -0
- data/lib/query/parser/value.rb +11 -0
- data/lib/query/parser/whitespace.rb +19 -0
- data/lib/query/parser.rb +21 -0
- data/lib/query/version.rb +6 -0
- data/lib/query-ruby.rb +14 -0
- data/lib/query.rb +29 -0
- data/package-lock.json +14 -0
- data/package.json +7 -0
- data/query-ruby.gemspec +26 -0
- data/spec/query_spec.rb +73 -0
- data/spec/spec_helper.rb +1 -0
- metadata +182 -0
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Query
|
4
|
+
class Parser
|
5
|
+
class String < Language
|
6
|
+
def double_quote
|
7
|
+
str('"')
|
8
|
+
end
|
9
|
+
|
10
|
+
def single_quote
|
11
|
+
str("'")
|
12
|
+
end
|
13
|
+
|
14
|
+
def backslash
|
15
|
+
str("\\")
|
16
|
+
end
|
17
|
+
|
18
|
+
def special
|
19
|
+
str("...") | str("..") | Whitespace | Operator
|
20
|
+
end
|
21
|
+
|
22
|
+
def double_quoted_string
|
23
|
+
double_quote.ignore << (
|
24
|
+
(backslash.ignore << double_quote) | (double_quote.absent << any)
|
25
|
+
).repeat << double_quote.maybe.ignore
|
26
|
+
end
|
27
|
+
|
28
|
+
def single_quoted_string
|
29
|
+
single_quote.ignore << (
|
30
|
+
(backslash.ignore << single_quote) | (single_quote.absent << any)
|
31
|
+
).repeat << single_quote.maybe.ignore
|
32
|
+
end
|
33
|
+
|
34
|
+
def root
|
35
|
+
(
|
36
|
+
(
|
37
|
+
double_quoted_string | single_quoted_string |
|
38
|
+
(special.absent << any).repeat(1)
|
39
|
+
) << special.present
|
40
|
+
).aka(:string)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Query
|
4
|
+
class Parser
|
5
|
+
class Text < Language
|
6
|
+
def double_quote
|
7
|
+
str('"')
|
8
|
+
end
|
9
|
+
|
10
|
+
def single_quote
|
11
|
+
str("'")
|
12
|
+
end
|
13
|
+
|
14
|
+
def backslash
|
15
|
+
str("\\")
|
16
|
+
end
|
17
|
+
|
18
|
+
def double_quoted_string
|
19
|
+
double_quote.ignore << (
|
20
|
+
(backslash.ignore << double_quote) | (double_quote.absent << any)
|
21
|
+
).repeat << double_quote.maybe.ignore
|
22
|
+
end
|
23
|
+
|
24
|
+
def single_quoted_string
|
25
|
+
single_quote.ignore << (
|
26
|
+
(backslash.ignore << single_quote) | (single_quote.absent << any)
|
27
|
+
).repeat << single_quote.maybe.ignore
|
28
|
+
end
|
29
|
+
|
30
|
+
def root
|
31
|
+
(
|
32
|
+
(
|
33
|
+
double_quoted_string | single_quoted_string |
|
34
|
+
(Whitespace.absent << any).repeat(1)
|
35
|
+
) << Whitespace.present
|
36
|
+
).aka(:text)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Query
|
4
|
+
class Parser
|
5
|
+
class Whitespace < Language
|
6
|
+
def space
|
7
|
+
str(" ")
|
8
|
+
end
|
9
|
+
|
10
|
+
def newline
|
11
|
+
str("\n") | str("\r")
|
12
|
+
end
|
13
|
+
|
14
|
+
def root
|
15
|
+
(space | newline).repeat(1).ignore | any.absent
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/query/parser.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Query
|
4
|
+
class Parser
|
5
|
+
def initialize(source)
|
6
|
+
@source = source
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.parse(...)
|
10
|
+
new(...).parse
|
11
|
+
end
|
12
|
+
|
13
|
+
def parse
|
14
|
+
Query.parse(source)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :source
|
20
|
+
end
|
21
|
+
end
|
data/lib/query-ruby.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/all"
|
4
|
+
require "json"
|
5
|
+
require "language-ruby"
|
6
|
+
require "zeitwerk"
|
7
|
+
|
8
|
+
loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
|
9
|
+
loader.ignore("#{__dir__}/query-ruby.rb")
|
10
|
+
loader.setup
|
11
|
+
|
12
|
+
class Object
|
13
|
+
alias is_an? is_a?
|
14
|
+
end
|
data/lib/query.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Query
|
4
|
+
attr_accessor :source
|
5
|
+
|
6
|
+
def initialize(source)
|
7
|
+
self.source = source
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.parse(source)
|
11
|
+
Parser.parse(source).to_raw
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.decompile(parsed)
|
15
|
+
Decompiler.decompile(parsed)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.combine(*sources)
|
19
|
+
Combiner.combine(*sources)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.evaluate(...)
|
23
|
+
new(...).evaluate
|
24
|
+
end
|
25
|
+
|
26
|
+
def evaluate
|
27
|
+
Node::Query.new(Query.parse(source)).evaluate
|
28
|
+
end
|
29
|
+
end
|
data/package-lock.json
ADDED
data/package.json
ADDED
data/query-ruby.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "query-ruby"
|
5
|
+
s.version = File.read("VERSION").strip
|
6
|
+
s.summary = "a querying language for the internet"
|
7
|
+
s.description = s.summary
|
8
|
+
s.authors = ["Dorian Marié"]
|
9
|
+
s.email = "dorian@dorianmarie.com"
|
10
|
+
s.files = `git ls-files`.lines.map(&:strip)
|
11
|
+
s.require_paths = ["lib"]
|
12
|
+
s.homepage = "https://github.com/dorianmariecom/query-ruby"
|
13
|
+
s.license = "MIT"
|
14
|
+
s.executables = "query"
|
15
|
+
|
16
|
+
s.add_dependency "activesupport"
|
17
|
+
s.add_dependency "bigdecimal"
|
18
|
+
s.add_dependency "dorian-arguments"
|
19
|
+
s.add_dependency "json"
|
20
|
+
s.add_dependency "language-ruby"
|
21
|
+
s.add_dependency "zeitwerk"
|
22
|
+
|
23
|
+
s.metadata["rubygems_mfa_required"] = "true"
|
24
|
+
|
25
|
+
s.required_ruby_version = ">= 3.0"
|
26
|
+
end
|
data/spec/query_spec.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Query do
|
4
|
+
[
|
5
|
+
"",
|
6
|
+
" ",
|
7
|
+
" \n",
|
8
|
+
"\n",
|
9
|
+
" ",
|
10
|
+
" \n ",
|
11
|
+
" \n",
|
12
|
+
" \r",
|
13
|
+
"\r",
|
14
|
+
" ",
|
15
|
+
" \r ",
|
16
|
+
" \r",
|
17
|
+
" \r\n ",
|
18
|
+
" hello ",
|
19
|
+
" hello world",
|
20
|
+
" 'hello world' \r\n",
|
21
|
+
' "hello world" ',
|
22
|
+
"from:me",
|
23
|
+
"to:me",
|
24
|
+
"from:me to:me",
|
25
|
+
"age>30",
|
26
|
+
"age>=30",
|
27
|
+
"age<30",
|
28
|
+
"age<=30",
|
29
|
+
"age:1",
|
30
|
+
"age:1.0",
|
31
|
+
"age:1.10",
|
32
|
+
"age:01",
|
33
|
+
"age:01.1",
|
34
|
+
"age:01.10",
|
35
|
+
"age:01.10",
|
36
|
+
"age:0b110",
|
37
|
+
"age:0x690",
|
38
|
+
"age:0o690",
|
39
|
+
"age:0B110",
|
40
|
+
"age:0X690",
|
41
|
+
"age:0O690",
|
42
|
+
"user:given_name:dorian",
|
43
|
+
"user:family_name:Marié",
|
44
|
+
'user:name:"Dorian Marié"',
|
45
|
+
"program:user:name:dorian",
|
46
|
+
"user:given_name:dorian",
|
47
|
+
"user:dorian",
|
48
|
+
"age:20..30",
|
49
|
+
"age:20...30",
|
50
|
+
"age:32.1",
|
51
|
+
"age:32.1..32.9",
|
52
|
+
"verified:true",
|
53
|
+
"verified:t",
|
54
|
+
"verified:on",
|
55
|
+
"verified:yes",
|
56
|
+
"verified:false",
|
57
|
+
"verified:f",
|
58
|
+
"verified:off",
|
59
|
+
"verified:no",
|
60
|
+
].each do |source|
|
61
|
+
it source.inspect do
|
62
|
+
Query.evaluate(source)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "decompiles #{source.inspect}" do
|
66
|
+
expect(
|
67
|
+
Query.evaluate(Query.decompile(Query.evaluate(source)))
|
68
|
+
).to eq(
|
69
|
+
Query.evaluate(source)
|
70
|
+
)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative "../lib/query-ruby"
|
metadata
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: query-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dorian Marié
|
8
|
+
bindir: bin
|
9
|
+
cert_chain: []
|
10
|
+
date: 2025-04-23 00:00:00.000000000 Z
|
11
|
+
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: activesupport
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: bigdecimal
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
- !ruby/object:Gem::Dependency
|
41
|
+
name: dorian-arguments
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
type: :runtime
|
48
|
+
prerelease: false
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
- !ruby/object:Gem::Dependency
|
55
|
+
name: json
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
type: :runtime
|
62
|
+
prerelease: false
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: language-ruby
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
type: :runtime
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: zeitwerk
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
type: :runtime
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
description: a querying language for the internet
|
97
|
+
email: dorian@dorianmarie.com
|
98
|
+
executables:
|
99
|
+
- query
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- ".github/dependabot.yml"
|
104
|
+
- ".github/workflows/ci.yml"
|
105
|
+
- ".gitignore"
|
106
|
+
- ".node-version"
|
107
|
+
- ".npm-version"
|
108
|
+
- ".prettierignore"
|
109
|
+
- ".rspec"
|
110
|
+
- ".rubocop.yml"
|
111
|
+
- ".ruby-version"
|
112
|
+
- ".tool-versions"
|
113
|
+
- Gemfile
|
114
|
+
- Gemfile.lock
|
115
|
+
- LICENSE
|
116
|
+
- README.md
|
117
|
+
- Rakefile
|
118
|
+
- VERSION
|
119
|
+
- bin/query
|
120
|
+
- lib/query-ruby.rb
|
121
|
+
- lib/query.rb
|
122
|
+
- lib/query/combiner.rb
|
123
|
+
- lib/query/decompiler.rb
|
124
|
+
- lib/query/node.rb
|
125
|
+
- lib/query/node/base_10.rb
|
126
|
+
- lib/query/node/base_16.rb
|
127
|
+
- lib/query/node/base_2.rb
|
128
|
+
- lib/query/node/base_8.rb
|
129
|
+
- lib/query/node/boolean.rb
|
130
|
+
- lib/query/node/decimal.rb
|
131
|
+
- lib/query/node/key.rb
|
132
|
+
- lib/query/node/key_value.rb
|
133
|
+
- lib/query/node/number.rb
|
134
|
+
- lib/query/node/operator.rb
|
135
|
+
- lib/query/node/part.rb
|
136
|
+
- lib/query/node/query.rb
|
137
|
+
- lib/query/node/range.rb
|
138
|
+
- lib/query/node/string.rb
|
139
|
+
- lib/query/node/text.rb
|
140
|
+
- lib/query/node/value.rb
|
141
|
+
- lib/query/parser.rb
|
142
|
+
- lib/query/parser/boolean.rb
|
143
|
+
- lib/query/parser/key.rb
|
144
|
+
- lib/query/parser/key_value.rb
|
145
|
+
- lib/query/parser/number.rb
|
146
|
+
- lib/query/parser/operator.rb
|
147
|
+
- lib/query/parser/part.rb
|
148
|
+
- lib/query/parser/query.rb
|
149
|
+
- lib/query/parser/range.rb
|
150
|
+
- lib/query/parser/string.rb
|
151
|
+
- lib/query/parser/text.rb
|
152
|
+
- lib/query/parser/value.rb
|
153
|
+
- lib/query/parser/whitespace.rb
|
154
|
+
- lib/query/version.rb
|
155
|
+
- package-lock.json
|
156
|
+
- package.json
|
157
|
+
- query-ruby.gemspec
|
158
|
+
- spec/query_spec.rb
|
159
|
+
- spec/spec_helper.rb
|
160
|
+
homepage: https://github.com/dorianmariecom/query-ruby
|
161
|
+
licenses:
|
162
|
+
- MIT
|
163
|
+
metadata:
|
164
|
+
rubygems_mfa_required: 'true'
|
165
|
+
rdoc_options: []
|
166
|
+
require_paths:
|
167
|
+
- lib
|
168
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
169
|
+
requirements:
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: '3.0'
|
173
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: '0'
|
178
|
+
requirements: []
|
179
|
+
rubygems_version: 3.6.2
|
180
|
+
specification_version: 4
|
181
|
+
summary: a querying language for the internet
|
182
|
+
test_files: []
|