xommelier 0.1.19 → 0.1.20

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.
Files changed (45) hide show
  1. data/Rakefile +2 -2
  2. data/examples/atom.rb +3 -3
  3. data/lib/xommelier.rb +9 -0
  4. data/lib/xommelier/atom/links_extension.rb +12 -2
  5. data/lib/xommelier/atom/source.rb +12 -2
  6. data/lib/xommelier/core_ext/boolean.rb +1 -0
  7. data/lib/xommelier/core_ext/float.rb +1 -1
  8. data/lib/xommelier/core_ext/numeric.rb +1 -1
  9. data/lib/xommelier/core_ext/time.rb +9 -1
  10. data/lib/xommelier/core_ext/uri.rb +6 -2
  11. data/lib/xommelier/open_search.rb +55 -40
  12. data/lib/xommelier/rss.rb +51 -6
  13. data/lib/xommelier/rss/atomic.rb +21 -0
  14. data/lib/xommelier/schemas/dublincore/dc.xsd +118 -0
  15. data/lib/xommelier/schemas/dublincore/dcmitype.xsd +52 -0
  16. data/lib/xommelier/schemas/dublincore/dcterms.xsd +382 -0
  17. data/lib/xommelier/schemas/dublincore/qualifieddc.xsd +40 -0
  18. data/lib/xommelier/schemas/dublincore/simpledc.xsd +39 -0
  19. data/lib/xommelier/schemas/opensearch.xsd +484 -0
  20. data/lib/xommelier/schemas/syndication/creativeCommons.xsd +17 -0
  21. data/lib/xommelier/schemas/syndication/fh.xsd +19 -0
  22. data/lib/xommelier/schemas/syndication/schematron.xsd +254 -0
  23. data/lib/xommelier/schemas/syndication/thr.xsd +39 -0
  24. data/lib/xommelier/schemas/syndication/trackback.xsd +18 -0
  25. data/lib/xommelier/version.rb +1 -1
  26. data/lib/xommelier/xml/element.rb +1 -0
  27. data/lib/xommelier/xml/element/serialization.rb +12 -11
  28. data/lib/xommelier/xml/element/structure.rb +19 -19
  29. data/lib/xommelier/xml/element/structure/property.rb +4 -0
  30. data/spec/fixtures/opensearch.full.xml +23 -0
  31. data/spec/functional/xommelier/atom/feed/building_hash_spec.rb +37 -0
  32. data/spec/functional/xommelier/atom/feed/building_spec.rb +33 -0
  33. data/spec/functional/{atom_feed_parsing_spec.rb → xommelier/atom/feed/parsing_spec.rb} +3 -4
  34. data/spec/functional/{atom_feed_thread_building_spec.rb → xommelier/atom/threading/building_spec.rb} +0 -0
  35. data/spec/functional/xommelier/open_search/description/building_spec.rb +36 -0
  36. data/spec/functional/xommelier/open_search/description/parsing_spec.rb +47 -0
  37. data/spec/functional/{rss_feed_building_spec.rb → xommelier/rss/rss/building_spec.rb} +0 -0
  38. data/spec/functional/{rss_feed_parsing_spec.rb → xommelier/rss/rss/parsing_spec.rb} +0 -0
  39. data/spec/lib/xommelier/rss/email_address_spec.rb +22 -0
  40. data/spec/lib/xommelier/xml/element_spec.rb +2 -2
  41. data/spec/spec_helper.rb +1 -0
  42. data/xommelier.gemspec +8 -8
  43. metadata +34 -14
  44. data/spec/functional/atom_feed_building_spec.rb +0 -31
  45. data/spec/functional/build_nested_document_from_hash_spec.rb +0 -39
@@ -28,6 +28,10 @@ module Xommelier
28
28
  options[:type]
29
29
  end
30
30
 
31
+ def complex_type?
32
+ type < Xml::Element
33
+ end
34
+
31
35
  # @return [true, false] has default value?
32
36
  def default?
