polyrex 0.8.6 → 0.8.7

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.
Files changed (2) hide show
  1. data/lib/polyrex.rb +88 -23
  2. metadata +2 -2
data/lib/polyrex.rb CHANGED
@@ -12,11 +12,11 @@ require 'polyrex-xslt'
12
12
  require 'rexle'
13
13
 
14
14
  class Polyrex
15
- attr_accessor :summary_fields, :xslt_schema
15
+ attr_accessor :summary_fields, :xslt_schema, :id_counter
16
16
 
17
- def initialize(location)
17
+ def initialize(location, id_counter='1')
18
18
 
19
- @id = '1'
19
+ @id_counter = id_counter
20
20
  open(location)
21
21
  summary_h = Hash[*@doc.xpath("summary/*").map {|x| [x.name, x.text]}.flatten]
22
22
  @summary = OpenStruct.new summary_h
@@ -25,9 +25,9 @@ class Polyrex
25
25
  end
26
26
 
27
27
  def create(id=nil)
28
- # @create is a PolyrexCreateObject, @parent_node is a REXML::Element pointing to the current record
29
- @id.succ!
30
- @create.id = id || @id
28
+ # @create is a PolyrexCreateObject, @parent_node is a REXML::Element pointing to the current record
29
+
30
+ @create.id = id || @id_counter
31
31
  @create.record = @parent_node.name == 'records' ? @parent_node : @parent_node.element('records')
32
32
  @create
33
33
  end
@@ -56,10 +56,13 @@ class Polyrex
56
56
 
57
57
  def find_by_id(id)
58
58
  @parent_node = @doc.element("//[@id='#{id}']")
59
+ end
60
+
61
+ def id(id)
62
+ @parent_node = @doc.element("//[@id='#{id}']")
59
63
  self
60
64
  end
61
65
 
62
- alias id find_by_id
63
66
  # -- end of crud methods --
64
67
 
65
68
  # -- start of full text edit methods
@@ -79,7 +82,7 @@ class Polyrex
79
82
 
80
83
  def records
81
84
  @doc.xpath("records/*").map do |record|
82
- @objects_a[0].new(record, @id)
85
+ @objects_a[0].new(record)
83
86
  end
84
87
  end
85
88
 
@@ -87,6 +90,10 @@ class Polyrex
87
90
  @summary
88
91
  end
89
92
 
93
+ def to_a()
94
+ recordx_map @doc.root
95
+ end
96
+
90
97
  def to_xslt()
91
98
  @polyrex_xslt.schema = @schema
92
99
  @polyrex_xslt.to_xslt
@@ -126,20 +133,39 @@ class Polyrex
126
133
  #----
127
134
 
128
135
  @schema = schema
129
- @id = '0'
136
+ @id_counter = '0'
130
137
 
131
138
  root_name = @recordx.shift
132
139
 
133
140
  ("<%s><summary>%s</summary><records/></%s>" % [root_name, (summary || '') , root_name])
134
141
  end
135
142
 
143
+ def recordx_map(node)
144
+ # get the summary
145
+ summary = XPath.first(node, 'summary')
146
+
147
+ # get the fields
148
+ fields = summary.elements.map do |x|
149
+ next if %w(schema format_mask recordx_type).include? x.name
150
+ r = x.text.to_s.gsub(/^[\n\s]+/,'').length > 0 ? x.text : x.cdatas.join.strip
151
+ REXML::Text::unnormalize(r)
152
+ end
153
+
154
+ # get the records
155
+ records = XPath.first(node, 'records')
156
+ a = records.elements.map {|x| recordx_map x}
157
+
158
+ [fields, a]
159
+ end
160
+
136
161
  def string_parse(lines)
137
162
  format_line!(@parent_node, LineTree.new(lines).to_a)
138
163
  end
139
164
 
140
165
  def load_handlers(schema)
141
- @create = PolyrexCreateObject.new(schema, @id)
142
- objects = PolyrexObjects.new(schema)
166
+ @create = PolyrexCreateObject.new(schema, @id_counter)
167
+
168
+ objects = PolyrexObjects.new(schema, @id_counter)
143
169
  @objects = objects.to_h
144
170
  @objects_a = objects.to_a
145
171
  attach_create_handlers(@objects.keys)
@@ -149,7 +175,7 @@ class Polyrex
149
175
  def format_line!(records, a, i=0)
150
176
 
151
177
  a.each do |x|
152
-
178
+
153
179
  unless @recordx[i] then
