muxml 0.0.1
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.
- checksums.yaml +7 -0
- data/Rakefile +9 -0
- data/lib/muxml.rb +7 -0
- data/lib/muxml/base.rb +64 -0
- data/lib/muxml/relation.rb +64 -0
- data/lib/muxml/version.rb +3 -0
- metadata +76 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e764b41fc3d5fc13df36c5ee5b87b2ad1bcebf80
|
4
|
+
data.tar.gz: cf980d37d3c138cf85d2b7c20555b35b064dd8e1
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 67c032ecd03a432c2dc851960328025092b7dfd5f0e062db044919006ccc93fc8a27d3565516270b8977d0f877fa8ae9bc5b5f66860aa500d5ec5b8b66f10ea2
|
7
|
+
data.tar.gz: f55fcf8527e0d659fa2b28f0d76e53948eda45d317ec45a2391197539cf6455ead67bf41fde336c9d0c1743e4a07f312bd8b4e53b80d959f5be01564759a1256
|
data/Rakefile
ADDED
data/lib/muxml.rb
ADDED
data/lib/muxml/base.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
|
3
|
+
module Muxml
|
4
|
+
class Base
|
5
|
+
attr_reader :xml
|
6
|
+
@@xml_files ||= {}
|
7
|
+
@@relations ||= {}
|
8
|
+
|
9
|
+
def initialize(document = nil, element = nil)
|
10
|
+
if @@xml_files.has_key?(self.class)
|
11
|
+
document = @@xml_files[self.class][:file].to_s
|
12
|
+
element = @@xml_files[self.class][:root]
|
13
|
+
end
|
14
|
+
|
15
|
+
case document
|
16
|
+
when String
|
17
|
+
xml = REXML::Document.new File.new(document)
|
18
|
+
when REXML::Element
|
19
|
+
xml = document
|
20
|
+
else
|
21
|
+
raise ArgumentError, 'invalid element'
|
22
|
+
end
|
23
|
+
|
24
|
+
unless element.nil?
|
25
|
+
@xml = xml.elements[element]
|
26
|
+
else
|
27
|
+
@xml = xml
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# for call attributes of xml just prefix with *attribute_*
|
32
|
+
def method_missing(sym, *args, &block)
|
33
|
+
if sym.to_s.start_with?('attribute_')
|
34
|
+
attribute = sym.to_s.sub(/^attribute_/, '')
|
35
|
+
return @xml.attributes[attribute]
|
36
|
+
elsif @@relations.has_key?(self.class)
|
37
|
+
if @@relations[self.class][:many].has_key?(sym)
|
38
|
+
return Relation::Many.new(self, sym, @@relations[self.class][:many][sym].dup)
|
39
|
+
elsif @@relations[self.class][:one].has_key?(sym)
|
40
|
+
return Relation::One.new(self, sym, @@relations[self.class][:one][sym].dup)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
raise NoMethodError, "undefined method `#{sym}' for #{self}"
|
44
|
+
end
|
45
|
+
|
46
|
+
class << self
|
47
|
+
def xml_document(file, root)
|
48
|
+
@@xml_files[self] = {file: file, root: root}
|
49
|
+
end
|
50
|
+
|
51
|
+
def has_many(relation, options)
|
52
|
+
@@relations[self] ||= {many: {}, one: {} }
|
53
|
+
@@relations[self][:many][relation] = options
|
54
|
+
end
|
55
|
+
|
56
|
+
def has_one(relation, options)
|
57
|
+
@@relations[self] ||= {many: {}, one: {} }
|
58
|
+
@@relations[self][:one][relation] = options
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Muxml
|
2
|
+
class Base
|
3
|
+
module Relation
|
4
|
+
|
5
|
+
class One
|
6
|
+
def initialize(obj, relation, options = {})
|
7
|
+
@obj = obj
|
8
|
+
@relation = relation
|
9
|
+
@tag = options.delete(:tag)
|
10
|
+
@class_name = options.delete(:class_name)
|
11
|
+
@query = options.delete(:select)
|
12
|
+
@options = options
|
13
|
+
|
14
|
+
raise ArgumentError, "#{obj.class.to_s} :class_name is nil" if @class_name.nil?
|
15
|
+
raise ArgumentError, "#{obj.class.to_s} :tag is nil" if @tag.nil?
|
16
|
+
unless @query.nil?
|
17
|
+
attributes = @query.map{|k,v| "@#{k}='#{v}'"}.join
|
18
|
+
@find_query = "#{@tag}[#{attributes}]"
|
19
|
+
else
|
20
|
+
@find_query = "#{@tag}"
|
21
|
+
end
|
22
|
+
|
23
|
+
@element = Object.const_get(@class_name).new(obj.xml.elements[@find_query])
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_missing(sym, *args, &block)
|
27
|
+
@element.send(sym, *args, &block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class Many
|
32
|
+
include Enumerable
|
33
|
+
|
34
|
+
def initialize(obj, relation, options = {})
|
35
|
+
@obj = obj
|
36
|
+
@relation = relation
|
37
|
+
@tag = options.delete(:tag) || relation
|
38
|
+
@class_name = options.delete(:class_name)
|
39
|
+
@query = options.delete(:select)
|
40
|
+
@options = options
|
41
|
+
|
42
|
+
raise ArgumentError, "#{obj.class.to_s} :class_name is nil" if @class_name.nil?
|
43
|
+
raise ArgumentError, "#{obj.class.to_s} :tag is nil" if @tag.nil?
|
44
|
+
unless @query.nil?
|
45
|
+
attributes = @query.map{|k,v| "@#{k}='#{v}'"}.join
|
46
|
+
@find_query = "#{@tag}[#{attributes}]"
|
47
|
+
else
|
48
|
+
@find_query = "#{@tag}"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
def each
|
54
|
+
@obj.xml.elements.each("#{@find_query}") { |element|
|
55
|
+
yield Object.const_get(@class_name).new(element)
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: muxml
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jovany Leandro G.C
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-02-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 4.7.5
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 4.7.5
|
41
|
+
description:
|
42
|
+
email: bit4bit@riseup.net
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- Rakefile
|
48
|
+
- lib/muxml.rb
|
49
|
+
- lib/muxml/base.rb
|
50
|
+
- lib/muxml/relation.rb
|
51
|
+
- lib/muxml/version.rb
|
52
|
+
homepage: http://bit4bit.github.com
|
53
|
+
licenses:
|
54
|
+
- MIT
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 2.5.1
|
73
|
+
signing_key:
|
74
|
+
specification_version: 4
|
75
|
+
summary: Map XML to Object
|
76
|
+
test_files: []
|