dynarex 0.9.3 → 0.9.4

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/dynarex.rb +25 -4
  2. metadata +1 -1
@@ -11,7 +11,7 @@ require 'ostruct'
11
11
  class Dynarex
12
12
  include REXML
13
13
 
14
- attr_accessor :format_mask, :delimiter
14
+ attr_accessor :format_mask, :delimiter, :schema
15
15
 
16
16
  #Create a new dynarex document from 1 of the following options:
17
17
  #* a local file path
@@ -21,9 +21,9 @@ class Dynarex
21
21
  #* an XML string
22
22
  # Dynarex.new '<contacts><summary><schema>contacts/contact(name,age,dob)</schema></summary><records/></contacts>'
23
23
 
24
- def initialize(location)
24
+ def initialize(location=nil)
25
25
  @delimiter = ' '
26
- open(location)
26
+ open(location) if location
27
27
  end
28
28
 
29
29
  def delimiter=(separator)
@@ -40,6 +40,10 @@ class Dynarex
40
40
  @summary[:format_mask] = @format_mask
41
41
  end
42
42
 
43
+ def schema=(s)
44
+ open s
45
+ end
46
+
43
47
  # Returns the hash representation of the document summary.
44
48
 
45
49
  def summary
@@ -78,6 +82,13 @@ xsl_buffer =<<EOF
78
82
  EOF
79
83
 
80
84
  format_mask = XPath.first(@doc.root, 'summary/format_mask/text()').to_s
85
+ dynarex = Dynarex.new
86
+
87
+ s = %q(schema="companies/company(name, last_contacted, contact)" delimiter=" # ")
88
+ s.split(/(?=\w+\="[^"]+")/)
89
+ raw_a = s.scan(/\w+\="[^"]+"/)
90
+ a = raw_a.map{|x| r = x.split(/=/); [(r[0] + "=").to_sym, r[1][/^"(.*)"$/,1]] }
91
+ a.each{|name, value| dynarex.method(name).call(value)}
81
92
 
82
93
  xslt_format = format_mask.to_s.gsub(/\s(?=\[!\w+\])/,'<xsl:text> </xsl:text>').gsub(/\[!(\w+)\]/, '<xsl:value-of select="\1"/>')
83
94
  xsl_buffer.sub!(/\[!regex_values\]/, xslt_format)
@@ -102,9 +113,18 @@ EOF
102
113
  #Parses 1 or more lines of text to create or update existing records.
103
114
 
104
115
  def parse(buffer)
116
+
117
+ raw_header = buffer.slice!(/<\?dynarex[^>]+>/)
118
+
119
+ if raw_header then
120
+ header = raw_header[/<?dynarex (.*)?>/,1]
121
+ header.scan(/\w+\="[^"]+\"/).map{|x| r = x.split(/=/); [(r[0] + "=").to_sym, r[1][/^"(.*)"$/,1]] }.each {|name, value| self.method(name).call(value)}
122
+ end
123
+
105
124
  i = XPath.match(@doc.root, 'records/*/attribute::id').max_by(&:value).to_s.to_i
106
125
  t = @format_mask.to_s.gsub(/\[!(\w+)\]/, '(.*)').sub(/\[/,'\[').sub(/\]/,'\]')
107
- lines = buffer.split(/\r?\n|\r(?!\n)/).map {|x|x.match(/#{t}/).captures}
126
+
127
+ lines = buffer.strip.split(/\r?\n|\r(?!\n)/).map {|x|x.match(/#{t}/).captures}
108
128
 
109
129
  a = lines.map do|x|
110
130
  created = Time.now.to_s
@@ -267,6 +287,7 @@ EOF
267
287
  alias refresh_doc display_xml
268
288
 
269
289
  def dynarex_new(s)
290
+ @schema = s
270
291
  ptrn = %r((\w+)\[?([^\]]+)?\]?\/(\w+)\(([^\)]+)\))
271
292
  root_name, raw_summary, record_name, raw_fields = s.match(ptrn).captures
272
293
  summary, fields = [raw_summary || '',raw_fields].map {|x| x.split(/,/).map &:strip}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynarex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors: []
7
7