33
37
  options.key?(:default) && required?
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
3
+ <ShortName>Web Search</ShortName>
4
+ <Description>Use Example.com to search the Web.</Description>
5
+ <Url template="http://example.com/?q={searchTerms}&amp;pw={startPage?}&amp;format=atom" type="application/atom+xml"/>
6
+ <Url template="http://example.com/?q={searchTerms}&amp;pw={startPage?}&amp;format=rss" type="application/rss+xml"/>
7
+ <Url template="http://example.com/?q={searchTerms}&amp;pw={startPage?}" type="text/html"/>
8
+ <Query role="example" searchTerms="cat"/>
9
+ <Tags>example web</Tags>
10
+ <Contact>admin@example.com</Contact>
11
+ <LongName>Example.com Web Search</LongName>
12
+ <Developer>Example.com Development Team</Developer>
13
+ <Attribution>
14
+ Search data Copyright 2005, Example.com, Inc., All Rights Reserved
15
+ </Attribution>
16
+ <SyndicationRight>open</SyndicationRight>
17
+ <AdultContent>false</AdultContent>
18
+ <Language>en-us</Language>
19
+ <InputEncoding>UTF-8</InputEncoding>
20
+ <OutputEncoding>UTF-8</OutputEncoding>
21
+ <Image height="64" width="64" type="image/png">http://example.com/websearch.png</Image>
22
+ <Image height="16" width="16" type="image/vnd.microsoft.icon">http://example.com/websearch.ico</Image>
23
+ </OpenSearchDescription>
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Xommelier::Atom::Feed do
4
+ describe '.new(Hash)' do
5
+ let(:hash) do
6
+ {
7
+ title: 'Xommelier nest elements',
8
+ subtitle: 'Xommelier is able to build complex objects from very nested hash',
9
+ author: {name: 'Alexander', email: 'al@semyonov.us'},
10
+ updated: Time.utc(2012, 04, 04, 04, 04),
11
+ contributors: [
12
+ {name: 'Artyom', email: 'sevenov@gmail.com'},
13
+ {name: 'Ivan', email: 'ivan@example.com'},
14
+ {name: 'Pyotr', email: 'pyotr@example.com'},
15
+ ],
16
+ entries: [
17
+ {title: 'First article', updated: Time.utc(2012, 01, 01, 01, 01)},
18
+ {title: 'Second article', updated: Time.utc(2012, 02, 02, 02, 02)},
19
+ {title: 'Third article', updated: Time.utc(2012, 03, 03, 03, 03)},
20
+ ]
21
+ }
22
+ end
23
+
24
+ subject(:doc) { Xommelier::Atom::Feed.new(hash) }
25
+
26
+ it { should have(1).authors }
27
+ it { should have(3).contributors }
28
+ it { should have(3).entries }
29
+
30
+ it { doc.author.should be_an(Xommelier::Atom::Person) }
31
+ it { doc.contributors[2].should be_an(Xommelier::Atom::Person) }
32
+ it { doc.entries[1].should be_an(Xommelier::Atom::Entry) }
33
+
34
+ its(:to_hash) { should == hash}
35
+ its(:to_xml) { should == load_xml_file('nested_atom') }
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Xommelier::Atom::Feed do
4
+ describe '.to_xml' do
5
+ subject(:feed) do
6
+ Xommelier::Atom::Feed.new.tap do |feed|
7
+ feed.id = 'urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6'
8
+ feed.title = 'Example Feed'
9
+ feed.link = Xommelier::Atom::Link.new(href: 'http://example.org/')
10
+ feed.updated = Time.utc(2003, 12, 13, 18, 30, 02)
11
+ feed.author = Xommelier::Atom::Person.new(name: 'John Doe')
12
+ feed.entry = Xommelier::Atom::Entry.new(
13
+ title: 'Atom-Powered Robots Run Amok',
14
+ id: 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a',
15
+ updated: Time.utc(2003, 12, 13, 18, 30, 02),
16
+ summary: 'Some text.'
17
+ ).tap do |entry|
18
+ entry.link = Xommelier::Atom::Link.new(href: 'http://example.org/2003/12/13/atom03')
19
+ end
20
+ end
21
+ end
22
+
23
+ let(:parsed_xml) { Nokogiri::XML(feed.to_xml) }
24
+ let(:rng) { Nokogiri::XML::RelaxNG(load_xml_file('atom.rng')) }
25
+ let(:xsd) { Xommelier::Atom.schema }
26
+
27
+ it { should be_valid }
28
+
29
+ its(:to_xml) { should == load_xml_file('simple_feed.atom') }
30
+ it('should conform to RelaxNG schema') { rng.valid?(parsed_xml).should == true }
31
+ it('should conform to XML Schema') { xsd.valid?(parsed_xml).should == true }
32
+ end
33
+ end
@@ -1,11 +1,10 @@
1
1
  # coding: utf-8
