params_tree 1.0.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
- checksums.yaml.gz.sig +0 -0
- data/.gitignore +22 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +61 -0
- data/Rakefile +28 -0
- data/certs/razum2um.pem +21 -0
- data/lib/params_tree/parser.rb +340 -0
- data/lib/params_tree/parser.rl +85 -0
- data/lib/params_tree/version.rb +3 -0
- data/lib/params_tree.rb +6 -0
- data/params_tree.gemspec +26 -0
- data/test/parser_test.rb +53 -0
- data.tar.gz.sig +0 -0
- metadata +123 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 73636644f7d19662eaf5727ab9e3db500991dcc6
|
4
|
+
data.tar.gz: 5d08821692a38915848c2e6c0944d10ce2c91c91
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 08b7a69b78af23cff3c8c0d3b0ff9ea38083c7ccf8b5b32438df9fb95331885f4581490f055b92ed8749b55f8d2943aab1ea9db8b8ec39e07cb8830c3f999972
|
7
|
+
data.tar.gz: e8e2f4b5c235c61d1d00fa20b11d0b6e7d1232404f1f454c7bfe2200ec1f3d039e57d9afa251cf6fd9a07de354aaac99c59c08b8368ad39ec76f101a4dfbbc03
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
.bundle
|
4
|
+
.config
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
7
|
+
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
11
|
+
lib/bundler/man
|
12
|
+
pkg
|
13
|
+
rdoc
|
14
|
+
spec/reports
|
15
|
+
test/tmp
|
16
|
+
test/version_tmp
|
17
|
+
tmp
|
18
|
+
*.bundle
|
19
|
+
*.so
|
20
|
+
*.o
|
21
|
+
*.a
|
22
|
+
mkmf.log
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Vlad Bokov
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# ParamsTree
|
2
|
+
|
3
|
+
This is a little helper to turn strings like:
|
4
|
+
|
5
|
+
"default(id,user(group(division(name)),name)),post(id,title),comment(id,author,text(title,body))"
|
6
|
+
|
7
|
+
to:
|
8
|
+
|
9
|
+
{
|
10
|
+
"default" => {
|
11
|
+
"id" => {},
|
12
|
+
"user" => {
|
13
|
+
"group" => {
|
14
|
+
"division" => {
|
15
|
+
"name" => {}
|
16
|
+
},
|
17
|
+
"name" => {}
|
18
|
+
},
|
19
|
+
"post" => {
|
20
|
+
"id" => {},
|
21
|
+
"title" => {}
|
22
|
+
},
|
23
|
+
"comment" => {
|
24
|
+
"id" => {},
|
25
|
+
"author" => {},
|
26
|
+
"text" => {
|
27
|
+
"title" => {},
|
28
|
+
"body" => {}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
Used for `rabl-filters`
|
36
|
+
|
37
|
+
## Installation
|
38
|
+
|
39
|
+
Add this line to your application's Gemfile:
|
40
|
+
|
41
|
+
gem 'params_tree'
|
42
|
+
|
43
|
+
And then execute:
|
44
|
+
|
45
|
+
$ bundle
|
46
|
+
|
47
|
+
Or install it yourself as:
|
48
|
+
|
49
|
+
$ gem install params_tree
|
50
|
+
|
51
|
+
## Usage
|
52
|
+
|
53
|
+
ParamsTree::Parser.parse(string) # => nested Hash or nil if non-parseable
|
54
|
+
|
55
|
+
## Contributing
|
56
|
+
|
57
|
+
1. Fork it ( https://github.com/razum2um/params_tree/fork )
|
58
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
59
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
60
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
61
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rake/testtask"
|
3
|
+
|
4
|
+
Rake::TestTask.new(:test) do |test|
|
5
|
+
test.libs << "lib" << "test"
|
6
|
+
test.pattern = "test/*_test.rb"
|
7
|
+
end
|
8
|
+
|
9
|
+
desc "generates parser"
|
10
|
+
task :generate do
|
11
|
+
system("ragel -R #{File.expand_path('../lib/params_tree/parser.rl', __FILE__)} > #{File.expand_path('../lib/params_tree/parser.rb', __FILE__)}")
|
12
|
+
end
|
13
|
+
|
14
|
+
desc 'releases gem & updates docs'
|
15
|
+
task :publish do
|
16
|
+
require 'params_tree'
|
17
|
+
version = ParamsTree::VERSION
|
18
|
+
|
19
|
+
Bundler.with_clean_env do
|
20
|
+
system "git tag v#{version}"
|
21
|
+
system "gem build params_tree.gemspec"
|
22
|
+
system "git push --tags"
|
23
|
+
system "gem push params_tree-#{version}.gem"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
task :default => :test
|
28
|
+
|
data/certs/razum2um.pem
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRMwEQYDVQQDDApib2tv
|
3
|
+
di52bGFkMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
|
4
|
+
b20wHhcNMTQwNTIwMjAyOTAyWhcNMTUwNTIwMjAyOTAyWjBBMRMwEQYDVQQDDApi
|
5
|
+
b2tvdi52bGFkMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
|
6
|
+
FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCibrb/aiZX3kWo
|
7
|
+
Fmzo3gvGBFS9N18Q5rp9UTJRc4KxZQOay2WcgLjy1oU61r2Urjz3VDT4sg/yw3N3
|
8
|
+
YXIPqSTRl+OPIaafe45TVpF4mtMSsc1Gm/O3Sfoz6URiMd9iDtc2sTpaMgatL4pV
|
9
|
+
EExER9emjrmElRFknJD65E3gVDX7KXvrZYYAScJR33DADIGUgpuyHm29S7G/4WAy
|
10
|
+
ol6XfmPx+x5rM49QytGSNCQDYQ3SMMCo9wKkEm3Zcx0O4qhO8INevl/mvkAWLhOA
|
11
|
+
+0qldtuUx9wbBQ0D0wVR8LTafqWrIUHQjWXqrhWBqXhYeR3jj5aehBhpPFclHuKU
|
12
|
+
5GeILZrFAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
13
|
+
BBSiidH2CEJmkza+NBBJNLcnzQX57TAfBgNVHREEGDAWgRRib2tvdi52bGFkQGdt
|
14
|
+
YWlsLmNvbTAfBgNVHRIEGDAWgRRib2tvdi52bGFkQGdtYWlsLmNvbTANBgkqhkiG
|
15
|
+
9w0BAQUFAAOCAQEAVEyF63kQT9HKm3YIw1WzLvuOMvEUThzBomMMsTp9CGXWvem6
|
16
|
+
wZdMhxykwk1lga0OwsCn+wr1tWZ/cNeWqGSY00vTfLWdriK60xuRW7zT1Z5tmxbD
|
17
|
+
dq2ULdhII/qCFQlzDB/+IptO1rJLzfxTckoArmeYtkBV6LaVd7wpaRZnw0Apm93e
|
18
|
+
ph03YddPDbB34xTivvu4d6BBbKGxj/YN+1NLD9rMi6FspgcA4P1UlmKqyCluTbZj
|
19
|
+
vzKbYclpJ7gENr/xiTjGqA/Md3zJMzmsFrzUXt4RVmo5SaCyZjC6gFfhSr+PODc7
|
20
|
+
ZaSbckvH/+m4boAsg0JkGGFcS3j5fgNmdwgA1A==
|
21
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,340 @@
|
|
1
|
+
|
2
|
+
# line 1 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
3
|
+
|
4
|
+
# line 22 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
5
|
+
|
6
|
+
|
7
|
+
module ParamsTree
|
8
|
+
class Parser
|
9
|
+
attr_accessor :data
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
|
13
|
+
# line 14 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rb"
|
14
|
+
class << self
|
15
|
+
attr_accessor :_params_tree_actions
|
16
|
+
private :_params_tree_actions, :_params_tree_actions=
|
17
|
+
end
|
18
|
+
self._params_tree_actions = [
|
19
|
+
0, 2, 1, 7, 2, 1, 8, 3,
|
20
|
+
0, 1, 7, 3, 0, 1, 8, 5,
|
21
|
+
0, 1, 5, 2, 9, 6, 0, 1,
|
22
|
+
5, 2, 4, 10, 6, 0, 1, 6,
|
23
|
+
2, 3, 11
|
24
|
+
]
|
25
|
+
|
26
|
+
class << self
|
27
|
+
attr_accessor :_params_tree_key_offsets
|
28
|
+
private :_params_tree_key_offsets, :_params_tree_key_offsets=
|
29
|
+
end
|
30
|
+
self._params_tree_key_offsets = [
|
31
|
+
0, 0, 3, 6
|
32
|
+
]
|
33
|
+
|
34
|
+
class << self
|
35
|
+
attr_accessor :_params_tree_trans_keys
|
36
|
+
private :_params_tree_trans_keys, :_params_tree_trans_keys=
|
37
|
+
end
|
38
|
+
self._params_tree_trans_keys = [
|
39
|
+
40, 41, 44, 44, 40, 41, 40, 41,
|
40
|
+
44, 0
|
41
|
+
]
|
42
|
+
|
43
|
+
class << self
|
44
|
+
attr_accessor :_params_tree_single_lengths
|
45
|
+
private :_params_tree_single_lengths, :_params_tree_single_lengths=
|
46
|
+
end
|
47
|
+
self._params_tree_single_lengths = [
|
48
|
+
0, 3, 1, 3
|
49
|
+
]
|
50
|
+
|
51
|
+
class << self
|
52
|
+
attr_accessor :_params_tree_range_lengths
|
53
|
+
private :_params_tree_range_lengths, :_params_tree_range_lengths=
|
54
|
+
end
|
55
|
+
self._params_tree_range_lengths = [
|
56
|
+
0, 0, 1, 0
|
57
|
+
]
|
58
|
+
|
59
|
+
class << self
|
60
|
+
attr_accessor :_params_tree_index_offsets
|
61
|
+
private :_params_tree_index_offsets, :_params_tree_index_offsets=
|
62
|
+
end
|
63
|
+
self._params_tree_index_offsets = [
|
64
|
+
0, 0, 4, 7
|
65
|
+
]
|
66
|
+
|
67
|
+
class << self
|
68
|
+
attr_accessor :_params_tree_trans_targs
|
69
|
+
private :_params_tree_trans_targs, :_params_tree_trans_targs=
|
70
|
+
end
|
71
|
+
self._params_tree_trans_targs = [
|
72
|
+
2, 3, 2, 1, 0, 0, 1, 0,
|
73
|
+
3, 2, 1, 0
|
74
|
+
]
|
75
|
+
|
76
|
+
class << self
|
77
|
+
attr_accessor :_params_tree_trans_actions
|
78
|
+
private :_params_tree_trans_actions, :_params_tree_trans_actions=
|
79
|
+
end
|
80
|
+
self._params_tree_trans_actions = [
|
81
|
+
28, 7, 15, 4, 0, 0, 11, 0,
|
82
|
+
1, 21, 11, 0
|
83
|
+
]
|
84
|
+
|
85
|
+
class << self
|
86
|
+
attr_accessor :params_tree_start
|
87
|
+
end
|
88
|
+
self.params_tree_start = 2;
|
89
|
+
class << self
|
90
|
+
attr_accessor :params_tree_first_final
|
91
|
+
end
|
92
|
+
self.params_tree_first_final = 2;
|
93
|
+
class << self
|
94
|
+
attr_accessor :params_tree_error
|
95
|
+
end
|
96
|
+
self.params_tree_error = 0;
|
97
|
+
|
98
|
+
class << self
|
99
|
+
attr_accessor :params_tree_en_main
|
100
|
+
end
|
101
|
+
self.params_tree_en_main = 2;
|
102
|
+
|
103
|
+
|
104
|
+
# line 30 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
105
|
+
end
|
106
|
+
|
107
|
+
def parse(input)
|
108
|
+
@data = input.gsub(/[^a-zA-Z,\(\)]/, '').unpack('c*')
|
109
|
+
stack = []
|
110
|
+
|
111
|
+
@log = []
|
112
|
+
@hash = {}
|
113
|
+
@hash_stack = []
|
114
|
+
@key = nil
|
115
|
+
|
116
|
+
|
117
|
+
# line 118 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rb"
|
118
|
+
begin
|
119
|
+
p ||= 0
|
120
|
+
pe ||= data.length
|
121
|
+
cs = params_tree_start
|
122
|
+
top = 0
|
123
|
+
end
|
124
|
+
|
125
|
+
# line 42 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
126
|
+
|
127
|
+
# line 128 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rb"
|
128
|
+
begin
|
129
|
+
_klen, _trans, _keys, _acts, _nacts = nil
|
130
|
+
_goto_level = 0
|
131
|
+
_resume = 10
|
132
|
+
_eof_trans = 15
|
133
|
+
_again = 20
|
134
|
+
_test_eof = 30
|
135
|
+
_out = 40
|
136
|
+
while true
|
137
|
+
_trigger_goto = false
|
138
|
+
if _goto_level <= 0
|
139
|
+
if p == pe
|
140
|
+
_goto_level = _test_eof
|
141
|
+
next
|
142
|
+
end
|
143
|
+
if cs == 0
|
144
|
+
_goto_level = _out
|
145
|
+
next
|
146
|
+
end
|
147
|
+
end
|
148
|
+
if _goto_level <= _resume
|
149
|
+
_keys = _params_tree_key_offsets[cs]
|
150
|
+
_trans = _params_tree_index_offsets[cs]
|
151
|
+
_klen = _params_tree_single_lengths[cs]
|
152
|
+
_break_match = false
|
153
|
+
|
154
|
+
begin
|
155
|
+
if _klen > 0
|
156
|
+
_lower = _keys
|
157
|
+
_upper = _keys + _klen - 1
|
158
|
+
|
159
|
+
loop do
|
160
|
+
break if _upper < _lower
|
161
|
+
_mid = _lower + ( (_upper - _lower) >> 1 )
|
162
|
+
|
163
|
+
if data[p].ord < _params_tree_trans_keys[_mid]
|
164
|
+
_upper = _mid - 1
|
165
|
+
elsif data[p].ord > _params_tree_trans_keys[_mid]
|
166
|
+
_lower = _mid + 1
|
167
|
+
else
|
168
|
+
_trans += (_mid - _keys)
|
169
|
+
_break_match = true
|
170
|
+
break
|
171
|
+
end
|
172
|
+
end # loop
|
173
|
+
break if _break_match
|
174
|
+
_keys += _klen
|
175
|
+
_trans += _klen
|
176
|
+
end
|
177
|
+
_klen = _params_tree_range_lengths[cs]
|
178
|
+
if _klen > 0
|
179
|
+
_lower = _keys
|
180
|
+
_upper = _keys + (_klen << 1) - 2
|
181
|
+
loop do
|
182
|
+
break if _upper < _lower
|
183
|
+
_mid = _lower + (((_upper-_lower) >> 1) & ~1)
|
184
|
+
if data[p].ord < _params_tree_trans_keys[_mid]
|
185
|
+
_upper = _mid - 2
|
186
|
+
elsif data[p].ord > _params_tree_trans_keys[_mid+1]
|
187
|
+
_lower = _mid + 2
|
188
|
+
else
|
189
|
+
_trans += ((_mid - _keys) >> 1)
|
190
|
+
_break_match = true
|
191
|
+
break
|
192
|
+
end
|
193
|
+
end # loop
|
194
|
+
break if _break_match
|
195
|
+
_trans += _klen
|
196
|
+
end
|
197
|
+
end while false
|
198
|
+
cs = _params_tree_trans_targs[_trans]
|
199
|
+
if _params_tree_trans_actions[_trans] != 0
|
200
|
+
_acts = _params_tree_trans_actions[_trans]
|
201
|
+
_nacts = _params_tree_actions[_acts]
|
202
|
+
_acts += 1
|
203
|
+
while _nacts > 0
|
204
|
+
_nacts -= 1
|
205
|
+
_acts += 1
|
206
|
+
case _params_tree_actions[_acts - 1]
|
207
|
+
when 0 then
|
208
|
+
# line 3 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
209
|
+
begin
|
210
|
+
@head = p end
|
211
|
+
when 1 then
|
212
|
+
# line 4 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
213
|
+
begin
|
214
|
+
@tail = p end
|
215
|
+
when 2 then
|
216
|
+
# line 5 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
217
|
+
begin
|
218
|
+
inject_key end
|
219
|
+
when 3 then
|
220
|
+
# line 6 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
221
|
+
begin
|
222
|
+
push end
|
223
|
+
when 4 then
|
224
|
+
# line 7 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
225
|
+
begin
|
226
|
+
pop end
|
227
|
+
when 5 then
|
228
|
+
# line 9 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
229
|
+
begin
|
230
|
+
log(:delimiter) end
|
231
|
+
when 6 then
|
232
|
+
# line 10 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
233
|
+
begin
|
234
|
+
log(:level) end
|
235
|
+
when 7 then
|
236
|
+
# line 11 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
237
|
+
begin
|
238
|
+
log(:end_level); end
|
239
|
+
when 8 then
|
240
|
+
# line 12 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
241
|
+
begin
|
242
|
+
log(:input); memo_key; end
|
243
|
+
when 9 then
|
244
|
+
# line 17 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
245
|
+
begin
|
246
|
+
cs = 2; end
|
247
|
+
when 10 then
|
248
|
+
# line 18 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
249
|
+
begin
|
250
|
+
begin
|
251
|
+
top -= 1
|
252
|
+
cs = stack[top]
|
253
|
+
_trigger_goto = true
|
254
|
+
_goto_level = _again
|
255
|
+
break
|
256
|
+
end
|
257
|
+
end
|
258
|
+
when 11 then
|
259
|
+
# line 19 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
260
|
+
begin
|
261
|
+
begin
|
262
|
+
stack[top] = cs
|
263
|
+
top+= 1
|
264
|
+
cs = 2
|
265
|
+
_trigger_goto = true
|
266
|
+
_goto_level = _again
|
267
|
+
break
|
268
|
+
end
|
269
|
+
end
|
270
|
+
# line 271 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rb"
|
271
|
+
end # action switch
|
272
|
+
end
|
273
|
+
end
|
274
|
+
if _trigger_goto
|
275
|
+
next
|
276
|
+
end
|
277
|
+
end
|
278
|
+
if _goto_level <= _again
|
279
|
+
if cs == 0
|
280
|
+
_goto_level = _out
|
281
|
+
next
|
282
|
+
end
|
283
|
+
p += 1
|
284
|
+
if p != pe
|
285
|
+
_goto_level = _resume
|
286
|
+
next
|
287
|
+
end
|
288
|
+
end
|
289
|
+
if _goto_level <= _test_eof
|
290
|
+
end
|
291
|
+
if _goto_level <= _out
|
292
|
+
break
|
293
|
+
end
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
# line 43 "/Users/razum2um/Code/params_tree/lib/params_tree/parser.rl"
|
298
|
+
|
299
|
+
inject_key # FIXME
|
300
|
+
|
301
|
+
@hash_stack.first || @hash
|
302
|
+
end
|
303
|
+
|
304
|
+
def chars
|
305
|
+
@data[@head..@tail]
|
306
|
+
end
|
307
|
+
|
308
|
+
def strokes
|
309
|
+
chars.pack('c*')
|
310
|
+
end
|
311
|
+
|
312
|
+
def log(token)
|
313
|
+
@log << { token => strokes }
|
314
|
+
end
|
315
|
+
|
316
|
+
def memo_key
|
317
|
+
@key = chars
|
318
|
+
end
|
319
|
+
|
320
|
+
def key
|
321
|
+
@key.pack('c*')
|
322
|
+
end
|
323
|
+
|
324
|
+
def inject_key
|
325
|
+
@hash[key] = {}
|
326
|
+
end
|
327
|
+
|
328
|
+
def push
|
329
|
+
@hash_stack.push @hash; @hash = @hash[key]
|
330
|
+
end
|
331
|
+
|
332
|
+
def pop
|
333
|
+
@hash = @hash_stack.pop
|
334
|
+
end
|
335
|
+
|
336
|
+
def self.parse(string)
|
337
|
+
self.new.parse(string)
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
%%{
|
2
|
+
machine params_tree;
|
3
|
+
action H { @head = p }
|
4
|
+
action T { @tail = p }
|
5
|
+
action inject_key { inject_key }
|
6
|
+
action push { push }
|
7
|
+
action pop { pop }
|
8
|
+
|
9
|
+
DELIMITER = ',' >H@T @{ log(:delimiter) };
|
10
|
+
LEVEL = '(' >H@T @{ log(:level) };
|
11
|
+
END_LEVEL = ')'+ >H@T @{ log(:end_level); };
|
12
|
+
INPUT = (any - LEVEL - END_LEVEL - DELIMITER)+ >H@T @{ log(:input); memo_key; };
|
13
|
+
|
14
|
+
main := (
|
15
|
+
INPUT
|
16
|
+
(
|
17
|
+
DELIMITER @inject_key @{ fnext main; } |
|
18
|
+
END_LEVEL DELIMITER? @inject_key @pop @{ fret; } |
|
19
|
+
LEVEL @inject_key @push @{ fcall main; }
|
20
|
+
)
|
21
|
+
)*;
|
22
|
+
}%%
|
23
|
+
|
24
|
+
module ParamsTree
|
25
|
+
class Parser
|
26
|
+
attr_accessor :data
|
27
|
+
|
28
|
+
def initialize
|
29
|
+
%% write data;
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse(input)
|
33
|
+
@data = input.gsub(/[^a-zA-Z,\(\)]/, '').unpack('c*')
|
34
|
+
stack = []
|
35
|
+
|
36
|
+
@log = []
|
37
|
+
@hash = {}
|
38
|
+
@hash_stack = []
|
39
|
+
@key = nil
|
40
|
+
|
41
|
+
%% write init;
|
42
|
+
%% write exec;
|
43
|
+
|
44
|
+
inject_key # FIXME
|
45
|
+
|
46
|
+
@hash_stack.first || @hash
|
47
|
+
end
|
48
|
+
|
49
|
+
def chars
|
50
|
+
@data[@head..@tail]
|
51
|
+
end
|
52
|
+
|
53
|
+
def strokes
|
54
|
+
chars.pack('c*')
|
55
|
+
end
|
56
|
+
|
57
|
+
def log(token)
|
58
|
+
@log << { token => strokes }
|
59
|
+
end
|
60
|
+
|
61
|
+
def memo_key
|
62
|
+
@key = chars
|
63
|
+
end
|
64
|
+
|
65
|
+
def key
|
66
|
+
@key.pack('c*')
|
67
|
+
end
|
68
|
+
|
69
|
+
def inject_key
|
70
|
+
@hash[key] = {}
|
71
|
+
end
|
72
|
+
|
73
|
+
def push
|
74
|
+
@hash_stack.push @hash; @hash = @hash[key]
|
75
|
+
end
|
76
|
+
|
77
|
+
def pop
|
78
|
+
@hash = @hash_stack.pop
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.parse(string)
|
82
|
+
self.new.parse(string)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
data/lib/params_tree.rb
ADDED
data/params_tree.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'params_tree/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "params_tree"
|
8
|
+
spec.version = ParamsTree::VERSION
|
9
|
+
spec.authors = ["Vlad Bokov"]
|
10
|
+
spec.email = ["bokov.vlad@gmail.com"]
|
11
|
+
spec.cert_chain = ['certs/razum2um.pem']
|
12
|
+
spec.signing_key = File.expand_path("~/.ssh/gem-private_key.pem") if $0 =~ /gem\z/
|
13
|
+
spec.summary = %q{Cute helper for rabl-filters}
|
14
|
+
spec.description = %q{Turns listed tree to nested hash}
|
15
|
+
spec.homepage = "https://github.com/razum2um/params_tree"
|
16
|
+
spec.license = "MIT"
|
17
|
+
|
18
|
+
spec.files = `git ls-files -z`.split("\x0")
|
19
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
20
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "minitest", "~> 0"
|
25
|
+
spec.add_development_dependency "rake", "~> 0"
|
26
|
+
end
|
data/test/parser_test.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path("../../lib", __FILE__))
|
2
|
+
require "params_tree"
|
3
|
+
require "minitest/autorun"
|
4
|
+
|
5
|
+
class ParserTest < Minitest::Test
|
6
|
+
def _(string)
|
7
|
+
ParamsTree::Parser.parse string
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_simple
|
11
|
+
assert_equal _("default"), { "default" => {} }
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_multiple_simple
|
15
|
+
assert_equal _("default, some"), { "default" => {}, "some" => {} }
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_nested_simple
|
19
|
+
assert_equal _("default(user), some"), { "default" => { 'user' => {} }, "some" => {} }
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_double_nested_simple
|
23
|
+
assert_equal _("default(user(id)), some"), { "default" => { 'user' => { 'id' => {} }, "some" => {} } }
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_complicated
|
27
|
+
assert_equal _("default(id,user(group(division(name)),name)),post(id,title),comment(id,author,text(title,body))"), {
|
28
|
+
"default" => {
|
29
|
+
"id" => {},
|
30
|
+
"user" => {
|
31
|
+
"group" => {
|
32
|
+
"division" => {
|
33
|
+
"name" => {}
|
34
|
+
},
|
35
|
+
"name" => {}
|
36
|
+
},
|
37
|
+
"post" => {
|
38
|
+
"id" => {},
|
39
|
+
"title" => {}
|
40
|
+
},
|
41
|
+
"comment" => {
|
42
|
+
"id" => {},
|
43
|
+
"author" => {},
|
44
|
+
"text" => {
|
45
|
+
"title" => {},
|
46
|
+
"body" => {}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
data.tar.gz.sig
ADDED
Binary file
|
metadata
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: params_tree
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vlad Bokov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRMwEQYDVQQDDApib2tv
|
14
|
+
di52bGFkMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNj
|
15
|
+
b20wHhcNMTQwNTIwMjAyOTAyWhcNMTUwNTIwMjAyOTAyWjBBMRMwEQYDVQQDDApi
|
16
|
+
b2tvdi52bGFkMRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZ
|
17
|
+
FgNjb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCibrb/aiZX3kWo
|
18
|
+
Fmzo3gvGBFS9N18Q5rp9UTJRc4KxZQOay2WcgLjy1oU61r2Urjz3VDT4sg/yw3N3
|
19
|
+
YXIPqSTRl+OPIaafe45TVpF4mtMSsc1Gm/O3Sfoz6URiMd9iDtc2sTpaMgatL4pV
|
20
|
+
EExER9emjrmElRFknJD65E3gVDX7KXvrZYYAScJR33DADIGUgpuyHm29S7G/4WAy
|
21
|
+
ol6XfmPx+x5rM49QytGSNCQDYQ3SMMCo9wKkEm3Zcx0O4qhO8INevl/mvkAWLhOA
|
22
|
+
+0qldtuUx9wbBQ0D0wVR8LTafqWrIUHQjWXqrhWBqXhYeR3jj5aehBhpPFclHuKU
|
23
|
+
5GeILZrFAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
24
|
+
BBSiidH2CEJmkza+NBBJNLcnzQX57TAfBgNVHREEGDAWgRRib2tvdi52bGFkQGdt
|
25
|
+
YWlsLmNvbTAfBgNVHRIEGDAWgRRib2tvdi52bGFkQGdtYWlsLmNvbTANBgkqhkiG
|
26
|
+
9w0BAQUFAAOCAQEAVEyF63kQT9HKm3YIw1WzLvuOMvEUThzBomMMsTp9CGXWvem6
|
27
|
+
wZdMhxykwk1lga0OwsCn+wr1tWZ/cNeWqGSY00vTfLWdriK60xuRW7zT1Z5tmxbD
|
28
|
+
dq2ULdhII/qCFQlzDB/+IptO1rJLzfxTckoArmeYtkBV6LaVd7wpaRZnw0Apm93e
|
29
|
+
ph03YddPDbB34xTivvu4d6BBbKGxj/YN+1NLD9rMi6FspgcA4P1UlmKqyCluTbZj
|
30
|
+
vzKbYclpJ7gENr/xiTjGqA/Md3zJMzmsFrzUXt4RVmo5SaCyZjC6gFfhSr+PODc7
|
31
|
+
ZaSbckvH/+m4boAsg0JkGGFcS3j5fgNmdwgA1A==
|
32
|
+
-----END CERTIFICATE-----
|
33
|
+
date: 2014-05-20 00:00:00.000000000 Z
|
34
|
+
dependencies:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: bundler
|
37
|
+
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.3'
|
42
|
+
type: :development
|
43
|
+
prerelease: false
|
44
|
+
version_requirements: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '1.3'
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: minitest
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rake
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
description: Turns listed tree to nested hash
|
78
|
+
email:
|
79
|
+
- bokov.vlad@gmail.com
|
80
|
+
executables: []
|
81
|
+
extensions: []
|
82
|
+
extra_rdoc_files: []
|
83
|
+
files:
|
84
|
+
- ".gitignore"
|
85
|
+
- ".travis.yml"
|
86
|
+
- Gemfile
|
87
|
+
- LICENSE.txt
|
88
|
+
- README.md
|
89
|
+
- Rakefile
|
90
|
+
- certs/razum2um.pem
|
91
|
+
- lib/params_tree.rb
|
92
|
+
- lib/params_tree/parser.rb
|
93
|
+
- lib/params_tree/parser.rl
|
94
|
+
- lib/params_tree/version.rb
|
95
|
+
- params_tree.gemspec
|
96
|
+
- test/parser_test.rb
|
97
|
+
homepage: https://github.com/razum2um/params_tree
|
98
|
+
licenses:
|
99
|
+
- MIT
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.2.2
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Cute helper for rabl-filters
|
121
|
+
test_files:
|
122
|
+
- test/parser_test.rb
|
123
|
+
has_rdoc:
|
metadata.gz.sig
ADDED
Binary file
|