muxml 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,9 @@
1
+ require 'rake/testtask'
2
+
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'test'
6
+ end
7
+
8
+ desc "Run test"
9
+ task :default => :test
@@ -0,0 +1,7 @@
1
+ require 'muxml/base'
2
+ require 'muxml/relation'
3
+
4
+ require 'muxml/version'
5
+
6
+ module Muxml
7
+ end
@@ -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
@@ -0,0 +1,3 @@
1
+ module Muxml
2
+ VERSION = "0.0.1"
3
+ 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: []