2
2
  require 'spec_helper'
3
3
  require 'active_support/core_ext/numeric/time'
4
- require 'xommelier/atom/threading'
5
- require 'xommelier/atom/history'
4
+ require 'xommelier/atom/full'
6
5
 
7
- describe 'Atom feed' do
8
- describe 'parsing' do
6
+ describe Xommelier::Atom::Feed do
7
+ describe '.parse' do
9
8
  let(:atom_xml) { load_xml_file('feed.atom') }
10
9
  let(:feed) { Xommelier::Atom::Feed.parse(atom_xml) }
11
10
 
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe Xommelier::OpenSearch::Description do
4
+ describe '.to_xml' do
5
+ let(:hash) do
6
+ {
7
+ short_name: 'Web Search',
8
+ description: 'Use Example.com to search the Web.',
9
+ urls: [{template: 'http://example.com/?q={searchTerms}&pw={startPage?}&format=atom',
10
+ type: 'application/atom+xml'},
11
+ {template: 'http://example.com/?q={searchTerms}&pw={startPage?}&format=rss',
12
+ type: 'application/rss+xml'},
13
+ {template: 'http://example.com/?q={searchTerms}&pw={startPage?}',
14
+ type: 'text/html'}],
15
+ query: {role: 'example', search_terms: 'cat'},
16
+ tags: 'example web',
17
+ contact: 'admin@example.com',
18
+ long_name: 'Example.com Web Search',
19
+ developer: 'Example.com Development Team',
20
+ attribution: "\n Search data Copyright 2005, Example.com, Inc., All Rights Reserved\n ",
21
+ syndication_right: 'open',
22
+ language: 'en-us',
23
+ input_encoding: 'UTF-8',
24
+ output_encoding: 'UTF-8',
25
+ adult_content: false,
26
+ images: [{height: 64, width: 64, type: 'image/png', text: 'http://example.com/websearch.png'},
27
+ {height: 16, width: 16, type: 'image/vnd.microsoft.icon', text: 'http://example.com/websearch.ico'}]
28
+ }
29
+ end
30
+ subject(:description) { Xommelier::OpenSearch::Description.new(hash) }
31
+
32
+ its(:to_hash) { should == hash }
33
+ it { should be_valid }
34
+ its(:to_xml) { should == load_xml_file('opensearch.full') }
35
+ end
36
+ end
@@ -0,0 +1,47 @@
1
+ # coding: utf-8
2
+ require 'spec_helper'
3
+ require 'xommelier/open_search'
4
+
5
+ describe Xommelier::OpenSearch::Description do
6
+ describe '.parse' do
7
+ let(:osd_xml) { load_xml_file('opensearch.full') }
8
+ let(:description) { Xommelier::OpenSearch::Description.parse(osd_xml) }
9
+
10
+ subject { description }
11
+
12
+ its(:adult_content) { should be_false }
13
+ its(:attribution) { should == "\n Search data Copyright 2005, Example.com, Inc., All Rights Reserved\n " }
14
+ its(:contact) { should == 'admin@example.com' }
15
+ its(:description) { should == 'Use Example.com to search the Web.' }
16
+ its(:developer) { should == 'Example.com Development Team' }
17
+ its(:input_encoding) { should == 'UTF-8' }
18
+ its(:language) { should == 'en-us' }
19
+ its(:long_name) { should == 'Example.com Web Search' }
20
+ its(:output_encoding) { should == 'UTF-8' }
21
+ its(:short_name) { should == 'Web Search' }
22
+ its(:syndication_right) { should == 'open' }
23
+ its(:tags) { should == 'example web' }
24
+
25
+ it { should have(2).images }
26
+ describe '#images' do
27
+ it { subject.images[0].should == 'http://example.com/websearch.png' }
28
+ it { subject.images[0].type.should == 'image/png' }
29
+ it { subject.images[0].height.should == 64 }
30
+ it { subject.images[0].width.should == 64 }
31
+ it { subject.images[1].should == 'http://example.com/websearch.ico' }
32
+ it { subject.images[1].type.should == 'image/vnd.microsoft.icon' }
33
+ it { subject.images[1].height.should == 16 }
34
+ it { subject.images[1].width.should == 16 }
35
+ end
36
+
37
+ it { should have(3).urls }
38
+ describe '#urls' do
39
+ it { subject.urls[0].type.should == 'application/atom+xml' }
40
+ it { subject.urls[0].template.should == 'http://example.com/?q={searchTerms}&pw={startPage?}&format=atom' }
41
+ it { subject.urls[1].type.should == 'application/rss+xml' }
42
+ it { subject.urls[1].template.should == 'http://example.com/?q={searchTerms}&pw={startPage?}&format=rss' }
43
+ it { subject.urls[2].type.should == 'text/html' }
44
+ it { subject.urls[2].template.should == 'http://example.com/?q={searchTerms}&pw={startPage?}' }
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ describe Xommelier::RSS::EmailAddress do
4
+ {
5
+ 'al@semyonov.us' => ['al@semyonov.us', nil],
6
+ 'al@semyonov.us (Alexander)' => ['al@semyonov.us', 'Alexander'],
7
+ 'al@semyonov.us (Alexander Semyonov)' => ['al@semyonov.us', 'Alexander Semyonov']
8
+ }.each do |email_address, (address, name)|
9
+ it "parses #{email_address.inspect} as address:#{address.inspect}, name:#{name.inspect}" do
10
+ e = described_class.from_xommelier(email_address)
11
+ e.should == address
12
+ e.name.should == name
13
+ end
14
+
15
+ it "produces #{email_address.inspect} from address:#{address.inspect}, name:#{name.inspect}" do
16
+ e = described_class.new
17
+ e.address = address
18
+ e.name = name
19
+ e.to_xommelier.should == email_address
20
+ end
21
+ end
22
+ end
@@ -35,11 +35,11 @@ describe Xommelier::Xml::Element do
35
35
 
36
36
  describe 'with many simple subelements' do
37
37
  subject do
38
- NamespacedModule::RootWithManySimpleSubelements.new(foos: ['bar', 'baz'])
38
+ NamespacedModule::RootWithManySimpleSubelements.new(foos: %w(bar baz))
39
39
  end
40
40
 
41
41
  it { should respond_to(:foo) }
42
- it { subject.foos.should == ['bar', 'baz'] }
42
+ it { subject.foos.should == %w(bar baz) }
43
43
  it { subject.foo.should == 'bar' }
44
44
  it { subject.to_xml.should == %(<?xml version="1.0" encoding="utf-8"?>\n<root-with-many-simple-subelements xmlns="http://example.org/">\n <foo>bar</foo>\n <foo>baz</foo>\n</root-with-many-simple-subelements>\n) }
45
45
  end
@@ -4,6 +4,7 @@ require 'rspec'
4
4
  require 'xommelier'
5
5
  require 'namespaced_module'
6
6
 
7
+ #noinspection RubyResolve
7
8
  Dir[File.join(SPEC_ROOT, 'spec/support/**/*.rb')].each {|f| require f}
8
9
 
9
10
  ATOM_XMLNS = 'http://www.w3.org/2005/Atom'
@@ -1,22 +1,22 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "xommelier/version"
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'xommelier/version'
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = "xommelier"
6
+ s.name = 'xommelier'
7
7
  s.version = Xommelier::VERSION
8
- s.authors = ["Alexander Semyonov"]
9
- s.email = ["al@semyonov.us"]
10
- s.homepage = "http://github.com/alsemyonov/xommelier"
8
+ s.authors = ['Alexander Semyonov']
9
+ s.email = %w(al@semyonov.us)
10
+ s.homepage = 'http://github.com/alsemyonov/xommelier'
11
11
  s.summary = %q{Xommelier is an XML Sommelier}
12
12
  s.description = %q{XML-Object Mapper with many built-in XML formats supported}
13
13
 
14
- s.rubyforge_project = "xommelier"
14
+ s.rubyforge_project = 'xommelier'
15
15
 
16
16
  s.files = `git ls-files`.split("\n")
17
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
- s.require_paths = ["lib"]
19
+ s.require_paths = %w(lib)
20
20
 
21
21
  s.add_dependency 'nokogiri', '~> 1.5.0'
