gyoku 0.4.4 → 0.4.5

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.
data/.travis.yml CHANGED
@@ -1,7 +1,11 @@
1
- script: "rake"
1
+ language: "ruby"
2
+ script: "bundle exec rake"
2
3
  rvm:
3
4
  - 1.8.7
4
5
  - 1.9.2
6
+ - 1.9.3
7
+ - jruby-18mode
8
+ - jruby-19mode
9
+ - rbx-18mode
10
+ - rbx-19mode
5
11
  - ree
6
- - rbx
7
- - jruby
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## 0.4.5 (2012-05-28)
2
+
3
+ * Fix: [issue 8](https://github.com/rubiii/gyoku/issues/8) -
4
+ Conflict between camelcase methods in Rails.
5
+
6
+ * Fix: [pull request 15](https://github.com/rubiii/gyoku/pull/15) -
7
+ Gyoku generates blank attribute values if there are fewer attribute
8
+ values in attributes! than elements.
9
+
10
+ * Fix: [issue 12](https://github.com/rubiii/gyoku/issues/12) -
11
+ Don't remove special keys from the original Hash.
12
+
1
13
  ## 0.4.4
2
14
 
3
15
  * Fix: [issue 6](https://github.com/rubiii/gyoku/issues/6) -
data/README.md CHANGED
@@ -1,34 +1,61 @@
1
- Gyoku ![http://travis-ci.org/rubiii/gyoku](http://travis-ci.org/rubiii/gyoku.png)
1
+ Gyoku [![Build Status](https://secure.travis-ci.org/rubiii/gyoku.png)](http://travis-ci.org/rubiii/gyoku)
2
2
  =====
3
3
 
4
- Gyoku translates Ruby Hashes to XML.
4
+ ##### Translates Ruby Hashes to XML
5
5
 
6
- [Bugs](http://github.com/rubiii/gyoku/issues) | [Docs](http://rubydoc.info/gems/gyoku/frames)
6
+ Gyoku is available through [Rubygems](http://rubygems.org/gems/gyoku) and can
7
+ be installed via:
7
8
 
8
- Installation
9
- ------------
9
+ ```
10
+ $ gem install gyoku
11
+ ```
10
12
 
11
- The gem is available through [Rubygems](http://rubygems.org/gems/gyoku) and can be installed via:
13
+ Gyoku is based on a few conventions.
12
14
 
13
- $ gem install gyoku
15
+ ``` ruby
16
+ Gyoku.xml(:find_user => { :id => 123, "v1:Key" => "api" })
17
+ # => "<findUser><id>123</id><v1:Key>api</v1:Key></findUser>"
18
+ ```
14
19
 
15
- An example
16
- ----------
17
20
 
18
- Gyoku.xml :find_user => { :id => 123, "wsdl:Key" => "api" }
19
- # => "<findUser><id>123</id><wsdl:Key>api</wsdl:Key></findUser>"
21
+ Hash keys
22
+ ---------
20
23
 
21
- As you might notice, Gyoku follows a couple of conventions for translating Hashes into XML.
24
+ Hash key Symbols are converted to lowerCamelCase Strings.
22
25
 
23
- Conventions
24
- -----------
26
+ ``` ruby
27
+ Gyoku.xml(:lower_camel_case => "key")
28
+ # => "<lowerCamelCase>key</lowerCamelCase>"
29
+ ```
30
+
31
+ You can change the default conversion formula.
32
+
33
+ ``` ruby
34
+ Gyoku.convert_symbols_to :camelcase # or one of [:none, :lower_camelcase]
35
+
36
+ Gyoku.xml(:camel_case => "key")
37
+ # => "<CamelCase>key</CamelCase>"
38
+ ```
39
+
40
+ And you can also define your own formula.
41
+
42
+ ``` ruby
43
+ Gyoku.convert_symbols_to { |key| key.upcase }
44
+
45
+ Gyoku.xml(:upcase => "key")
46
+ # => "<UPCASE>key</UPCASE>"
47
+ ```
48
+
49
+ Hash key Strings are not converted and may contain namespaces.
25
50
 
26
- ### Hash keys
51
+ ``` ruby
52
+ Gyoku.xml("XML" => "key")
53
+ # => "<XML>key</XML>"
54
+ ```
27
55
 
28
- * Symbols are converted to lowerCamelCase Strings
29
- * Strings are not converted and may contain namespaces
30
56
 
31
- ### Hash values
57
+ Hash values
58
+ -----------
32
59
 
33
60
  * DateTime objects are converted to xs:dateTime Strings
34
61
  * Objects responding to :to_datetime (except Strings) are converted to xs:dateTime Strings
@@ -37,45 +64,46 @@ Conventions
37
64
  * These conventions are also applied to the return value of objects responding to :call
38
65
  * All other objects are converted to Strings using :to_s
39
66
 
40
- Symbols are converted to lowerCamelCase?
41
- ----------------------------------------
42
-
43
- That's the default. But you can use one of the other conversion formulas:
44
-
45
- Gyoku.convert_symbols_to :camelcase # or one of [:none, :lower_camelcase]
46
-
47
- or even define you own one:
48
-
49
- Gyoku.convert_symbols_to { |key| key.upcase }
50
67
 
51
68
  Special characters
52
69
  ------------------
53
70
 
54
- Gyoku escapes special characters unless the Hash key ends with an exclamation mark:
71
+ Gyoku escapes special characters unless the Hash key ends with an exclamation mark.
72
+
73
+ ``` ruby
74
+ Gyoku.xml(:escaped => "<tag />", :not_escaped! => "<tag />")
75
+ # => "<escaped>&lt;tag /&gt;</escaped><notEscaped><tag /></notEscaped>"
76
+ ```
55
77
 
56
- Gyoku.xml :escaped => "<tag />", :not_escaped! => "<tag />"
57
- # => "<escaped>&lt;tag /&gt;</escaped><notEscaped><tag /></notEscaped>"
58
78
 
59
79
  Self-closing tags
60
80
  -----------------
61
81
 
62
- Hash Keys ending with a forward slash create self-closing tags:
82
+ Hash Keys ending with a forward slash create self-closing tags.
83
+
84
+ ``` ruby
85
+ Gyoku.xml(:"self_closing/" => "", "selfClosing/" => nil)
86
+ # => "<selfClosing/><selfClosing/>"
87
+ ```
63
88
 
64
- Gyoku.xml :"self_closing/" => "", "selfClosing/" => nil
65
- # => "<selfClosing/><selfClosing/>"
66
89
 
67
90
  Sort XML tags
68
91
  -------------
69
92
 
70
- In case you need the XML tags to be in a specific order, you can specify the order through an additional Array stored under an :order! key:
93
+ In case you need the XML tags to be in a specific order, you can specify the order through an additional Array stored under an `:order!` key.
94
+
95
+ ``` ruby
96
+ Gyoku.xml(:name => "Eve", :id => 1, :order! => [:id, :name])
97
+ # => "<id>1</id><name>Eve</name>"
98
+ ```
71
99
 
72
- Gyoku.xml :name => "Eve", :id => 1, :order! => [:id, :name]
73
- # => "<id>1</id><name>Eve</name>"
74
100
 
75
101
  XML attributes
76
102
  --------------
77
103
 
78
- Adding XML attributes is rather ugly, but it can be done by specifying an additional Hash stored under an :attributes! key:
104
+ Adding XML attributes is rather ugly, but it can be done by specifying an additional Hash stored under an `:attributes!` key.
79
105
 
80
- Gyoku.xml :person => "Eve", :attributes! => { :person => { :id => 1 } }
81
- # => "<person id=\"1\">Eve</person>"
106
+ ``` ruby
107
+ Gyoku.xml(:person => "Eve", :attributes! => { :person => { :id => 1 } })
108
+ # => "<person id=\"1\">Eve</person>"
109
+ ```
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
1
  require "bundler"
2
+ require "bundler/setup"
2
3
  Bundler::GemHelper.install_tasks
3
4
 
4
5
  require "rspec/core/rake_task"
data/gyoku.gemspec CHANGED
@@ -15,9 +15,8 @@ Gem::Specification.new do |s|
15
15
 
16
16
  s.add_dependency "builder", ">= 2.1.2"
17
17
 
18
- s.add_development_dependency "rspec", "~> 2.4.0"
19
- s.add_development_dependency "autotest"
20
- s.add_development_dependency "mocha", "~> 0.9.9"
18
+ s.add_development_dependency "rake", "~> 0.9"
19
+ s.add_development_dependency "rspec", "~> 2.10"
21
20
 
22
21
  s.files = `git ls-files`.split("\n")
23
22
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
data/lib/gyoku/array.rb CHANGED
@@ -37,7 +37,7 @@ module Gyoku
37
37
 
38
38
  attributes.inject({}) do |hash, (key, value)|
39
39
  value = value[index] if value.kind_of? ::Array
40
- hash.merge key => value
40
+ value ? hash.merge(key => value) : hash
41
41
  end
42
42
  end
43
43
 
data/lib/gyoku/hash.rb CHANGED
@@ -30,9 +30,12 @@ module Gyoku
30
30
  # Hash +key+ and any XML +attributes+.
31
31
  def self.iterate_with_xml(hash)
32
32
  xml = Builder::XmlMarkup.new
33
- attributes = hash.delete(:attributes!) || {}
33
+ attributes = hash[:attributes!] || {}
34
+ hash_without_attributes = hash.reject { |key, value| key == :attributes! }
34
35
 
35
- order(hash).each { |key| yield xml, key, hash[key], (attributes[key] || {}) }
36
+ order(hash_without_attributes).each do |key|
37
+ yield xml, key, hash_without_attributes[key], (attributes[key] || {})
38
+ end
36
39
 
37
40
  xml.target!
38
41
  end
@@ -41,10 +44,11 @@ module Gyoku
41
44
  # Defaults to return the actual keys of the Hash if no :order! key could be found.
42
45
  # Raises an ArgumentError in case the :order! Array does not match the Hash keys.
43
46
  def self.order(hash)
44
- order = hash.delete :order!
45
- order = hash.keys unless order.kind_of? ::Array
47
+ order = hash[:order!]
48
+ hash_without_order = hash.reject { |key, value| key == :order! }
49
+ order = hash_without_order.keys unless order.kind_of? ::Array
46
50
 
47
- missing, spurious = hash.keys - order, order - hash.keys
51
+ missing, spurious = hash_without_order.keys - order, order - hash_without_order.keys
48
52
  raise ArgumentError, "Missing elements in :order! #{missing.inspect}" unless missing.empty?
49
53
  raise ArgumentError, "Spurious elements in :order! #{spurious.inspect}" unless spurious.empty?
50
54
 
data/lib/gyoku/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Gyoku
2
2
 
3
- VERSION = "0.4.4"
3
+ VERSION = "0.4.5"
4
4
 
5
5
  end
data/lib/gyoku/xml_key.rb CHANGED
@@ -1,12 +1,13 @@
1
- require "gyoku/core_ext/string"
2
-
3
1
  module Gyoku
4
2
  module XMLKey
5
3
  class << self
6
4
 
5
+ CAMELCASE = lambda { |key| key.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase } }
6
+ LOWER_CAMELCASE = lambda { |key| key[0].chr.downcase + CAMELCASE.call(key)[1..-1] }
7
+
7
8
  FORMULAS = {
8
- :lower_camelcase => lambda { |key| key.lower_camelcase },
9
- :camelcase => lambda { |key| key.camelcase },
9
+ :lower_camelcase => lambda { |key| LOWER_CAMELCASE.call(key) },
10
+ :camelcase => lambda { |key| CAMELCASE.call(key) },
10
11
  :none => lambda { |key| key }
11
12
  }
12
13
 
@@ -44,6 +44,13 @@ describe Gyoku::Array do
44
44
 
45
45
  to_xml(array, "value", :escape_xml, :id => [1, 2]).should == result
46
46
  end
47
+
48
+ it "skips attribute for element without attributes if there are fewer attributes than elements" do
49
+ array = ["adam", "eve", "serpent"]
50
+ result = '<value id="1">adam</value><value id="2">eve</value><value>serpent</value>'
51
+
52
+ to_xml(array, "value", :escape_xml, :id => [1, 2]).should == result
53
+ end
47
54
  end
48
55
 
49
56
  def to_xml(*args)
@@ -52,10 +52,12 @@ describe Gyoku::Hash do
52
52
  end
53
53
 
54
54
  it "calls to_s on Strings even if they respond to to_datetime" do
55
- object = "gorilla"
56
- object.expects(:to_datetime).never
55
+ singleton = "gorilla"
56
+ def singleton.to_datetime
57
+ DateTime.new(2012, 03, 22, 16, 22, 33)
58
+ end
57
59
 
58
- to_xml(:name => object).should == "<name>gorilla</name>"
60
+ to_xml(:name => singleton).should == "<name>gorilla</name>"
59
61
  end
60
62
 
61
63
  it "properly serializes nil values" do
@@ -123,6 +125,12 @@ describe Gyoku::Hash do
123
125
  to_xml(hash).should == result
124
126
  end
125
127
 
128
+ it "skips attribute for element without attributes if there are fewer attributes than elements" do
129
+ hash = { :find_user => { :person => ["Lucy", "Anna", "Beth"], :attributes! => { :person => { :id => [1, 3] } } } }
130
+ result = '<findUser><person id="1">Lucy</person><person id="3">Anna</person><person>Beth</person></findUser>'
131
+ to_xml(hash).should == result
132
+ end
133
+
126
134
  it "adds attributes to self-closing tags" do
127
135
  hash = {
128
136
  "category/" => "",
@@ -151,6 +159,34 @@ describe Gyoku::Hash do
151
159
  result.should include("<v1:array>", "<v1:first>Lucy</v1:first>", "<v1:second>Anna</v1:second>")
152
160
  end
153
161
  end
162
+
163
+ it "does not remove special keys from the original Hash" do
164
+ hash = {
165
+ :persons => {
166
+ :first => "Lucy",
167
+ :second => "Anna",
168
+ :order! => [:second, :first],
169
+ :attributes! => { :first => { :first => true } }
170
+ },
171
+ :countries => [:de, :us],
172
+ :order! => [:countries, :persons],
173
+ :attributes! => { :countries => { :array => true } }
174
+ }
175
+
176
+ to_xml(hash)
177
+
178
+ hash.should == {
179
+ :persons => {
180
+ :first => "Lucy",
181
+ :second => "Anna",
182
+ :order! => [:second, :first],
183
+ :attributes! => { :first => { :first => true } }
184
+ },
185
+ :countries => [:de, :us],
186
+ :order! => [:countries, :persons],
187
+ :attributes! => { :countries => { :array => true } }
188
+ }
189
+ end
154
190
  end
155
191
 
156
192
  def to_xml(hash, options = {})
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gyoku
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 5
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 4
10
- version: 0.4.4
9
+ - 5
10
+ version: 0.4.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Daniel Harrington
@@ -15,12 +15,10 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-15 00:00:00 Z
18
+ date: 2012-05-28 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: builder
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
24
22
  none: false
25
23
  requirements:
26
24
  - - ">="
@@ -31,54 +29,40 @@ dependencies:
31
29
  - 1
32
30
  - 2
33
31
  version: 2.1.2
32
+ name: builder
34
33
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: rspec
38
34
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
35
+ requirement: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
38
  none: false
41
39
  requirements:
42
40
  - - ~>
43
41
  - !ruby/object:Gem::Version
44
- hash: 31
42
+ hash: 25
45
43
  segments:
46
- - 2
47
- - 4
48
44
  - 0
49
- version: 2.4.0
45
+ - 9
46
+ version: "0.9"
47
+ name: rake
50
48
  type: :development
51
- version_requirements: *id002
52
- - !ruby/object:Gem::Dependency
53
- name: autotest
54
49
  prerelease: false
55
- requirement: &id003 !ruby/object:Gem::Requirement
56
- none: false
57
- requirements:
58
- - - ">="
59
- - !ruby/object:Gem::Version
60
- hash: 3
61
- segments:
62
- - 0
63
- version: "0"
64
- type: :development
65
- version_requirements: *id003
50
+ requirement: *id002
66
51
  - !ruby/object:Gem::Dependency
67
- name: mocha
68
- prerelease: false
69
- requirement: &id004 !ruby/object:Gem::Requirement
52
+ version_requirements: &id003 !ruby/object:Gem::Requirement
70
53
  none: false
71
54
  requirements:
72
55
  - - ~>
73
56
  - !ruby/object:Gem::Version
74
- hash: 41
57
+ hash: 23
75
58
  segments:
76
- - 0
77
- - 9
78
- - 9
79
- version: 0.9.9
59
+ - 2
60
+ - 10
61
+ version: "2.10"
62
+ name: rspec
80
63
  type: :development
81
- version_requirements: *id004
64
+ prerelease: false
65
+ requirement: *id003
82
66
  description: Gyoku converts Ruby Hashes to XML
83
67
  email: me@rubiii.com
84
68
  executables: []
@@ -88,7 +72,6 @@ extensions: []
88
72
  extra_rdoc_files: []
89
73
 
90
74
  files:
91
- - .gemtest
92
75
  - .gitignore
93
76
  - .rspec
94
77
  - .travis.yml
@@ -100,13 +83,11 @@ files:
100
83
  - gyoku.gemspec
101
84
  - lib/gyoku.rb
102
85
  - lib/gyoku/array.rb
103
- - lib/gyoku/core_ext/string.rb
104
86
  - lib/gyoku/hash.rb
105
87
  - lib/gyoku/version.rb
106
88
  - lib/gyoku/xml_key.rb
107
89
  - lib/gyoku/xml_value.rb
108
90
  - spec/gyoku/array_spec.rb
109
- - spec/gyoku/core_ext/string_spec.rb
110
91
  - spec/gyoku/hash_spec.rb
111
92
  - spec/gyoku/xml_key_spec.rb
112
93
  - spec/gyoku/xml_value_spec.rb
@@ -141,13 +122,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
122
  requirements: []
142
123
 
143
124
  rubyforge_project: gyoku
144
- rubygems_version: 1.7.2
125
+ rubygems_version: 1.8.21
145
126
  signing_key:
146
127
  specification_version: 3
147
128
  summary: Converts Ruby Hashes to XML
148
129
  test_files:
149
130
  - spec/gyoku/array_spec.rb
150
- - spec/gyoku/core_ext/string_spec.rb
151
131
  - spec/gyoku/hash_spec.rb
152
132
  - spec/gyoku/xml_key_spec.rb
153
133
  - spec/gyoku/xml_value_spec.rb
data/.gemtest DELETED
File without changes
@@ -1,19 +0,0 @@
1
- module Gyoku
2
- module CoreExt
3
- module String
4
-
5
- # Returns the String in lowerCamelCase.
6
- def lower_camelcase
7
- self[0].chr.downcase + self.camelcase[1..-1]
8
- end
9
-
10
- # Returns the String in CamelCase.
11
- def camelcase
12
- self.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
13
- end
14
-
15
- end
16
- end
17
- end
18
-
19
- String.send :include, Gyoku::CoreExt::String
@@ -1,17 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe String do
4
-
5
- describe "#lower_camelcase" do
6
- it "converts a snakecase String to lowerCamelCase" do
7
- "lower_camel_case".lower_camelcase.should == "lowerCamelCase"
8
- end
9
- end
10
-
11
- describe "#camelcase" do
12
- it "converts a snakecase String to CamelCase" do
13
- "camel_case".camelcase.should == "CamelCase"
14
- end
15
- end
16
-
17
- end