params_tree 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|