oxmlk 0.3.3 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.3
1
+ 0.4.0
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec/spec_helper')
3
+ require 'sqlite3'
4
+ require 'activerecord'
5
+
6
+ DB_PATH = File.join(File.dirname(__FILE__), 'active_record.sqlite3')
7
+ ActiveRecord::Base.establish_connection(
8
+ :adapter => 'sqlite3',
9
+ :database => DB_PATH
10
+ )
11
+
12
+ class Cdr < ActiveRecord::Base
13
+ include OxMlk
14
+
15
+ ox_tag :cdr
16
+
17
+ ox_elem :hangup_cause, :in => 'variables'
18
+ ox_elem :start_stamp, :in => 'variables'
19
+ ox_elem :answer_stamp, :in => 'variables'
20
+ ox_elem :end_stamp, :in => 'variables'
21
+ ox_elem :caller_id, :in => 'variables'
22
+ ox_elem :duration, :in => 'variables'
23
+ ox_elem :billsec, :in => 'variables'
24
+ end
25
+
26
+ # do a quick pseudo migration. This should only get executed on the first run
27
+ unless Cdr.table_exists?
28
+ ActiveRecord::Base.connection.create_table(:cdrs) do |t|
29
+ t.string :hangup_cause
30
+ t.string :start_stamp
31
+ t.string :answer_stamp
32
+ t.string :end_stamp
33
+ t.string :caller_id
34
+ t.string :duration
35
+ t.string :billsec
36
+ t.timestamps
37
+ end
38
+ end
39
+
40
+ new_cdr = Cdr.from_xml(xml_for(:fs_cdr))
41
+
42
+ new_cdr.save
43
+ cdr = Cdr.find new_cdr.id
44
+
45
+ puts cdr.hangup_cause,
46
+ cdr.start_stamp,
47
+ cdr.answer_stamp,
48
+ cdr.end_stamp,
49
+ cdr.caller_id,
50
+ cdr.duration,
51
+ cdr.billsec,
52
+ '',
53
+ cdr.to_xml
@@ -0,0 +1,26 @@
1
+ <?xml version="1.0"?>
2
+ <cdr>
3
+ <variables>
4
+
5
+ <!-- extra xml tags 'n such i don't need -->
6
+
7
+ <hangup_cause>NORMAL_CLEARING</hangup_cause>
8
+ <start_stamp>2008-07-31 2011</start_stamp>
9
+ <answer_stamp>2008-07-31 2011</answer_stamp>
10
+ <end_stamp>2008-07-31 2011</end_stamp>
11
+
12
+ <caller_id>Mikey</caller_id>
13
+ <duration>39</duration>
14
+ <billsec>36</billsec>
15
+
16
+ <!-- extra xml tags 'n such i don't need -->
17
+
18
+ </variables>
19
+ </cdr>
20
+
21
+ <!--
22
+ these are the exact tag names and such i will recieve from Mod_xml_cdr,
23
+ there's ALOT more, but these are the only ones i need.
24
+ From the xml_cdr wiki: 'Date/time stamp variables are URI encoded
25
+ so be sure to "URI decode" them prior to inserting them into a database.'
26
+ -->
@@ -25,7 +25,6 @@ private
25
25
  end
26
26
 
27
27
  module InstanceMethods
28
-
29
28
  # Returns a LibXML::XML::Node representing this object
30
29
  def to_xml
31
30
  self.class.to_xml(self)
@@ -124,7 +123,7 @@ private
124
123
  def ox_attr(name,o={},&block)
125
124
  new_attr = Attr.new(name, o.reverse_merge(:tag_proc => @tag_proc),&block)
126
125
  @ox_attrs << new_attr
127
- attr_accessor new_attr.accessor
126
+ ox_accessor new_attr.accessor
128
127
  end
129
128
 
130
129
  # Declares a reference to a certain xml element or a typed collection of elements.
@@ -197,7 +196,7 @@ private
197
196
  # The array will include all elements already manipulated by anything passed to
198
197
  # the :as option. If the :as option is an Array and no block is passed then the
199
198
  # Array is returned unmodified. If the :as option is nil or is not an Array then
200
- # only the first element is returned.
199
+ # only the first element is
201
200
  #
202
201
  # == Options
203
202
  # === :as
@@ -336,7 +335,7 @@ private
336
335
  def ox_elem(name,o={},&block)
337
336
  new_elem = Elem.new(name, o.reverse_merge(:tag_proc => @tag_proc),&block)
338
337
  @ox_elems << new_elem
339
- attr_accessor new_elem.accessor
338
+ ox_accessor new_elem.accessor
340
339
  end
341
340
 
342
341
  # Sets the name of the XML element that represents this class. Use this
@@ -407,9 +406,21 @@ private
407
406
  xml = XML::Node.from(data)
408
407
  raise 'invalid XML' unless xml.name == ox_tag
409
408
 
410
- ox = new
411
- (ox_attrs + ox_elems).each {|e| ox.send(e.setter,e.from_xml(xml))}
412
- ox
409
+ returning new do |ox|
410
+ (ox_attrs + ox_elems).each {|e| ox.send(e.setter,e.from_xml(xml))}
411
+ ox.send(:after_parse) if ox.respond_to?(:after_parse)
412
+ end
413
+ end
414
+
415
+ def ox_accessor(sym)
416
+ define_method(sym) do
417
+ @attributes ||= {}
418
+ @attributes[sym.to_s]
419
+ end
420
+ define_method("#{sym}=") do |val|
421
+ @attributes ||= {}
422
+ @attributes[sym.to_s] = val
423
+ end
413
424
  end