22
22
  s.add_dependency 'activesupport', '~> 3.2.0'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xommelier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.19
4
+ version: 0.1.20
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-10 00:00:00.000000000 Z
12
+ date: 2013-01-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -106,8 +106,20 @@ files:
106
106
  - lib/xommelier/open_search.rb
107
107
  - lib/xommelier/opml.rb
108
108
  - lib/xommelier/rss.rb
109
+ - lib/xommelier/rss/atomic.rb
109
110
  - lib/xommelier/schemas/atom.xsd
111
+ - lib/xommelier/schemas/dublincore/dc.xsd
112
+ - lib/xommelier/schemas/dublincore/dcmitype.xsd
113
+ - lib/xommelier/schemas/dublincore/dcterms.xsd
114
+ - lib/xommelier/schemas/dublincore/qualifieddc.xsd
115
+ - lib/xommelier/schemas/dublincore/simpledc.xsd
116
+ - lib/xommelier/schemas/opensearch.xsd
110
117
  - lib/xommelier/schemas/rss.xsd
118
+ - lib/xommelier/schemas/syndication/creativeCommons.xsd
119
+ - lib/xommelier/schemas/syndication/fh.xsd
120
+ - lib/xommelier/schemas/syndication/schematron.xsd
121
+ - lib/xommelier/schemas/syndication/thr.xsd
122
+ - lib/xommelier/schemas/syndication/trackback.xsd
111
123
  - lib/xommelier/version.rb
112
124
  - lib/xommelier/xml.rb
113
125
  - lib/xommelier/xml/element.rb
@@ -120,16 +132,20 @@ files:
120
132
  - spec/fixtures/feed.rss2.0.xml
121
133
  - spec/fixtures/multi_namespace_feed.atom.xml
122
134
  - spec/fixtures/nested_atom.xml
135
+ - spec/fixtures/opensearch.full.xml
123
136
  - spec/fixtures/rss-2.0-namespace.xml
124
137
  - spec/fixtures/simple_feed.atom.xml
125
138
  - spec/fixtures/simple_feed.rss.xml
126
- - spec/functional/atom_feed_building_spec.rb
127
- - spec/functional/atom_feed_parsing_spec.rb
128
- - spec/functional/atom_feed_thread_building_spec.rb
129
- - spec/functional/build_nested_document_from_hash_spec.rb
130
- - spec/functional/rss_feed_building_spec.rb
131
- - spec/functional/rss_feed_parsing_spec.rb
139
+ - spec/functional/xommelier/atom/feed/building_hash_spec.rb
140
+ - spec/functional/xommelier/atom/feed/building_spec.rb
141
+ - spec/functional/xommelier/atom/feed/parsing_spec.rb
142
+ - spec/functional/xommelier/atom/threading/building_spec.rb
143
+ - spec/functional/xommelier/open_search/description/building_spec.rb
144
+ - spec/functional/xommelier/open_search/description/parsing_spec.rb
145
+ - spec/functional/xommelier/rss/rss/building_spec.rb
146
+ - spec/functional/xommelier/rss/rss/parsing_spec.rb
132
147
  - spec/lib/xommelier/atom/entry_spec.rb
148
+ - spec/lib/xommelier/rss/email_address_spec.rb
133
149
  - spec/lib/xommelier/xml/element/serialization_spec.rb
134
150
  - spec/lib/xommelier/xml/element/structure_spec.rb
135
151
  - spec/lib/xommelier/xml/element_spec.rb
@@ -169,16 +185,20 @@ test_files:
169
185
  - spec/fixtures/feed.rss2.0.xml
170
186
  - spec/fixtures/multi_namespace_feed.atom.xml
171
187
  - spec/fixtures/nested_atom.xml
188
+ - spec/fixtures/opensearch.full.xml
172
189
  - spec/fixtures/rss-2.0-namespace.xml
173
190
  - spec/fixtures/simple_feed.atom.xml
174
191
  - spec/fixtures/simple_feed.rss.xml
