xml_hate 0.8.3.4 → 2.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9e77b6e96c739ee1560ebeb9158231ca4dc3fc75
4
+ data.tar.gz: 0fd62016eaaf3fbde01b39e64ef67f1c3c42d6c1
5
+ SHA512:
6
+ metadata.gz: 65a5153b5b0fa43018b8ba42d773f476fd9477da4a5de900cd851f5da7dcd6cdb18096f90989709b96e8dbbb78e64a2b56da1e60db222c56f5ff21298b3db48e
7
+ data.tar.gz: c3b96a173c076287c4975451b36b0b1cdb94ccb18981c8809a60d336e6863dfa5d00f1db96166c1e241f96b638dcbc3d170649d4eaa8ebd48bda7b880e25ea32
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  *.gem
2
2
  .bundle
3
- Gemfile.lock
4
3
  pkg/*
5
4
  .DS_Store
6
5
  .idea
data/.travis.yml CHANGED
@@ -3,10 +3,10 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
+ - 2.0.0
6
7
  - jruby-18mode
7
8
  - jruby-19mode
8
9
  - rbx-18mode
9
10
  - rbx-19mode
10
- - ruby-head
11
11
  - jruby-head
12
12
  - ree
data/Gemfile CHANGED
@@ -9,7 +9,6 @@ gem 'activesupport'
9
9
 
10
10
  gem 'minitest'
11
11
  group :development do
12
- gem 'guard'
13
- gem 'guard-minitest', :git => 'git://github.com/aspiers/guard-minitest.git'
14
12
  gem 'ruby_gntp'
13
+ gem 'coveralls'
15
14
  end
data/Gemfile.lock ADDED
@@ -0,0 +1,49 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ xml_hate (2.0.0)
5
+ activesupport
6
+ hashie
7
+ xml-simple
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ activesupport (3.2.12)
13
+ i18n (~> 0.6)
14
+ multi_json (~> 1.0)
15
+ colorize (0.5.8)
16
+ coveralls (0.6.2)
17
+ colorize
18
+ multi_json (~> 1.3)
19
+ rest-client
20
+ simplecov (>= 0.7)
21
+ thor
22
+ hashie (2.0.2)
23
+ i18n (0.6.4)
24
+ mime-types (1.21)
25
+ minitest (4.6.2)
26
+ multi_json (1.6.1)
27
+ rake (10.0.3)
28
+ rest-client (1.6.7)
29
+ mime-types (>= 1.16)
30
+ ruby_gntp (0.3.4)
31
+ simplecov (0.7.1)
32
+ multi_json (~> 1.0)
33
+ simplecov-html (~> 0.7.1)
34
+ simplecov-html (0.7.1)
35
+ thor (0.14.6)
36
+ xml-simple (1.1.2)
37
+
38
+ PLATFORMS
39
+ ruby
40
+
41
+ DEPENDENCIES
42
+ activesupport
43
+ coveralls
44
+ hashie
45
+ minitest
46
+ rake
47
+ ruby_gntp
48
+ xml-simple
49
+ xml_hate!
data/lib/xml_hate.rb CHANGED
@@ -2,6 +2,3 @@ require "xml_hate/version"
2
2
  require "xml_hate/node"
3
3
  require "xml_hate/document"
4
4
  require "xmlsimple"
5
-
6
- module XmlHate
7
- end
@@ -4,24 +4,40 @@ require 'active_support/inflector'
4
4
  module XmlHate
5
5
  class Document
6
6
  def initialize(xml)
7
- @document = XmlSimple.xml_in(xml)
7
+ @document = lower_case_please(XmlSimple.xml_in(xml))
8
8
  end
9
9
 
10
10
  def method_missing(meth, *args, &blk)
11
- return "" if @document.has_key?(meth.to_s) == false
11
+ meth = meth.to_s
12
+ unless @document.has_key?(meth)
13
+ if @document.has_key?(meth.singularize)
14
+ meth = meth.singularize
15
+ else
16
+ return ''
17
+ end
18
+ end
12
19
  objects = pull_the_objects_from_the_xml_document(meth)
13
20
  objects.count == 1 ? objects[0] : objects
14
21
  end
15
22
 
16
23
  private
17
24
 
25
+ def lower_case_please hash
26
+ hash.keys.reduce({}) do |t, key|
27
+ value = hash[key].is_a?(Hash) ? lower_case_please(hash[key])
28
+ : hash[key]
29
+ value = hash[key]
30
+ t.merge!( { key.to_s.underscore => value } )
31
+ end
32
+ end
33
+
18
34
  def pull_the_objects_from_the_xml_document(meth)
19
35
  nodes = read_the_matching_nodes_from_the_xml_document(meth)
20
36
  convert_the_hashes_to_objects(nodes)
21
37
  end
22
38
 
23
39
  def read_the_matching_nodes_from_the_xml_document(meth)
24
- @document[meth.to_s].map { |n| process_this_top_level_node(n) }
40
+ @document[meth].map { |n| process_this_top_level_node(n) }
25
41
  end
26
42
 
27
43
  def convert_the_hashes_to_objects(objects)
@@ -54,7 +70,7 @@ module XmlHate
54
70
  def bring_up_single_elements_as_properties(node)
55
71
  get_properties_with_multiple_elements(node).each do |key, value|
56
72
  value.each { |v| process_this_inner_node(v) }
57
- node[key] = value[0] if get_the_number_of_elements(value) == 1
73
+ node[key] = value[0] if get_the_number_of_elements(value) == 1
58
74
  end
59
75
  end
60
76
 
data/lib/xml_hate/node.rb CHANGED
@@ -1,8 +1,21 @@
1
1
  module XmlHate
2
+
2
3
  class Node
4
+
5
+ attr_reader :_keys
6
+
3
7
  def initialize(hash)
8
+ @_keys = []
4
9
  all_items_in_the_hash_that_are_not_nil(hash).each do |k, v|
5
- create_accessor_for k, convert_the_value_to_the_appropriate_form(v)
10
+ @_keys << get_a_valid_property_name(k)
11
+ form = convert_the_value_to_the_appropriate_form(v)
12
+ if form.is_a?(Node)
13
+ keys = form._keys.map { |x| x.to_s.singularize }.uniq
14
+ if keys.count == 1 && form.send(keys.first.to_sym).is_a?(Array)
15
+ form = form.send(keys.first.to_sym)
16
+ end
17
+ end
18
+ create_accessor_for k, form
6
19
  end
7
20
  end
8
21
 
@@ -19,7 +32,7 @@ module XmlHate
19
32
  def an_empty_array_for_plurals_or_empty_string_for_singulars(meth)
20
33
  return [] if meth.to_s == meth.to_s.pluralize
21
34
 
22
- empty_string = ""
35
+ empty_string = ''
23
36
  attempt_to_attach_content_singleton_to_the_value empty_string
24
37
  empty_string
25
38
  end
@@ -37,6 +50,7 @@ module XmlHate
37
50
  name = name.to_s.gsub('-', '_')
38
51
  name = name.gsub('@', '')
39
52
  name = name.gsub(':', '')
53
+ name = name.underscore
40
54
  name.to_sym
41
55
  end
42
56
 
@@ -55,5 +69,7 @@ module XmlHate
55
69
  rescue
56
70
  end
57
71
  end
72
+
58
73
  end
74
+
59
75
  end
@@ -1,3 +1,3 @@
1
1
  module XmlHate
2
- VERSION = "0.8.3.4"
2
+ VERSION = "2.0.0"
3
3
  end
data/readme.md CHANGED
@@ -1,4 +1,4 @@
1
- # XML Hate
1
+ # XML Hate [![Build Status](https://secure.travis-ci.org/darrencauthon/xml_hate.png?branch=master)](http://travis-ci.org/darrencauthon/xml_hate) [![Coverage Status](https://coveralls.io/repos/darrencauthon/xml_hate/badge.png?branch=master)](https://coveralls.io/r/darrencauthon/xml_hate)
2
2
 
3
3
  ## Reading XML with my own ten-foot poll.
4
4
 
@@ -52,4 +52,4 @@ rearden.firstname # "", defaults to empty string if the value cannot be found
52
52
  rearden.whatever_i_want # "", see above
53
53
  rearden.addresses.count # 0, returns [] by assuming you want the plural version
54
54
 
55
- ```
55
+ ```
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,6 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
1
4
  require 'minitest/spec'
2
5
  require 'minitest/autorun'
3
6
  require './lib/xml_hate.rb'
@@ -233,4 +233,71 @@ DOC
233
233
  end
234
234
 
235
235
  end
236
+
237
+ describe "snake-case the values" do
238
+
239
+ describe "a simple example" do
240
+
241
+ before do
242
+ xml = <<DOC
243
+ <Root>
244
+ <Car Name="Testing" Color="Blue" BodyColor="Red"/>
245
+ </Root>
246
+ DOC
247
+ @document = XmlHate::Document.new(xml)
248
+ end
249
+
250
+ it "should return the properties as lower-case values" do
251
+ @document.car.name.must_equal "Testing"
252
+ @document.car.color.must_equal "Blue"
253
+ end
254
+
255
+ it "should return the underscore" do
256
+ @document.car.body_color.must_equal "Red"
257
+ end
258
+
259
+ end
260
+
261
+ describe "a more complicated example" do
262
+
263
+ before do
264
+ xml = <<DOC
265
+ <Root>
266
+ <FancyCar Name="Testing" Color="Blue" BodyColor="Red"/>
267
+ <FancyCar Name="Testing2" Color="Blue2" BodyColor="Red2"/>
268
+ </Root>
269
+ DOC
270
+ @document = XmlHate::Document.new(xml)
271
+ end
272
+
273
+ it "should return the properties as lower-case values" do
274
+ @document.fancy_cars[0].name.must_equal "Testing"
275
+ @document.fancy_cars[0].color.must_equal "Blue"
276
+ end
277
+
278
+ end
279
+
280
+ describe "an even more complicated example" do
281
+ before do
282
+ xml = <<DOC
283
+ <Root>
284
+ <User Id="1234">
285
+ <Fields>
286
+ <Field Name="The Test" />
287
+ <Field Name="Another Test" />
288
+ </Fields>
289
+ </User>
290
+ </Root>
291
+ DOC
292
+ @document = XmlHate::Document.new(xml)
293
+ end
294
+
295
+ it "should flatten the fields/fields thing" do
296
+ @document.user.fields[0].name.must_equal "The Test"
297
+ end
298
+
299
+ end
300
+
301
+ end
302
+
236
303
  end
data/xml_hate.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
7
7
  s.version = XmlHate::VERSION
8
8
  s.authors = ["Darren Cauthon"]
9
9
  s.email = ["darren@cauthon.com"]
10
- s.homepage = ""
10
+ s.homepage = "http://www.github.com/darrencauthon/xml_hate"
11
11
  s.summary = %q{Handling xml with my own ten-foot poll.}
12
12
  s.description = %q{xml handling without the xml.}
13
13
 
metadata CHANGED
@@ -1,94 +1,82 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: xml_hate
3
- version: !ruby/object:Gem::Version
4
- hash: 11
5
- prerelease:
6
- segments:
7
- - 0
8
- - 8
9
- - 3
10
- - 4
11
- version: 0.8.3.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
12
5
  platform: ruby
13
- authors:
6
+ authors:
14
7
  - Darren Cauthon
15
8
  autorequire:
16
9
  bindir: bin
17
10
  cert_chain: []
18
-
19
- date: 2012-06-07 00:00:00 Z
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2015-06-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: xml-simple
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
33
20
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: hashie
37
21
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- hash: 3
44
- segments:
45
- - 0
46
- version: "0"
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: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
47
34
  type: :runtime
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: activesupport
51
35
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
53
- none: false
54
- requirements:
55
- - - ">="
56
- - !ruby/object:Gem::Version
57
- hash: 3
58
- segments:
59
- - 0
60
- version: "0"
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
61
48
  type: :runtime
62
- version_requirements: *id003
63
- - !ruby/object:Gem::Dependency
64
- name: rake
65
49
  prerelease: false
66
- requirement: &id004 !ruby/object:Gem::Requirement
67
- none: false
68
- requirements:
69
- - - ">="
70
- - !ruby/object:Gem::Version
71
- hash: 3
72
- segments:
73
- - 0
74
- version: "0"
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
75
62
  type: :development
76
- version_requirements: *id004
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
77
69
  description: xml handling without the xml.
78
- email:
70
+ email:
79
71
  - darren@cauthon.com
80
72
  executables: []
81
-
82
73
  extensions: []
83
-
84
74
  extra_rdoc_files: []
85
-
86
- files:
75
+ files:
87
76
  - .gitignore
88
- - .rvmrc
89
77
  - .travis.yml
90
78
  - Gemfile
91
- - Guardfile
79
+ - Gemfile.lock
92
80
  - Rakefile
93
81
  - lib/xml_hate.rb
94
82
  - lib/xml_hate/document.rb
@@ -99,40 +87,30 @@ files:
99
87
  - spec/xml_hate/document_spec.rb
100
88
  - spec/xml_hate/node_spec.rb
101
89
  - xml_hate.gemspec
102
- homepage: ""
90
+ homepage: http://www.github.com/darrencauthon/xml_hate
103
91
  licenses: []
104
-
92
+ metadata: {}
105
93
  post_install_message:
106
94
  rdoc_options: []
107
-
108
- require_paths:
95
+ require_paths:
109
96
  - lib
110
- required_ruby_version: !ruby/object:Gem::Requirement
111
- none: false
112
- requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- hash: 3
116
- segments:
117
- - 0
118
- version: "0"
119
- required_rubygems_version: !ruby/object:Gem::Requirement
120
- none: false
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- hash: 3
125
- segments:
126
- - 0
127
- version: "0"
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - '>='
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
128
107
  requirements: []
129
-
130
108
  rubyforge_project: xml_hate
131
- rubygems_version: 1.8.10
109
+ rubygems_version: 2.4.5
132
110
  signing_key:
133
- specification_version: 3
111
+ specification_version: 4
134
112
  summary: Handling xml with my own ten-foot poll.
135
- test_files:
113
+ test_files:
136
114
  - spec/spec_helper.rb
137
115
  - spec/xml_hate/document_spec.rb
138
116
  - spec/xml_hate/node_spec.rb
data/.rvmrc DELETED
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- # This is an RVM Project .rvmrc file, used to automatically load the ruby
4
- # development environment upon cd'ing into the directory
5
-
6
- # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
- environment_id="ruby-1.8.7-p352@xml_hate"
8
-
9
- #
10
- # Uncomment following line if you want options to be set only for given project.
11
- #
12
- # PROJECT_JRUBY_OPTS=( --1.9 )
13
-
14
- #
15
- # First we attempt to load the desired environment directly from the environment
16
- # file. This is very fast and efficient compared to running through the entire
17
- # CLI and selector. If you want feedback on which environment was used then
18
- # insert the word 'use' after --create as this triggers verbose mode.
19
- #
20
- if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
21
- && -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
22
- then
23
- \. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
24
-
25
- if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
26
- then
27
- . "${rvm_path:-$HOME/.rvm}/hooks/after_use"
28
- fi
29
- else
30
- # If the environment file has not yet been created, use the RVM CLI to select.
31
- if ! rvm --create "$environment_id"
32
- then
33
- echo "Failed to create RVM environment '${environment_id}'."
34
- return 1
35
- fi
36
- fi
37
-
38
- #
39
- # If you use an RVM gemset file to install a list of gems (*.gems), you can have
40
- # it be automatically loaded. Uncomment the following and adjust the filename if
41
- # necessary.
42
- #
43
- # filename=".gems"
44
- # if [[ -s "$filename" ]]
45
- # then
46
- # rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
47
- # fi
48
-
49
- # If you use bundler, this might be useful to you:
50
- # if command -v bundle && [[ -s Gemfile ]]
51
- # then
52
- # bundle install
53
- # fi
54
-
55
-
data/Guardfile DELETED
@@ -1,12 +0,0 @@
1
- guard 'minitest' do
2
- watch(%r|^test/test_(.*)\.rb|)
3
- watch(%r|^lib/(.*)([^/]+)\.rb|) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
4
- watch(%r|^test/test_helper\.rb|) { "test" }
5
- watch(%r|^lib/(.*)\.rb|) { |m| "test/test_#{m[1]}.rb" }
6
-
7
- watch(%r{^spec/.+_spec\.rb$})
8
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
9
- watch(%r{^lib/xml_hate/(.+)\.rb$}) { |m| "spec/xml_hate/#{m[1]}_spec.rb" }
10
- watch(%r{^spec/models/.+\.rb$}) { ["spec/models", "spec/acceptance"] }
11
- watch('spec/spec_helper.rb') { "spec" }
12
- end