414
425
 
415
426
  # Returns XML generated from an instance based on Attr & Elem definitions.
@@ -417,13 +428,24 @@ private
417
428
  # @return [XML::Node] Generated XML::Node
418
429
  def to_xml(data)
419
430
  ox = XML::Node.new(ox_tag)
431
+ wrappers = {}
432
+
420
433
  ox_elems.each do |elem|
421
- elem.to_xml(data).each{|e| ox << e}
434
+ if elem.in
435
+ wrappers[elem.in] ||= XML::Node.new elem.in
436
+ elem.to_xml(data).each {|e| wrappers[elem.in] << e}
437
+ else
438
+ elem.to_xml(data).each {|e| ox << e}
439
+ end
422
440
  end
441
+
442
+ wrappers.each {|k,v| ox << v}
443
+
423
444
  ox_attrs.each do |a|
424
445
  val = data.send(a.accessor).to_s
425
446
  ox[a.tag]= val if val.present?
426
447
  end
448
+
427
449
  ox
428
450
  end
429
451
  end
@@ -1,7 +1,7 @@
1
1
  module OxMlk
2
2
  class Attr
3
3
 
4
- attr_reader :accessor, :setter,:from, :as, :procs, :tag_proc, :tag
4
+ attr_reader :accessor, :setter, :from, :as, :procs, :tag_proc, :tag
5
5
 
6
6
  # Named Procs for use in :as option.
7
7
  PROCS = (Hash.new {|h,k| k.to_proc rescue nil}).merge(
@@ -44,13 +44,13 @@ module OxMlk
44
44
  @procs = ([*as].map {|k| PROCS[k]} + [block]).compact
45
45
  end
46
46
 
47
- private
48
-
49
47
  # Finds @tag in data and applies procs.
50
48
  def from_xml(data)
51
49
  procs.inject(XML::Node.from(data)[tag]) {|d,p| p.call(d) rescue d}
52
50
  end
53
51
 
52
+ private
53
+
54
54
  # Converts a value to a Boolean.
55
55
  # @param [Symbol,String,Integer] value Value to convert
56
56
  # @return [Boolean] Returns true if value is 'true', 'yes', 't' or 1.
@@ -24,7 +24,7 @@ module OxMlk
24
24
  @from = o[:from]
25
25
  @as = [*o[:as]].compact
26
26
  @as = [:bool] if as.empty? && name.to_s.end_with?('?')
27
- @in = o[:in]
27
+ @in = o[:in].to_s
28
28
 
29
29
  @procs = as.map {|k| PROCS[k]}
30
30
  @procs = [PROCS[:value]] + procs unless [:raw,:name,:value].include?(as.first) || ox?
@@ -63,8 +63,7 @@ module OxMlk
63
63
  XML::Node.new(tag, node.to_s)
64
64
  end
65
65
  end
66
- return [] if nodes.empty?
67
- @in ? [nodes.inject(XML::Node.new(@in)) {|o,n| o << n}] : nodes
66
+ nodes.empty? ? [] : nodes
68
67
  end
69
68
 
70
69
  def xpath
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{oxmlk}
8
- s.version = "0.3.3"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Josh Robinson"]
12
- s.date = %q{2009-09-08}
12
+ s.date = %q{2009-09-10}
13
13
  s.description = %q{OxMlk gives you a simple way to map you ruby objects to XML and then convert one to the other.}
14
14
  s.email = %q{hexorx@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -24,11 +24,13 @@ Gem::Specification.new do |s|
24
24
  "VERSION",
25
25
  "examples/amazon.rb",
26
26
  "examples/example.rb",
27
+ "examples/fs_cdr.rb",
27
28
  "examples/phrk.rb",
28
29
  "examples/posts.rb",
29
30
  "examples/twitter.rb",
30
31
  "examples/xml/amazon.xml",
31
32
  "examples/xml/example.xml",
33
+ "examples/xml/fs_cdr.xml",
32
34
  "examples/xml/phrk.xml",
33
35
  "examples/xml/posts.xml",
34
36
  "examples/xml/twitter.xml",
@@ -58,6 +60,7 @@ Gem::Specification.new do |s|
58
60
  "spec/xml_spec.rb",
59
61
  "examples/amazon.rb",
60
62
  "examples/example.rb",
63
+ "examples/fs_cdr.rb",
61
64
  "examples/phrk.rb",
62
65
  "examples/posts.rb",
63
66
  "examples/twitter.rb"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oxmlk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Robinson
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-08 00:00:00 -06:00
12
+ date: 2009-09-10 00:00:00 -06:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -59,11 +59,13 @@ files:
59
59
  - VERSION
60
60
  - examples/amazon.rb
61
61
  - examples/example.rb
62
+ - examples/fs_cdr.rb
62
63
  - examples/phrk.rb
63
64
  - examples/posts.rb
64
65
  - examples/twitter.rb
65
66
  - examples/xml/amazon.xml
66
67
  - examples/xml/example.xml
68
+ - examples/xml/fs_cdr.xml
67
69
  - examples/xml/phrk.xml
68
70
  - examples/xml/posts.xml
69
71
  - examples/xml/twitter.xml
@@ -115,6 +117,7 @@ test_files:
115
117
  - spec/xml_spec.rb
116
118
  - examples/amazon.rb
117
119
  - examples/example.rb
120
+ - examples/fs_cdr.rb
118
121
  - examples/phrk.rb
119
122
  - examples/posts.rb
120
123
  - examples/twitter.rb