154
180
  @recordx[i] = @recordx[-1].clone
155
181
  @format_masks[i] = @format_masks[-1]
@@ -158,19 +184,39 @@ class Polyrex
158
184
  tag_name = @recordx[i].to_s
159
185
  line = x.shift
160
186
 
161
- @field_names = @format_masks[i].to_s.scan(/\[!(\w+)\]/).flatten.map(&:to_sym)
162
- t = @format_masks[i].to_s.gsub(/\[!(\w+)\]/, '(.*)').sub(/\[/,'\[').sub(/\]/,'\]')
163
- a = t.reverse.split(/(?=\)\*\.\()/).reverse.map &:reverse
164
187
 
165
- patterns = tail_map(a)
166
- pattern = patterns.detect {|x| line.match(/#{x.join}/)}.join
167
- field_values = line.match(/#{pattern}/).captures
168
- field_values += [''] * (@field_names.length - field_values.length)
188
+
189
+ unless @format_masks[i][/^\(.*\)$/] then
190
+
191
+ @field_names = @format_masks[i].to_s.scan(/\[!(\w+)\]/).flatten.map(&:to_sym)
192
+
193
+ t = regexify_fmask(@format_masks[i]) #.sub(/\[/,'\[').sub(/\]/,'\]')
194
+ a = t.reverse.split(/(?=\)[^\(]+\()/).reverse.map &:reverse
195
+ patterns = tail_map(a)
196
+
197
+ pattern = patterns.detect {|x| line.match(/#{x.join}/)}.join
169
198
 
170
- @id.succ!
199
+ field_values = line.match(/#{pattern}/).captures
200
+ field_values += [''] * (@field_names.length - field_values.length)
201
+ else
202
+
203
+ format_masks = @format_masks[i][1..-2].split('|')
204
+ patterns = format_masks.map do |x|
205
+ regexify_fmask(x) #.sub(/\[/,'\[').sub(/\]/,'\]')
206
+ end
207
+
208
+ pattern = patterns.detect {|x| line.match(/#{x}/)}
209
+ i = patterns.index(pattern)
210
+
211
+ @field_names = format_masks[i].to_s.scan(/\[!(\w+)\]/).flatten.map(&:to_sym)
212
+
213
+ field_values = line.match(/#{pattern}/).captures
214
+ end
215
+
216
+ @id_counter.succ!
171
217
 
172
218
  record = Rexle::Element.new(tag_name)
173
- record.add_attribute('id' => @id.clone)
219
+ record.add_attribute(id: @id_counter.clone)
174
220
  summary = Rexle::Element.new('summary')
175
221
 
176
222
  @field_names.zip(field_values).each do |name, value|
@@ -211,7 +257,7 @@ class Polyrex
211
257
  self.instance_eval(
212
258
  %Q(
213
259
  def #{name.downcase}()
214
- @objects['#{name}'].new(@parent_node)
260
+ @objects['#{name}'].new(@parent_node, @id)
215
261
  end
216
262
  ))
217
263
  end
@@ -242,7 +288,7 @@ class Polyrex
242
288
  end
243
289
 
244
290
  id = @doc.xpath('max(//@id)')
245
- @id = id.to_s.succ if id
291
+ @id_counter = id.to_s.succ if id
246
292
 
247
293
  load_handlers(schema)
248
294
  load_find_by(schema)
@@ -251,6 +297,25 @@ class Polyrex
251
297
 
252
298
  end
253
299
 
300
+ def regexify_fmask(f)
301
+
302
+ a = f.split(/(?=\[!\w+\])/).map do |x|
303
+
304
+ aa = x.split(/(?=[^\]]+$)/)
305
+
306
+ if aa.length == 2 and aa.first[/\[!\w+\]/] then
307
+ field, delimiter = *aa
308
+ delimiter ||= '$'
309
+ d = delimiter[0]
310
+ "([^%s]+)%s" % ([d] * 2)
311
+ else
312
+ x.sub(/\[!\w+\]/,'(.*)')
313
+ end
314
+ end
315
+
316
+ a.join
317
+ end
318
+
254
319
  def tail_map(a)
255
320
  [a] + (a.length > 1 ? tail_map(a[0..-2]) : [])
256
321
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: polyrex
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.8.6
5
+ version: 0.8.7
6
6
  platform: ruby
7
7
  authors: []
8
8
 
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-15 00:00:00 +00:00
13
+ date: 2011-03-23 00:00:00 +00:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency