xml2json 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5cc378da33fb0852ab99c25d9063fb78991beb6e
4
+ data.tar.gz: 6f4528dea35a54d0968c3fa2e69a7d2b097575bf
5
+ SHA512:
6
+ metadata.gz: 1bf3da7c11920a55c1125c25b3c01315bb9337e759d4b46d81dd47e8f885edff373c875cc07ae38aa48dff57d66ba08add8cbc84388fa87b639a8c4aa7240b43
7
+ data.tar.gz: 2b730649df904d51d91444f2f2c76469a9683939b58093a00aec4dc4f9706f5d20d73e77bb640432026a8ee8378457630295120959d212cbee71faecea5ecd8e
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ xml2json
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.0
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,68 @@
1
+ # xml2json
2
+
3
+ [![Code Climate](https://codeclimate.com/github/monksoftware/xml2json.png)](https://codeclimate.com/github/monksoftware/xml2json)
4
+
5
+ Transforms XML into JSON
6
+
7
+ ## Installation
8
+
9
+ Add this to your Gemfile
10
+
11
+ ```ruby
12
+ gem 'xml2json', git: 'git@github.com:monksoftware/xml2json.git'
13
+ ```
14
+
15
+ ## Configuration
16
+
17
+ Attributes, text and namespaces key name can be customized, defaults are `_attributes`, `_text` and `_namespaces`
18
+
19
+ ```ruby
20
+ XML2JSON.config do |c|
21
+ c.attributes_key = "attr"
22
+ c.namespaces_key = "nsp"
23
+ c.text_key = "txt"
24
+ end
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ ```ruby
30
+ XML2JSON.parse(xml_string) # => this outputs a json string
31
+ XML2JSON.parse_to_hash(xml_string) # => this outputs a ruby hash
32
+ ```
33
+
34
+ ## Examples
35
+
36
+ ### Input XML
37
+
38
+ ```ruby
39
+ xml = '<?xml version="1.0" encoding="utf-8"?>
40
+ <root>
41
+ <author><name>Andrea</name><email>andrea@wearemonk.com</email></author>
42
+ <author><name>Giuseppe</name><email>giuseppe@wearemonk.com</email></author>
43
+ </root>'
44
+ ```
45
+
46
+ ### Parse to JSON string
47
+
48
+ ```
49
+ XML2JSON.parse(xml)
50
+ ```
51
+
52
+ output is a string
53
+
54
+ ```json
55
+ {"root":{"authors":[{"name":"Andrea", "email":"andrea@wearemonk.com"},{"name":"Giuseppe", "email":"giuseppe@wearemonk.com"}]}}
56
+ ```
57
+
58
+ ### Parse to Ruby Hash
59
+
60
+ ```
61
+ XML2JSON.parse_to_hash(xml)
62
+ ```
63
+
64
+ output is a hash
65
+
66
+ ```ruby
67
+ {"root" => {"authors" => [{"name" => "Andrea", "email" => "andrea@wearemonk.com"},{"name" => "Giuseppe", "email" => "giuseppe@wearemonk.com"}]}}
68
+ ```
data/lib/xml2json.rb ADDED
@@ -0,0 +1,105 @@
1
+ require 'nokogiri'
2
+ require 'json'
3
+ require 'active_support/inflector'
4
+
5
+ module XML2JSON
6
+ class InvalidXML < StandardError; end
7
+
8
+ def self.parse xml
9
+ parse_to_hash(xml).to_json
10
+ end
11
+
12
+ def self.parse_to_hash xml
13
+ begin
14
+ doc = Nokogiri.XML(xml) { |config| config.strict }
15
+ rescue Nokogiri::XML::SyntaxError
16
+ raise InvalidXML.new
17
+ end
18
+
19
+ root = doc.root
20
+ hash = { root.name => parse_node(root) }
21
+ hash[root.name] = { self.configuration.namespaces_key => root.namespaces }.merge(hash[root.name]) unless root.namespaces.empty?
22
+ hash
23
+ end
24
+
25
+
26
+ def self.parse_node(node)
27
+ if node.element_children.count > 0
28
+ parse_attributes(node).merge(node2json(node))
29
+ else
30
+ (node.attributes.empty? ? node.text : parse_attributes(node).merge(text_hash(node)))
31
+ end
32
+ end
33
+
34
+ def self.text_hash(node)
35
+ return {} if node.text.strip.empty?
36
+ { self.configuration.text_key => node.text }
37
+ end
38
+
39
+ def self.parse_attributes(node)
40
+ node.attributes.empty? ? {} : { self.configuration.attributes_key => Hash[node.attributes.map { |k, v| [k, v.value] } ]}
41
+ end
42
+
43
+ def self.node2json node
44
+ node.element_children.each_with_object({}) do |child, hash|
45
+ key = namespaced_node_name child
46
+ pluralized_key = key.pluralize
47
+
48
+ if hash.has_key?(key)
49
+ node_to_nodes!(hash, child)
50
+ hash.delete(key)
51
+ hash[pluralized_key] << parse_node(child)
52
+ else
53
+ if hash.has_key?(pluralized_key)
54
+ hash[pluralized_key] << parse_node(child)
55
+ else
56
+ hash[key] = parse_node(child)
57
+ end
58
+ end
59
+
60
+ end
61
+ end
62
+
63
+ def self.node_to_nodes! hash, node
64
+ key = namespaced_node_name(node)
65
+ if !hash[key].is_a?(Array)
66
+ tmp = hash[key]
67
+ hash[key.pluralize] = []
68
+ hash[key.pluralize] << tmp
69
+ end
70
+ end
71
+
72
+ def self.namespaced_node_name node
73
+ "#{prefix(node)}#{node.name}"
74
+ end
75
+
76
+ def self.prefix node
77
+ if !node.namespace.nil? && !node.namespace.prefix.nil? && !node.namespace.prefix.strip.empty?
78
+ "#{node.namespace.prefix}:"
79
+ else
80
+ ""
81
+ end
82
+ end
83
+
84
+ class Configuration
85
+ attr_accessor :attributes_key, :namespaces_key, :text_key
86
+
87
+ def initialize
88
+ self.attributes_key = '_attributes'
89
+ self.namespaces_key = '_namespaces'
90
+ self.text_key = '_text'
91
+ end
92
+ end
93
+
94
+ def self.configuration
95
+ @configuration ||= Configuration.new
96
+ end
97
+
98
+ def self.config
99
+ yield configuration if block_given?
100
+ end
101
+
102
+ def self.reset
103
+ @configuration = Configuration.new
104
+ end
105
+ end
@@ -0,0 +1,3 @@
1
+ module XML2JSON
2
+ VERSION = "0.4.3"
3
+ end
@@ -0,0 +1 @@
1
+ {"feed":{"_namespaces":{"xmlns":"http://www.w3.org/2005/Atom"},"title":"Giuseppe Modarelli","links":[{"_attributes":{"href":"http://gmodarelli.github.io/atom.xml","rel":"self"}},{"_attributes":{"href":"http://gmodarelli.github.io/"}}],"updated":"2013-12-06T08:20:23-08:00","id":"http://gmodarelli.github.io","author":{"name":"Giuseppe Modarelli"},"entries":[{"title":"Testing API with RSpec","link":{"_attributes":{"href":"http://gmodarelli.github.io/posts/2013/12/06/testing-api-with-rspec.html"}},"updated":"2013-12-06T00:00:00-08:00","id":"http://gmodarelli.github.io/posts/2013/12/06/testing-api-with-rspec","content":{"_attributes":{"type":"html"},"_text":"Text"}},{"title":"yield_successive_args with lots of args","link":{"_attributes":{"href":"http://gmodarelli.github.io/posts/2013/09/18/yield-successive-args-with-lots-of-args.html"}},"updated":"2013-09-18T00:00:00-07:00","id":"http://gmodarelli.github.io/posts/2013/09/18/yield-successive-args-with-lots-of-args","content":{"_attributes":{"type":"html"},"_text":"Text"}}]}}
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <feed xmlns="http://www.w3.org/2005/Atom">
3
+
4
+ <title>Giuseppe Modarelli</title>
5
+ <link href="http://gmodarelli.github.io/atom.xml" rel="self"/>
6
+ <link href="http://gmodarelli.github.io/"/>
7
+ <updated>2013-12-06T08:20:23-08:00</updated>
8
+ <id>http://gmodarelli.github.io</id>
9
+ <author>
10
+ <name>Giuseppe Modarelli</name>
11
+ </author>
12
+
13
+
14
+ <entry>
15
+ <title>Testing API with RSpec</title>
16
+ <link href="http://gmodarelli.github.io/posts/2013/12/06/testing-api-with-rspec.html"/>
17
+ <updated>2013-12-06T00:00:00-08:00</updated>
18
+ <id>http://gmodarelli.github.io/posts/2013/12/06/testing-api-with-rspec</id>
19
+ <content type="html">Text</content>
20
+ </entry>
21
+
22
+ <entry>
23
+ <title>yield_successive_args with lots of args</title>
24
+ <link href="http://gmodarelli.github.io/posts/2013/09/18/yield-successive-args-with-lots-of-args.html"/>
25
+ <updated>2013-09-18T00:00:00-07:00</updated>
26
+ <id>http://gmodarelli.github.io/posts/2013/09/18/yield-successive-args-with-lots-of-args</id>
27
+ <content type="html">Text</content>
28
+ </entry>
29
+
30
+
31
+ </feed>
@@ -0,0 +1 @@
1
+ {"rss":{"_namespaces":{"xmlns:content":"http://purl.org/rss/1.0/modules/content/","xmlns:wfw":"http://wellformedweb.org/CommentAPI/","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:atom":"http://www.w3.org/2005/Atom","xmlns:sy":"http://purl.org/rss/1.0/modules/syndication/","xmlns:slash":"http://purl.org/rss/1.0/modules/slash/"},"_attributes":{"version":"2.0"},"channel":{"title":"Andrea D'Ippolito » Blog","atom:link":{"_attributes":{"href":"http://www.andreadippolito.it/blog/feed/","rel":"self","type":"application/rss+xml"}},"link":"http://www.andreadippolito.it","description":"Web Developer","lastBuildDate":"Tue, 17 Dec 2013 14:34:09 +0000","language":"en","sy:updatePeriod":"hourly","sy:updateFrequency":"1","generator":"http://wordpress.org/?v=3.3.1","item":{"title":"C’è molto da festeggiare…","link":"http://www.andreadippolito.it/eventi/ce-molto-da-festeggiare/","comments":"http://www.andreadippolito.it/eventi/ce-molto-da-festeggiare/#comments","pubDate":"Mon, 22 Feb 2010 08:00:22 +0000","dc:creator":"adedip","categories":["Eventi","setteperuno"],"guid":{"_attributes":{"isPermaLink":"false"},"_text":"http://www.andreadippolito.it/blog/?p=837"},"description":"Nel frattempo mi sono laureato&#8230; (e questo spiega la latitanza) nel futuro c&#8217;è una festa da organizzare e un progetto da portare avanti (questo spiegherà la latitanza futura). Ci vediamo","wfw:commentRss":"http://www.andreadippolito.it/eventi/ce-molto-da-festeggiare/feed/","slash:comments":"2"}}}}
@@ -0,0 +1,36 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <rss version="2.0"
3
+ xmlns:content="http://purl.org/rss/1.0/modules/content/"
4
+ xmlns:wfw="http://wellformedweb.org/CommentAPI/"
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:atom="http://www.w3.org/2005/Atom"
7
+ xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
8
+ xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
9
+ >
10
+
11
+ <channel>
12
+ <title>Andrea D&#039;Ippolito &#187; Blog</title>
13
+ <atom:link href="http://www.andreadippolito.it/blog/feed/" rel="self" type="application/rss+xml" />
14
+ <link>http://www.andreadippolito.it</link>
15
+ <description>Web Developer</description>
16
+ <lastBuildDate>Tue, 17 Dec 2013 14:34:09 +0000</lastBuildDate>
17
+ <language>en</language>
18
+ <sy:updatePeriod>hourly</sy:updatePeriod>
19
+ <sy:updateFrequency>1</sy:updateFrequency>
20
+ <generator>http://wordpress.org/?v=3.3.1</generator>
21
+ <item>
22
+ <title>C&#8217;è molto da festeggiare&#8230;</title>
23
+ <link>http://www.andreadippolito.it/eventi/ce-molto-da-festeggiare/</link>
24
+ <comments>http://www.andreadippolito.it/eventi/ce-molto-da-festeggiare/#comments</comments>
25
+ <pubDate>Mon, 22 Feb 2010 08:00:22 +0000</pubDate>
26
+ <dc:creator>adedip</dc:creator>
27
+ <category><![CDATA[Eventi]]></category>
28
+ <category><![CDATA[setteperuno]]></category>
29
+
30
+ <guid isPermaLink="false">http://www.andreadippolito.it/blog/?p=837</guid>
31
+ <description><![CDATA[Nel frattempo mi sono laureato&#8230; (e questo spiega la latitanza) nel futuro c&#8217;è una festa da organizzare e un progetto da portare avanti (questo spiegherà la latitanza futura). Ci vediamo]]></description>
32
+ <wfw:commentRss>http://www.andreadippolito.it/eventi/ce-molto-da-festeggiare/feed/</wfw:commentRss>
33
+ <slash:comments>2</slash:comments>
34
+ </item>
35
+ </channel>
36
+ </rss>
@@ -0,0 +1,5 @@
1
+ module SpecHelpers
2
+ def self.open_fixture_file(name)
3
+ File.read(File.join(Dir.pwd, 'spec', 'fixtures', name))
4
+ end
5
+ end
@@ -0,0 +1,162 @@
1
+ require 'rspec/autorun'
2
+ require 'spec_helper'
3
+ require 'xml2json'
4
+
5
+ describe XML2JSON do
6
+ describe ".parse" do
7
+ it 'jsonifies parsed hash' do
8
+ expect(XML2JSON).to receive(:parse_to_hash).with('xml').and_return({"key" => "value"})
9
+ expect(XML2JSON.parse('xml')).to eq('{"key":"value"}')
10
+ end
11
+
12
+ context "rss" do
13
+ let(:rss) { SpecHelpers.open_fixture_file('rss.xml') }
14
+ let(:json) { SpecHelpers.open_fixture_file('rss.json').delete("\n") }
15
+
16
+ it "parses the rss into json" do
17
+ hash = XML2JSON.parse(rss)
18
+ expect(hash).to eq(json)
19
+ end
20
+ end
21
+
22
+ context "atom" do
23
+ let(:atom) { SpecHelpers.open_fixture_file('atom.xml') }
24
+ let(:json) { SpecHelpers.open_fixture_file('atom.json').delete("\n") }
25
+
26
+ it "parses the atom into json" do
27
+ expect(XML2JSON.parse(atom)).to eq(json)
28
+ end
29
+ end
30
+ end
31
+
32
+ describe ".parse_to_hash" do
33
+ it "parses xml into hash" do
34
+ xml = '<a><b><c>Hello</c><d>World</d></b></a>'
35
+ json = { "a" => { "b" => { "c" => "Hello", "d" => "World" } } }
36
+ expect(XML2JSON.parse_to_hash(xml)).to eq(json)
37
+
38
+ xml = '<a><b><x>Io</x><c><d>Hello</d><e>World</e></c></b></a>'
39
+ json = { "a" => { "b" => { "x" => "Io", "c" => { "d" => "Hello", "e" => "World" } } } }
40
+ expect(XML2JSON.parse_to_hash(xml)).to eq(json)
41
+ end
42
+
43
+ it "handles multiple elements" do
44
+ xml = '<a><x><b>Primo</b><b>Secondo</b></x></a>'
45
+ expect(XML2JSON.parse_to_hash(xml)).to(
46
+ eq({ "a" => { "x" => { "bs" => [ "Primo", "Secondo" ] } } })
47
+ )
48
+
49
+ xml = '<a><b><x>Primo</x></b><b><x>Secondo</x></b></a>'
50
+ expect(XML2JSON.parse_to_hash(xml)).to(
51
+ eq({ "a" => { "bs" => [ { "x" => "Primo" }, { "x" => "Secondo" } ] } })
52
+ )
53
+
54
+ xml = '<a><b><x>Primo</x></b><b><x>Secondo</x></b><b><x>Terzo</x></b></a>'
55
+ expect(XML2JSON.parse_to_hash(xml)).to(
56
+ eq({ "a" => { "bs" => [ { "x" => "Primo" }, { "x" => "Secondo" }, { "x" => "Terzo" }] } })
57
+ )
58
+ end
59
+
60
+ it "parses node attributes" do
61
+ xml = '<r><a url="www.google.it"></a></r>'
62
+ expect(XML2JSON.parse_to_hash(xml)).to(
63
+ eq({"r" => {"a" => { "_attributes" => {"url" => "www.google.it"}}}})
64
+ )
65
+
66
+ xml = '<r><a url="www.google.it"><b>ciao</b></a></r>'
67
+ expect(XML2JSON.parse_to_hash(xml)).to(
68
+ eq({"r" => {"a" => { "_attributes" => {"url" => "www.google.it"}, "b" => "ciao"}}})
69
+ )
70
+
71
+ xml = '<r><a url="www.google.it"></a><a url="www.google.com"></a></r>'
72
+ expect(XML2JSON.parse_to_hash(xml)).to(
73
+ eq({"r" => {"as" => [{ "_attributes" => {"url" => "www.google.it"}},{ "_attributes" => {"url" => "www.google.com"}}]}})
74
+ )
75
+
76
+ xml = '<r><a url="www.google.it"><b>ciao</b></a><a url="www.google.com"><b>ciao</b></a></r>'
77
+ expect(XML2JSON.parse_to_hash(xml)).to(
78
+ eq({"r" => {"as" => [{ "_attributes" => {"url" => "www.google.it"}, "b" => "ciao"},{ "_attributes" => {"url" => "www.google.com"}, "b" => "ciao"}]}})
79
+ )
80
+ end
81
+
82
+ it "does not add the _text key when a node has no text" do
83
+ xml = '<r><a url="www.google.it" /></r>'
84
+ expect(XML2JSON.parse_to_hash(xml)).to(
85
+ eq({ "r" => { "a" => { "_attributes" => { "url" => "www.google.it" } } } })
86
+ )
87
+ end
88
+
89
+ it "parses root attributes" do
90
+ xml = '<r id="1"><a>Hello</a></r>'
91
+ expect(XML2JSON.parse_to_hash(xml)).to(
92
+ eq({"r" => {"_attributes" => { "id" => "1" }, "a" => "Hello" } })
93
+ )
94
+ end
95
+
96
+ context "namespaces" do
97
+ let(:xml) { '<r xmlns:content="http://purl.org/rss/1.0/modules/content/"><content:encoded>Hello</content:encoded><content:encoded>World</content:encoded></r>' }
98
+ it "parses namespaced node names" do
99
+ expect(XML2JSON.parse_to_hash(xml)).to(
100
+ eq({"r" => { "_namespaces" => { "xmlns:content" => "http://purl.org/rss/1.0/modules/content/" }, "content:encodeds" => [ "Hello", "World" ] } })
101
+ )
102
+ end
103
+ end
104
+
105
+ context "invalid xml file" do
106
+ it "raises an exception if the xml file is bad formed" do
107
+ xml = '<invalid></xml>'
108
+ expect {
109
+ XML2JSON.parse_to_hash(xml)
110
+ }.to raise_error XML2JSON::InvalidXML
111
+
112
+ xml = 'not xml file'
113
+ expect {
114
+ XML2JSON.parse_to_hash(xml)
115
+ }.to raise_error XML2JSON::InvalidXML
116
+ end
117
+ end
118
+
119
+ context "pluralize" do
120
+ it "pluralizes keys name when multiple nodes" do
121
+ xml = '<root><item>Primo</item><item>Secondo</item></root>'
122
+ expect(XML2JSON.parse_to_hash(xml)).to(
123
+ eq({ "root" => { "items" => [ "Primo", "Secondo"] } })
124
+ )
125
+ end
126
+ end
127
+ end
128
+
129
+ context "configuration" do
130
+ after do
131
+ XML2JSON.reset
132
+ end
133
+
134
+ it "let's the user choose the keys" do
135
+ XML2JSON.config do |c|
136
+ c.attributes_key = 'attr'
137
+ c.namespaces_key = 'names'
138
+ c.text_key = 'body'
139
+ end
140
+ expect(XML2JSON.configuration.attributes_key).to eq('attr')
141
+ expect(XML2JSON.configuration.namespaces_key).to eq('names')
142
+ expect(XML2JSON.configuration.text_key).to eq('body')
143
+ end
144
+
145
+ it "provides default values" do
146
+ expect(XML2JSON.configuration.attributes_key).to eq('_attributes')
147
+ expect(XML2JSON.configuration.namespaces_key).to eq('_namespaces')
148
+ expect(XML2JSON.configuration.text_key).to eq('_text')
149
+ end
150
+
151
+ it "restores the default values" do
152
+ XML2JSON.config do |c|
153
+ c.attributes_key = 'attr'
154
+ end
155
+
156
+ expect(XML2JSON.configuration.attributes_key).to eq('attr')
157
+ XML2JSON.reset
158
+
159
+ expect(XML2JSON.configuration.attributes_key).to eq('_attributes')
160
+ end
161
+ end
162
+ end
data/xml2json.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'xml2json/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "xml2json"
8
+ spec.version = XML2JSON::VERSION
9
+ spec.authors = ["Giuseppe Modarelli", "Andrea D'Ippolito"]
10
+ spec.email = ["giuseppe.modarelli@gmail.com","adedip@gmail.com"]
11
+ spec.summary = %q{Turn XML into JSON}
12
+ spec.description = %q{Turn XML into JSON}
13
+ spec.homepage = "https://github.com/monksoftware/xml2json"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rspec", "~> 2.14"
23
+ spec.add_dependency "nokogiri", "~> 1.6"
24
+ spec.add_dependency "activesupport", "~> 4.0"
25
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xml2json
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.3
5
+ platform: ruby
6
+ authors:
7
+ - Giuseppe Modarelli
8
+ - Andrea D'Ippolito
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-06-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.5'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.5'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rspec
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '2.14'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '2.14'
42
+ - !ruby/object:Gem::Dependency
43
+ name: nokogiri
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.6'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.6'
56
+ - !ruby/object:Gem::Dependency
57
+ name: activesupport
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '4.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '4.0'
70
+ description: Turn XML into JSON
71
+ email:
72
+ - giuseppe.modarelli@gmail.com
73
+ - adedip@gmail.com
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".gitignore"
79
+ - ".ruby-gemset"
80
+ - ".ruby-version"
81
+ - Gemfile
82
+ - Gemfile.lock
83
+ - README.md
84
+ - lib/xml2json.rb
85
+ - lib/xml2json/version.rb
86
+ - spec/fixtures/atom.json
87
+ - spec/fixtures/atom.xml
88
+ - spec/fixtures/rss.json
89
+ - spec/fixtures/rss.xml
90
+ - spec/spec_helper.rb
91
+ - spec/xml2json_spec.rb
92
+ - xml2json.gemspec
93
+ homepage: https://github.com/monksoftware/xml2json
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.2.2
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: Turn XML into JSON
117
+ test_files:
118
+ - spec/fixtures/atom.json
119
+ - spec/fixtures/atom.xml
120
+ - spec/fixtures/rss.json
121
+ - spec/fixtures/rss.xml
122
+ - spec/spec_helper.rb
123
+ - spec/xml2json_spec.rb