nori 2.0.4 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ # 2.1.0 (2013-04-21)
2
+
3
+ * Feature: Added `Nori.hash_key` and `Nori#find` to work with Hash keys generated by Nori.
4
+ Original issue: [savonrb/savon#393](https://github.com/savonrb/savon/pull/393)
5
+
1
6
  # 2.0.4 (2013-02-26)
2
7
 
3
8
  * Fix: [#37](https://github.com/savonrb/nori/issues/37) special characters
@@ -40,6 +45,17 @@ Please make sure to read the updated README for how to use the new version.
40
45
 
41
46
  * Fix: [#16](https://github.com/savonrb/nori/issues/16) strip XML passed to Nori.
42
47
 
48
+ ## 1.1.5 (2013-03-03)
49
+
50
+ * Fix: [#37](https://github.com/savonrb/nori/issues/37) special characters
51
+ problem on Ruby 1.9.3-p392.
52
+
53
+ ## 1.1.4 (2013-01-10)
54
+
55
+ * Fix for remote code execution bug. For more in-depth information, read about the
56
+ recent [Rails hotfix](https://groups.google.com/forum/?fromgroups=#!topic/rubyonrails-security/61bkgvnSGTQ).
57
+ Please make sure to upgrade now!
58
+
43
59
  ## 1.1.3 (2012-07-12)
44
60
 
45
61
  * Fix: Merged [pull request 21](https://github.com/savonrb/nori/pull/21) to fix an
data/Gemfile CHANGED
@@ -1,4 +1,2 @@
1
- source :rubygems
2
-
3
- # Specify your gem's dependencies in nori.gemspec
1
+ source 'https://rubygems.org'
4
2
  gemspec
@@ -4,6 +4,13 @@ require "nori/xml_utility_node"
4
4
 
5
5
  class Nori
6
6
 
7
+ def self.hash_key(name, options = {})
8
+ name = name.tr("-", "_")
9
+ name = name.split(":").last if options[:strip_namespaces]
10
+ name = options[:convert_tags_to].call(name) if options[:convert_tags_to].respond_to? :call
11
+ name
12
+ end
13
+
7
14
  PARSERS = { :rexml => "REXML", :nokogiri => "Nokogiri" }
8
15
 
9
16
  def initialize(options = {})
@@ -18,6 +25,16 @@ class Nori
18
25
  @options = defaults.merge(options)
19
26
  end
20
27
 
28
+ def find(hash, *path)
29
+ return hash if path.empty?
30
+
31
+ key = path.shift
32
+ key = self.class.hash_key(key, @options)
33
+
34
+ return nil unless hash.include? key
35
+ find(hash[key], *path)
36
+ end
37
+
21
38
  def parse(xml)
22
39
  cleaned_xml = xml.strip
23
40
  return {} if cleaned_xml.empty?
@@ -1,5 +1,5 @@
1
1
  class Nori
2
2
 
3
- VERSION = "2.0.4"
3
+ VERSION = "2.1.0"
4
4
 
5
5
  end
@@ -90,9 +90,7 @@ class Nori
90
90
  end.flatten]
91
91
 
92
92
  @options = options
93
- @name = name.tr("-", "_")
94
- @name = @name.split(":").last if @options[:strip_namespaces]
95
- @name = @options[:convert_tags_to].call(@name) if @options[:convert_tags_to].respond_to? :call
93
+ @name = Nori.hash_key(name, options)
96
94
 
97
95
  # leave the type alone if we don't know what it is
98
96
  @type = self.class.available_typecasts.include?(attributes["type"]) ? attributes.delete("type") : attributes["type"]
@@ -62,6 +62,31 @@ describe Nori do
62
62
  end
63
63
  end
64
64
 
65
+ context '#find' do
66
+ before do
67
+ upcase = lambda { |tag| tag.upcase }
68
+ @nori = nori(:convert_tags_to => upcase)
69
+
70
+ xml = '<userResponse id="1"><accountStatus>active</accountStatus></userResponse>'
71
+ @hash = @nori.parse(xml)
72
+ end
73
+
74
+ it 'returns the Hash when the path is empty' do
75
+ result = @nori.find(@hash)
76
+ expect(result).to eq("USERRESPONSE" => { "ACCOUNTSTATUS" => "active", "@ID" => "1" })
77
+ end
78
+
79
+ it 'returns the result for a single key' do
80
+ result = @nori.find(@hash, 'userResponse')
81
+ expect(result).to eq("ACCOUNTSTATUS" => "active", "@ID" => "1")
82
+ end
83
+
84
+ it 'returns the result for nested keys' do
85
+ result = @nori.find(@hash, 'userResponse', 'accountStatus')
86
+ expect(result).to eq("active")
87
+ end
88
+ end
89
+
65
90
  context "#parse" do
66
91
  it "defaults to use advanced typecasting" do
67
92
  hash = nori.parse("<value>true</value>")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nori
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: 2.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-02-26 00:00:00.000000000 Z
14
+ date: 2013-04-21 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rake
@@ -109,7 +109,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
109
  version: '0'
110
110
  segments:
111
111
  - 0
112
- hash: 1629927021843471619
112
+ hash: 2288822480346077713
113
113
  required_rubygems_version: !ruby/object:Gem::Requirement
114
114
  none: false
115
115
  requirements:
@@ -118,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
118
  version: '0'
119
119
  segments:
120
120
  - 0
121
- hash: 1629927021843471619
121
+ hash: 2288822480346077713
122
122
  requirements: []
123
123
  rubyforge_project: nori
124
124
  rubygems_version: 1.8.24