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.
@@ -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: []