175
- - spec/functional/atom_feed_building_spec.rb
176
- - spec/functional/atom_feed_parsing_spec.rb
177
- - spec/functional/atom_feed_thread_building_spec.rb
178
- - spec/functional/build_nested_document_from_hash_spec.rb
179
- - spec/functional/rss_feed_building_spec.rb
180
- - spec/functional/rss_feed_parsing_spec.rb
192
+ - spec/functional/xommelier/atom/feed/building_hash_spec.rb
193
+ - spec/functional/xommelier/atom/feed/building_spec.rb
194
+ - spec/functional/xommelier/atom/feed/parsing_spec.rb
195
+ - spec/functional/xommelier/atom/threading/building_spec.rb
196
+ - spec/functional/xommelier/open_search/description/building_spec.rb
197
+ - spec/functional/xommelier/open_search/description/parsing_spec.rb
198
+ - spec/functional/xommelier/rss/rss/building_spec.rb
199
+ - spec/functional/xommelier/rss/rss/parsing_spec.rb
181
200
  - spec/lib/xommelier/atom/entry_spec.rb
201
+ - spec/lib/xommelier/rss/email_address_spec.rb
182
202
  - spec/lib/xommelier/xml/element/serialization_spec.rb
183
203
  - spec/lib/xommelier/xml/element/structure_spec.rb
184
204
  - spec/lib/xommelier/xml/element_spec.rb
@@ -1,31 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Atom feed building' do
4
- subject(:feed) do
5
- Xommelier::Atom::Feed.new.tap do |feed|
6
- feed.id = 'urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6'
7
- feed.title = 'Example Feed'
8
- feed.link = Xommelier::Atom::Link.new(href: 'http://example.org/')
9
- feed.updated = Time.utc(2003, 12, 13, 18, 30, 02)
10
- feed.author = Xommelier::Atom::Person.new(name: 'John Doe')
11
- feed.entry = Xommelier::Atom::Entry.new(
12
- title: 'Atom-Powered Robots Run Amok',
13
- id: 'urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a',
14
- updated: Time.utc(2003, 12, 13, 18, 30, 02),
15
- summary: 'Some text.'
16
- ).tap do |entry|
17
- entry.link = Xommelier::Atom::Link.new(href: 'http://example.org/2003/12/13/atom03')
18
- end
19
- end
20
- end
21
-
22
- let(:parsed_xml) { Nokogiri::XML(feed.to_xml) }
23
- let(:rng) { Nokogiri::XML::RelaxNG(load_xml_file('atom.rng')) }
24
- let(:xsd) { Xommelier::Atom.schema }
25
-
26
- it { should be_valid }
27
-
28
- its(:to_xml) { should == load_xml_file('simple_feed.atom') }
29
- it('should conform to RelaxNG schema') { rng.valid?(parsed_xml).should == true }
30
- it('should conform to XML Schema') { xsd.valid?(parsed_xml).should == true }
31
- end
@@ -1,39 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe 'Build document from nested hash' do
4
- let(:hash) do
5
- {
6
- title: 'Xommelier nest elements',
7
- subtitle: 'Xommelier is able to build complex objects from very nested hash',
8
- author: {name: 'Alexander', email: 'al@semyonov.us'},
9
- updated: Time.utc(2012, 04, 04, 04, 04),
10
- contributors: [
11
- {name: 'Artyom', email: 'sevenov@gmail.com'},
12
- {name: 'Ivan', email: 'ivan@example.com'},
13
- {name: 'Pyotr', email: 'pyotr@example.com'},
14
- ],
15
- entries: [
16
- {title: 'First article', updated: Time.utc(2012, 01, 01, 01, 01)},
17
- {title: 'Second article', updated: Time.utc(2012, 02, 02, 02, 02)},
18
- {title: 'Third article', updated: Time.utc(2012, 03, 03, 03, 03)},
19
- ]
20
- }
21
- end
22
-
23
- let(:doc) do
24
- Xommelier::Atom::Feed.new(hash)
25
- end
26
-
27
- subject { doc }
28
-
29
- its(:to_xml) { should == load_xml_file('nested_atom') }
30
- it { should have(1).authors }
31
- it { should have(3).contributors }
32
- it { should have(3).entries }
33
-
34
- it { doc.author.should be_an(Xommelier::Atom::Person) }
35
- it { doc.contributors[2].should be_an(Xommelier::Atom::Person) }
36
- it { doc.entries[1].should be_an(Xommelier::Atom::Entry) }
37
-
38
- its(:to_hash) { should == hash}
39
- end