lineparser 0.1.19 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/lineparser.rb +266 -262
  5. metadata +31 -27
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 26d86d9aefef101369b87b0c27585a77db31e97c
4
- data.tar.gz: d008c9537387e4c5dd8fa5d98670526fb46bd21d
2
+ SHA256:
3
+ metadata.gz: da9c29d07840e85a7898267fd02c3af3327661472f37422187d3c728bcfc0b47
4
+ data.tar.gz: b018de36af3c41e709236ae27066ce6cabe31f8ce92a719d0d68f810a7fd2704
5
5
  SHA512:
6
- metadata.gz: d89adecd25a597dfcb516f4635919cce3af2458da8f7094ef566ec799ac3b2e6c8bb08807f0456852be45e77d154428c3dde70014c733ce27c1312925bd24bdb
7
- data.tar.gz: 57e5d7d3302d0e7b9150107251a79d04a4fb6df19398d86d6538fd24dce7a871eac7ec6550661d24cc9212f0e90c871a8283f3fe7187ddc23f0aae3367d01dbf
6
+ metadata.gz: 65d5e8b1185f3980b58598a4b32445ca6bb4cafe24ebcc9ba1ba5db65843f1ba8fc336276aa26ccbfa256b40faf7cff98375363dca733de45fe3b703a269326d
7
+ data.tar.gz: 52e55cea8d3cabaec9f333f0c3ead7a47e160de4b97aa2f871d3677655367fa608bad68a332b397887a8325934c96d9ff059f6fefc6db63bdc34b078e8038293
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,270 +1,274 @@
1
- #!/usr/bin/env ruby
2
-
3
- # file: lineparser.rb
4
-
5
- require 'line-tree'
6
-
7
-
8
- class LineParser
9
-
10
- def initialize(patterns=[], lines=nil, ignore_blank_lines: true, debug: true)
11
-
12
- @ibl, @debug = ignore_blank_lines, debug
13
- @h = {
14
-
15
- String: lambda do |s, pattern|
16
-
17
- labels = []
18
-
19
- pattern.gsub!('+',"\\\\+")
20
- r = s.match(/#{pattern.gsub(/:\w+/) {|x| labels << x; '([^\\n]*)'}}/)
21
-
22
- if r then
23
- params = Hash[*labels.zip(r.captures).flatten(1)]
24
- end
25
-
26
- end,
27
-
28
- Regexp: lambda do |s, regex|
29
-
30
- r = s.match(regex)
31
-
32
- if r then
33
- h = {captures: r.captures}
34
- r.names.inject(h) {|rn,x| rn.merge(x.to_sym => r[x])} if r.names
35
- end
36
- end
37
- }
38
-
39
- @patterns = patterns.select {|x| x.first == :all}
40
-
41
- hpatterns = {root: []}.merge patterns.inject({}){|r,x| r.merge(x[2] => x)}
42
-
43
- hpatterns.reverse_each do |k,v|
44
- hpatterns[v.first] << v if hpatterns[v.first]
45
- end
46
-
47
- @tree_patterns = hpatterns[:root].reverse
48
-
49
- parse lines if lines
50
-
51
- end
52
-
53
- def parse(s)
54
-
55
- puts 'inside parse()' if @debug
56
- a = scan @tree_patterns, LineTree.new(s, ignore_blank_lines: @ibl).to_a
57
- @h2 = build_hash a
58
- @a = a
59
-
60
- end
61
-
62
- def to_a
63
- @a
64
- end
65
-
66
- def to_h()
67
- @h2
68
- end
69
-
70
- def to_xml
71
- Rexle.new(xmlize(@a).inject([:root, '', {}]){|r,x| r << x}).xml if @a
72
- end
73
-
74
- private
75
-
76
-
77
- def build_hash(a)
1
+ #!/usr/bin/env ruby
2
+
3
+ # file: lineparser.rb
4
+
5
+ require 'line-tree'
6
+
7
+
8
+ class LineParser
9
+
10
+ def initialize(patterns=[], lines=nil, ignore_blank_lines: true, debug: false)
11
+
12
+ @ibl, @debug = ignore_blank_lines, debug
13
+ @h = {
14
+
15
+ String: lambda do |s, pattern|
16
+
17
+ labels = []
18
+
19
+ pattern.gsub!('+',"\\\\+")
20
+ r = s.match(/#{pattern.gsub(/:\w+/) {|x| labels << x; '([^\\n]*)'}}/)
21
+
22
+ if r then
23
+ params = Hash[*labels.zip(r.captures).flatten(1)]
24
+ end
25
+
26
+ end,
27
+
28
+ Regexp: lambda do |s, regex|
29
+
30
+ r = s.match(regex)
31
+
32
+ if r then
33
+ h = {captures: r.captures}
34
+ r.names.inject(h) {|rn,x| rn.merge(x.to_sym => r[x])} if r.names
35
+ end
36
+ end
37
+ }
38
+
39
+ @patterns = patterns.select {|x| x.first == :all}
40
+
41
+ hpatterns = {root: []}.merge patterns.inject({}){|r,x| r.merge(x[2] => x)}
42
+
43
+ hpatterns.reverse_each do |k,v|
44
+ hpatterns[v.first] << v if hpatterns[v.first]
45
+ end
46
+
47
+ @tree_patterns = hpatterns[:root].reverse
48
+
49
+ parse lines if lines
50
+
51
+ end
52
+
53
+ def parse(s)
54
+
55
+ puts 'inside parse()' if @debug
56
+ a = scan @tree_patterns, LineTree.new(s, ignore_blank_lines: @ibl).to_a
57
+ @h2 = build_hash a
58
+ @a = a
59
+
60
+ end
61
+
62
+ def to_a
63
+ @a
64
+ end
65
+
66
+ def to_h()
67
+ @h2
68
+ end
69
+
70
+ def to_xml
71
+ raw_doc = xmlize(@a).inject([:root, {}, '']){|r,x| r << x}
72
+ puts 'raw_doc: ' + raw_doc.inspect if @debug
73
+ Rexle.new(raw_doc).xml if @a
74
+ end
75
+
76
+ private
77
+
78
+
79
+ def build_hash(a)
78
80
 
79
81
  def filter(h2)
80
-
82
+
81
83
  h = {}
82
- puts 'h2: ' + h2.inspect if @debug
83
-
84
- h2.each do |k, v|
85
-
86
- puts 'v:' + v.inspect if @debug
87
-
88
- a3 = v.flat_map do |row|
89
-
90
- a2 = []
91
-
92
- puts 'row: ' + row.inspect
93
- puts 'row[3]: ' + row[3].inspect
94
-
95
- if row[3] and row[3].any? then
96
-
97
- puts 'row[3][0][1]: ' + row[3][0][1].inspect if @debug
98
-
99
- if row[3][0][1].has_key? :captures then
100
-
101
- a2 = row[3].map {|x| x[2].first }
102
-
84
+ puts 'h2: ' + h2.inspect if @debug
85
+
86
+ h2.each do |k, v|
87
+
88
+ puts 'v:' + v.inspect if @debug
89
+
90
+ a3 = v.flat_map do |row|
91
+
92
+ a2 = []
93
+
94
+ puts 'row: ' + row.inspect
95
+ puts 'row[3]: ' + row[3].inspect
96
+
97
+ if row[3] and row[3].any? then
98
+
99
+ puts 'row[3][0][1]: ' + row[3][0][1].inspect if @debug
100
+
101
+ if row[3][0][1].has_key? :captures and row[3][0][1][:captures].any? then
102
+
103
+ a2 = row[3].map {|x| x[2].first }
104
+
103
105
  else
104
- a2 = filter(row[3].group_by {|x| x.first })
105
- end
106
-
107
- else
108
- a2 = row[1].values.first
109
- end
110
-
111
- key = row[1].values.first
112
- key ||= a2
113
- (key.empty? or key == a2) ? a2 : {key => a2}
114
-
115
- end
116
-
117
- h[k] = a3.length > 1 ? a3 : a3.first
118
-
106
+ a2 = filter(row[3].group_by {|x| x.first })
107
+ end
108
+
109
+ else
110
+ a2 = row[1].values.first
111
+ end
112
+
113
+ key = row[1].values.first
114
+ key ||= a2
115
+ (key.empty? or key == a2) ? a2 : {key => a2}
116
+
117
+ end
118
+
119
+ h[k] = a3.length > 1 ? a3 : a3.first
120
+
119
121
  end
120
-
122
+
121
123
  return h
122
124
  end
123
-
125
+
124
126
  h3 = a.group_by {|x| x.first }
125
-
126
- filter(h3)
127
-
128
- end
129
-
130
- def join(lines, indent='')
131
- lines.map do |x|
132
- indent + (x.is_a?(Array) ? join(x, indent + ' ') : x)
133
- end.join("\n")
134
- end
135
-
136
- def scan(xpatterns, items)
137
-
138
- puts 'inside scan()' if @debug
139
-
140
- records = []
141
-
142
- while items.any? do
143
-
144
- x = items.shift
145
-
146
- params, context = nil, nil
147
-
148
- xpatterns = [xpatterns] unless xpatterns[0].is_a? Array
149
-
150
- found = @patterns.detect do |_, pattern|
151
- params = @h[pattern.class.to_s.to_sym].call x.first, pattern
152
- end
153
-
154
- puts 'found: ' + found.inspect if @debug
155
-
156
- if found then
157
-
158
- children = nil
159
- children = scan(found.last, x[1..-1]) if found.last.is_a? Array
160
- records << [found[2], params, x, children]
161
-
162
- else
163
-
164
- puts 'xpatterns: ' + xpatterns.inspect if @debug
165
-
166
- found = xpatterns.detect do |_, pattern, id|
167
-
168
- puts 'found2: ' + found.inspect if @debug
169
-
170
- if pattern == :root then
171
-
172
- found = @tree_patterns.detect do |_, pattern2, id|
173
- params = @h[pattern2.class.to_s.to_sym].call x.first, pattern2
174
- context = id if params
175
- end
176
-
177
- puts 'found3: ' + found.inspect if @debug
178
-
179
- else
180
-
181
- if @debug then
182
- puts '@h: ' + @h.inspect
183
- puts 'pattern: ' + pattern.inspect
184
- puts 'x.first: ' + x.first.inspect
185
- end
186
-
187
- params = @h[pattern.class.to_s.to_sym].call x.first, pattern
188
- puts 'params: ' + params.inspect if @debug
189
- context = id if params
190
- end
191
- end
192
-
193
- if found then
194
-
195
- children = nil
196
- children = scan(found[3..-1], x[1..-1]) if found.last.is_a? Array
197
- records << [context, params, x, children]
198
- end
199
- end
200
- end
201
-
202
- return records
203
- end
204
-
205
- def xmlize(rows)
206
-
207
- r = rows.map do |row|
208
-
209
- label, h, lines, children = row
210
-
211
- new_h = h.inject({}) do |r,k|
212
-
213
- if k.first == :captures then
214
-
215
- k[-1].map.with_index.to_a.inject({}) do |r2,x|
216
- x[0] ? r.merge!(('captures' + x[-1].to_s).to_sym => x[0]) : r
217
- end
218
- else
219
- r.merge k[0][/\w+/] => k[-1]
220
- end
221
- end
222
-
223
- c = children ? xmlize(children) : []
224
-
225
- [label, join(lines), new_h, *c]
226
- end
227
-
228
- r
229
- end
230
-
231
- end
232
-
233
-
234
- =begin
235
-
236
- Basic example:
237
-
238
- lines =<<LINES
239
- resources: posts
240
- # winning
241
- #
242
- post
243
- model
244
- Post
245
- orange 123
246
- fff
247
- comments
248
- model
249
- Comment
250
- orange 576
251
- ggg
252
- LINES
253
-
254
- patterns = [
255
- [:root, 'resources: :resources', :resources],
256
- [:root, ':resource', :resource],
257
- [:resource, 'model', :model],
258
- [:model, ':class_name', :model_class],
259
- [:model_class, /orange (\w+)/, :model_class_attribute],
260
- [:all, /#/, :comment]
261
- ]
262
-
263
- lp = LineParser.new patterns
264
- r = lp.parse lines
265
- #=>
266
- => [
267
- [:app_path, {":app_path"=>"/tmp"}, ["app_path: /tmp"], nil],
268
- [:app, {":app"=>"blog"}, ["app: blog"], nil],
269
- [:resources, {":resources"=>"posts"}, ["resources: posts"], ...
270
- =end
127
+
128
+ filter(h3)
129
+
130
+ end
131
+
132
+ def join(lines, indent='')
133
+ lines.map do |x|
134
+ indent + (x.is_a?(Array) ? join(x, indent + ' ') : x)
135
+ end.join("\n")
136
+ end
137
+
138
+ def scan(xpatterns, items)
139
+
140
+ puts 'inside scan()' if @debug
141
+
142
+ records = []
143
+
144
+ while items.any? do
145
+
146
+ x = items.shift
147
+
148
+ params, context = nil, nil
149
+
150
+ xpatterns = [xpatterns] unless xpatterns[0].is_a? Array
151
+
152
+ found = @patterns.detect do |_, pattern|
153
+ params = @h[pattern.class.to_s.to_sym].call x.first, pattern
154
+ end
155
+
156
+ puts 'found: ' + found.inspect if @debug
157
+
158
+ if found then
159
+
160
+ children = nil
161
+ children = scan(found.last, x[1..-1]) if found.last.is_a? Array
162
+ records << [found[2], params, x, children]
163
+
164
+ else
165
+
166
+ puts 'xpatterns: ' + xpatterns.inspect if @debug
167
+
168
+ found = xpatterns.detect do |_, pattern, id|
169
+
170
+ puts 'found2: ' + found.inspect if @debug
171
+
172
+ if pattern == :root then
173
+
174
+ found = @tree_patterns.detect do |_, pattern2, id|
175
+ params = @h[pattern2.class.to_s.to_sym].call x.first, pattern2
176
+ context = id if params
177
+ end
178
+
179
+ puts 'found3: ' + found.inspect if @debug
180
+
181
+ else
182
+
183
+ if @debug then
184
+ puts '@h: ' + @h.inspect
185
+ puts 'pattern: ' + pattern.inspect
186
+ puts 'x.first: ' + x.first.inspect
187
+ end
188
+
189
+ params = @h[pattern.class.to_s.to_sym].call x.first, pattern
190
+ puts 'params: ' + params.inspect if @debug
191
+ context = id if params
192
+ end
193
+ end
194
+
195
+ if found then
196
+
197
+ children = nil
198
+ children = scan(found[3..-1], x[1..-1]) if found.last.is_a? Array
199
+ records << [context, params, x, children]
200
+ end
201
+ end
202
+ end
203
+
204
+ return records
205
+ end
206
+
207
+ def xmlize(rows)
208
+
209
+ r = rows.map do |row|
210
+
211
+ label, h, lines, children = row
212
+
213
+ new_h = h.inject({}) do |r,k|
214
+
215
+ if k.first == :captures and k.last.any? then
216
+
217
+ puts 'k: ' + k.inspect if @debug
218
+
219
+ k[-1].map.with_index.to_a.inject({}) do |r2,x|
220
+ x[0] ? r.merge!(('captures' + x[-1].to_s).to_sym => x[0]) : r
221
+ end
222
+ else
223
+ r.merge k[0][/\w+/] => k[-1]
224
+ end
225
+ end
226
+
227
+ c = children ? xmlize(children) : []
228
+
229
+ [label, new_h, join(lines), *c]
230
+ end
231
+
232
+ r
233
+ end
234
+
235
+ end
236
+
237
+
238
+ =begin
239
+
240
+ Basic example:
241
+
242
+ lines =<<LINES
243
+ resources: posts
244
+ # winning
245
+ #
246
+ post
247
+ model
248
+ Post
249
+ orange 123
250
+ fff
251
+ comments
252
+ model
253
+ Comment
254
+ orange 576
255
+ ggg
256
+ LINES
257
+
258
+ patterns = [
259
+ [:root, 'resources: :resources', :resources],
260
+ [:root, ':resource', :resource],
261
+ [:resource, 'model', :model],
262
+ [:model, ':class_name', :model_class],
263
+ [:model_class, /orange (\w+)/, :model_class_attribute],
264
+ [:all, /#/, :comment]
265
+ ]
266
+
267
+ lp = LineParser.new patterns
268
+ r = lp.parse lines
269
+ #=>
270
+ => [
271
+ [:app_path, {":app_path"=>"/tmp"}, ["app_path: /tmp"], nil],
272
+ [:app, {":app"=>"blog"}, ["app: blog"], nil],
273
+ [:resources, {":resources"=>"posts"}, ["resources: posts"], ...
274
+ =end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lineparser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.19
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,27 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDXjCCAkagAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwNjE4MTczMTU4WhcN
15
- MTkwNjE4MTczMTU4WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIMaoy
17
- ZuLSaIQM2GZFTXH+ijBospHvjExbCi0Gap1jAEakSRMXSyS+MZZTc63E0lSxGmLm
18
- qKNocmHQAvff8K6tvKO5Pd7Ph/EWX2+18Icxs+kHvSErDBvJ45Ks05pQ++4tByVN
19
- 43URJS0dFbXFnz/0V7IFnsJ18oGiYUju/jWS7euxet4pbgew9WGQkX/CLNvaun7W
20
- TSbqgXqFRKyfDN0sbfGUKE8okgyEvEkYxaaBhDIB0n8l7aVd4B96R0YlJcY85aCL
21
- cbp8GV2E/NmLV5JErTmVHqqywQE0cMMTQdmeTNT8wSS8eAN987YKbMDgx6SACeYc
22
- vRR+2ItRBmfl7fEvAgMBAAGjgYowgYcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
23
- HQYDVR0OBBYEFBtVTxKjkkaD2AolTTEI29VnoOr4MCYGA1UdEQQfMB2BG2dlbW1h
24
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTAmBgNVHRIEHzAdgRtnZW1tYXN0ZXJAamFt
25
- ZXNyb2JlcnRzb24uZXUwDQYJKoZIhvcNAQEFBQADggEBALWXE5uRjPHi1XeGPmD/
26
- 7aGPjfUxg+hl/zMyVNPWi3ym84j76oynLTM0C7AgDVqXl8H8NPPiawQu8zLc6UWV
27
- PoZn4dtN8TBrOg9JT+P1+WHU4QidJ7PDTK4+HXaHxcEpglXQ/2V2wa+TjSq5cPws
28
- kxxS5qQrFKvqW3SuhXuO1wYC42OiPYu6KDjbq9ZnGEXKHg2+/XzkGJgnANzu58BR
29
- +jtnooTZ6Wn+nPMDihov717g1HIEFpQOyDvLPtnDyaCKkKbHn7FgS7a8wr12OGHj
30
- 7CkP6/pzsGLnyfCNF6rkXny4G0mjMmALczbazUUCil4IJNYfvW28Nlm2cD1N6Y/t
31
- Uck=
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAwOTE3MjIyMDE1WhcN
15
+ MjEwOTE3MjIyMDE1WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCyO1Zb
17
+ GtYa2IPzpSWbV7YEjd5n4hxHqMxEV3NE2oCOaOmmuB9GNMynHG/5mpDFwTQQhYUQ
18
+ y8eGk9EqIM0EM98wi9XWENCm+nrGrcRurPfE+S7GecEgSlGH2sb1cOTcR1ipLPXS
19
+ 3pMtP1+tmuzszo7wQXNXwlcc+qujWqj/qlhyWc/sI63R6h70m4zthjTrO/UDks5h
20
+ EUP+9PuzzkiNocjzSm+7a/jUMhbU1yD656r8BilI3lzJl58HVcVsGGY4Kz86EzJT
21
+ iV97QHqJMDa2qIMydNBwpzfrlXPcceZOX3J4APO0usIeDUySKFVORyKE0sDA7lqZ
22
+ pOjjJ6pP+mVQcJgp6znW5dABx53w5Fb7QyymKiR+91rifYbZwmrqfwsdBt0uhOG8
23
+ IbM9VdH/VfKze5wPj/PPxLOAFfx/B7QhA08Raki+WnkWGvJG04IDZjS9PC0fvJ8j
24
+ rZ/SHA78mi8JjUxyNt+wUUa5S9yrZxydn7uidipIYo/k3rNH38DXvP048w8CAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU5mmMLzbF
26
+ uuSVR6FWBPtCtKEMbEkwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAjzxAnyL61pJ1mGfTwk3XnG6DwafRLOZJGC0euWD0
29
+ +Gag+w7ciVKEIYreXBBgUTk23vLOS0W9RGkh32kvWz6osfWcMqb5DYrS+eqD7jWr
30
+ ZDAu40WUdftVimgHgbaX8JGkamsCuXGUEcjyuZvqIin1HacYqEX9DgHY7qwG0Z1Y
31
+ uoMT9Mft4RRFO76YtsMbgJbaxlCFcqMzxxG1sYjJ4zMvLIq0d5kAQZpXSLHAV5M4
32
+ nHOJqcbCuhX2Rk9FqFyHu99ap1lq+PMDCmA7QJhtD/MqV8i17GtE9pxGkPx6gMx4
33
+ c5YK/tmNlCZKtr6ASa8OD8Pd/qNtjyLMcKm9v/t6+Iuj7XvqgAGK0f5MBNHGmsWd
34
+ lTFRNeAqjG9zq18/Ex1AllAqc7Js7ZBBoUzO3GwKCaqNLsdRAuuTQmOywy7Ko9Zy
35
+ brbNaPUMXId06a/FvayO9VnovWqX0OameDJkWI43bBsQVBdiqHQ5I2xOm0NB/GaQ
36
+ cy0vi8GiqrPsSc2Y0KQjD/DK
32
37
  -----END CERTIFICATE-----
33
- date: 2018-06-29 00:00:00.000000000 Z
38
+ date: 2020-09-17 00:00:00.000000000 Z
34
39
  dependencies:
35
40
  - !ruby/object:Gem::Dependency
36
41
  name: line-tree
@@ -38,20 +43,20 @@ dependencies:
38
43
  requirements:
39
44
  - - "~>"
40
45
  - !ruby/object:Gem::Version
41
- version: '0.3'
46
+ version: '0.9'
42
47
  - - ">="
43
48
  - !ruby/object:Gem::Version
44
- version: 0.3.17
49
+ version: 0.9.1
45
50
  type: :runtime
46
51
  prerelease: false
47
52
  version_requirements: !ruby/object:Gem::Requirement
48
53
  requirements:
49
54
  - - "~>"
50
55
  - !ruby/object:Gem::Version
51
- version: '0.3'
56
+ version: '0.9'
52
57
  - - ">="
53
58
  - !ruby/object:Gem::Version
54
- version: 0.3.17
59
+ version: 0.9.1
55
60
  description:
56
61
  email: james@jamesrobertson.eu
57
62
  executables: []
@@ -78,8 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
78
83
  - !ruby/object:Gem::Version
79
84
  version: '0'
80
85
  requirements: []
81
- rubyforge_project:
82
- rubygems_version: 2.6.13
86
+ rubygems_version: 3.0.3
83
87
  signing_key:
84
88
  specification_version: 4
85
89
  summary: Lineparser is suited to parsing configuration files, however it can parse
metadata.gz.sig CHANGED
Binary file