roxml 3.3.1 → 4.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.
Files changed (55) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +7 -0
  3. data/Gemfile +9 -6
  4. data/Gemfile.lock +96 -40
  5. data/History.txt +9 -0
  6. data/README.rdoc +3 -2
  7. data/Rakefile +6 -9
  8. data/VERSION +1 -1
  9. data/examples/search_query.rb +17 -0
  10. data/lib/roxml.rb +8 -2
  11. data/lib/roxml/definition.rb +2 -7
  12. data/lib/roxml/xml/references.rb +22 -7
  13. data/roxml.gemspec +48 -36
  14. data/spec/definition_spec.rb +81 -101
  15. data/spec/examples/active_record_spec.rb +13 -13
  16. data/spec/examples/amazon_spec.rb +13 -13
  17. data/spec/examples/current_weather_spec.rb +6 -6
  18. data/spec/examples/dashed_elements_spec.rb +3 -3
  19. data/spec/examples/library_spec.rb +3 -3
  20. data/spec/examples/library_with_fines_spec.rb +7 -7
  21. data/spec/examples/person_spec.rb +3 -3
  22. data/spec/examples/post_spec.rb +4 -4
  23. data/spec/examples/search_query_spec.rb +26 -0
  24. data/spec/examples/twitter_spec.rb +4 -4
  25. data/spec/reference_spec.rb +2 -2
  26. data/spec/regression_spec.rb +13 -8
  27. data/spec/roxml_spec.rb +30 -43
  28. data/spec/shared_specs.rb +2 -2
  29. data/spec/spec_helper.rb +2 -0
  30. data/spec/xml/array_spec.rb +2 -2
  31. data/spec/xml/attributes_spec.rb +7 -7
  32. data/spec/xml/encoding_spec.rb +9 -9
  33. data/spec/xml/namespace_spec.rb +40 -21
  34. data/spec/xml/namespaces_spec.rb +3 -3
  35. data/spec/xml/object_spec.rb +7 -7
  36. data/spec/xml/parser_spec.rb +2 -2
  37. data/spec/xml/text_spec.rb +6 -6
  38. data/test/fixtures/book_with_octal_pages.xml +2 -3
  39. data/test/test_helper.rb +1 -2
  40. data/test/unit/definition_test.rb +26 -27
  41. data/test/unit/deprecations_test.rb +23 -2
  42. data/test/unit/to_xml_test.rb +7 -7
  43. data/test/unit/xml_attribute_test.rb +3 -2
  44. data/test/unit/xml_block_test.rb +3 -2
  45. data/test/unit/xml_bool_test.rb +7 -8
  46. data/test/unit/xml_convention_test.rb +4 -3
  47. data/test/unit/xml_hash_test.rb +5 -13
  48. data/test/unit/xml_initialize_test.rb +4 -3
  49. data/test/unit/xml_name_test.rb +3 -2
  50. data/test/unit/xml_namespace_test.rb +4 -3
  51. data/test/unit/xml_object_test.rb +8 -7
  52. data/test/unit/xml_required_test.rb +7 -6
  53. data/test/unit/xml_text_test.rb +3 -2
  54. data/website/index.html +11 -11
  55. metadata +115 -60
@@ -8,26 +8,26 @@ describe PITA::ItemSearchResponse do
8
8
 
9
9
  describe "#total_results" do
10
10
  it "should be parsed as a number" do
11
- @response.total_results.should > 0
11
+ expect(@response.total_results).to be > 0
12
12
  end
13
13
  end
14
14
 
15
15
  describe "#total_pages" do
16
16
  it "should be parsed as a number" do
17
- @response.total_pages.should > 0
17
+ expect(@response.total_pages).to be > 0
18
18
  end
19
19
  end
20
20
 
21
21
  describe "#items" do
22
22
  it "should return a collection of items" do
23
- @response.items.should be_an_instance_of(Array)
24
- @response.items.size.should > 0
25
- @response.items.each {|item| item.should be_an_instance_of(PITA::Item) }
23
+ expect(@response.items).to be_an_instance_of(Array)
24
+ expect(@response.items.size).to be > 0
25
+ @response.items.each {|item| expect(item).to be_an_instance_of(PITA::Item) }
26
26
  end
27
27
 
28
28
  it "should have the some number less than or equal to #total_results" do
29
- @response.items.size.should > 0
30
- @response.items.size.should <= @response.total_results
29
+ expect(@response.items.size).to be > 0
30
+ expect(@response.items.size).to be <= @response.total_results
31
31
  end
32
32
  end
33
33
  end
@@ -38,17 +38,17 @@ describe PITA::Item do
38
38
  end
39
39
 
40
40
  it "should extract asin" do
41
- @items.each {|item| item.asin.should be_an_instance_of(String) }
42
- @items.each {|item| item.asin.should_not be_empty }
41
+ @items.each {|item| expect(item.asin).to be_an_instance_of(String) }
42
+ @items.each {|item| expect(item.asin).to_not be_empty }
43
43
  end
44
44
 
45
45
  it "should extract detail_page_url" do
46
- @items.each {|item| item.detail_page_url.should be_an_instance_of(String) }
47
- @items.each {|item| item.detail_page_url.should_not be_empty }
46
+ @items.each {|item| expect(item.detail_page_url).to be_an_instance_of(String) }
47
+ @items.each {|item| expect(item.detail_page_url).to_not be_empty }
48
48
  end
49
49
 
50
50
  it "should extract manufacturer" do
51
- @items.each {|item| item.manufacturer.should be_an_instance_of(String) }
52
- @items.each {|item| item.manufacturer.should_not be_empty }
51
+ @items.each {|item| expect(item.manufacturer).to be_an_instance_of(String) }
52
+ @items.each {|item| expect(item.manufacturer).to_not be_empty }
53
53
  end
54
54
  end
@@ -7,7 +7,7 @@ describe Weather do
7
7
  end
8
8
 
9
9
  it "should extract observations" do
10
- @weather.observation.should be_an_instance_of(WeatherObservation)
10
+ expect(@weather.observation).to be_an_instance_of(WeatherObservation)
11
11
  end
12
12
  end
13
13
 
@@ -17,21 +17,21 @@ describe WeatherObservation do
17
17
  end
18
18
 
19
19
  it "should extract temperature" do
20
- @observation.temperature.should > 0
20
+ expect(@observation.temperature).to be > 0
21
21
  end
22
22
 
23
23
  it "should extract feels_like" do
24
- @observation.feels_like.should > 0
24
+ expect(@observation.feels_like).to be > 0
25
25
  end
26
26
 
27
27
  describe "#current_condition" do
28
28
  it "should extract current_condition" do
29
- @observation.current_condition.should_not be_empty
29
+ expect(@observation.current_condition).to_not be_empty
30
30
  end
31
31
 
32
32
  it "should extract icon attribute" do
33
- pending "need to think options through for HappyMapper-style :attributes extensions"
34
- @observation.current_condition.icon.should_not be_empty
33
+ skip "need to think options through for HappyMapper-style :attributes extensions"
34
+ expect(@observation.current_condition.icon).to_not be_empty
35
35
  end
36
36
  end
37
37
  end
@@ -7,14 +7,14 @@ describe GitHub::Commit do
7
7
  end
8
8
 
9
9
  it "should extract committed date" do
10
- @commit.committed_date.should be_an_instance_of(Date)
10
+ expect(@commit.committed_date).to be_an_instance_of(Date)
11
11
  end
12
12
 
13
13
  it "should extract url" do
14
- @commit.url.should_not be_empty
14
+ expect(@commit.url).to_not be_empty
15
15
  end
16
16
 
17
17
  it "should extract id" do
18
- @commit.id.should_not be_empty
18
+ expect(@commit.id).to_not be_empty
19
19
  end
20
20
  end
@@ -17,7 +17,7 @@ describe Library do
17
17
 
18
18
  describe "#to_xml" do
19
19
  it "should contain the expected information" do
20
- @lib.to_xml.to_s.should == ROXML::XML.parse_string(%{<library><NAME><![CDATA[Favorite Books]]></NAME><novel ISBN='0201710897'><title>The PickAxe</title><description><![CDATA[Best Ruby book out there!]]></description><author>David Thomas, Andrew Hunt, Dave Thomas</author><publisher><name>Addison Wesley Longman, Inc.</name></publisher></novel></library>}).root.to_s
20
+ expect(@lib.to_xml.to_s).to eq(ROXML::XML.parse_string(%{<library><NAME><![CDATA[Favorite Books]]></NAME><novel ISBN='0201710897'><title>The PickAxe</title><description><![CDATA[Best Ruby book out there!]]></description><author>David Thomas, Andrew Hunt, Dave Thomas</author><publisher><name>Addison Wesley Longman, Inc.</name></publisher></novel></library>}).root.to_s)
21
21
  end
22
22
 
23
23
  context "when written to a file" do
@@ -33,12 +33,12 @@ describe Library do
33
33
  end
34
34
 
35
35
  it "should be contain the expected xml" do
36
- ROXML::XML.parse_string(File.read(@path)).to_s.should == ROXML::XML.parse_string(%{<?xml version="1.0"?><library><NAME><![CDATA[Favorite Books]]></NAME><novel ISBN='0201710897'><title>The PickAxe</title><description><![CDATA[Best Ruby book out there!]]></description><author>David Thomas, Andrew Hunt, Dave Thomas</author><publisher><name>Addison Wesley Longman, Inc.</name></publisher></novel></library>}).to_s
36
+ expect(ROXML::XML.parse_string(File.read(@path)).to_s).to eq(ROXML::XML.parse_string(%{<?xml version="1.0"?><library><NAME><![CDATA[Favorite Books]]></NAME><novel ISBN='0201710897'><title>The PickAxe</title><description><![CDATA[Best Ruby book out there!]]></description><author>David Thomas, Andrew Hunt, Dave Thomas</author><publisher><name>Addison Wesley Longman, Inc.</name></publisher></novel></library>}).to_s)
37
37
  end
38
38
 
39
39
  it "should be re-parsable via .from_xml" do
40
40
  File.open("spec/examples/library.xml") do |file|
41
- Library.from_xml(file).should == @lib
41
+ expect(Library.from_xml(file)).to eq(@lib)
42
42
  end
43
43
  end
44
44
  end
@@ -7,10 +7,10 @@ describe LibraryWithFines do
7
7
  let(:library) { LibraryWithFines.from_xml(xml) }
8
8
 
9
9
  it "should read nested elements" do
10
- library.fines.should be_a(Hash)
10
+ expect(library.fines).to be_a(Hash)
11
11
  library.fines.size == 3
12
- library.fines.should have_key('talking')
13
- library.fines['talking'].should match(/Stop asking/)
12
+ expect(library.fines).to have_key('talking')
13
+ expect(library.fines['talking']).to match(/Stop asking/)
14
14
  end
15
15
 
16
16
  class String
@@ -21,17 +21,17 @@ describe LibraryWithFines do
21
21
 
22
22
  it "should write deeply nested elements" do
23
23
  xml_out = library.to_xml.to_s
24
- xml_out.remove_whitespace.should == xml.remove_whitespace
24
+ expect(xml_out.remove_whitespace).to eq(xml.remove_whitespace)
25
25
  end
26
26
 
27
27
  it "should write two children of library: name and policy" do
28
- library.to_xml.children.map{|e| e.name }.should == ['name', 'policy']
28
+ expect(library.to_xml.children.map{|e| e.name }).to eq(['name', 'policy'])
29
29
  end
30
30
 
31
31
  it "should be re-parsable via .from_xml" do
32
32
  lib_reparsed = LibraryWithFines.from_xml(library.to_xml.to_s)
33
- lib_reparsed.name.should == library.name
34
- lib_reparsed.fines.should == library.fines
33
+ expect(lib_reparsed.name).to eq(library.name)
34
+ expect(lib_reparsed.fines).to eq(library.fines)
35
35
  end
36
36
 
37
37
 
@@ -14,7 +14,7 @@ describe Person do
14
14
  end
15
15
 
16
16
  it 'should only contain one location element' do
17
- ROXML::XML.search(@person.to_xml, 'location').count.should == 1
17
+ expect(ROXML::XML.search(@person.to_xml, 'location').count).to eq(1)
18
18
  end
19
19
 
20
20
  describe '#to_xml' do
@@ -24,13 +24,13 @@ describe Person do
24
24
 
25
25
  it 'should generate the expected xml' do
26
26
  xml_file = File.read(xml_for('person')).gsub("\n",'').squeeze(' ')
27
- xml_file.should == @xml_generated
27
+ expect(xml_file).to eq(@xml_generated)
28
28
  end
29
29
 
30
30
  it 'should generate identical xml after a full roundtrip' do
31
31
  p = Person.from_xml(@xml_generated)
32
32
  xml_roundtrip = p.to_xml.to_s.gsub("\n",'').squeeze(' ')
33
- xml_roundtrip.should == @xml_generated
33
+ expect(xml_roundtrip).to eq(@xml_generated)
34
34
  end
35
35
  end
36
36
 
@@ -7,18 +7,18 @@ describe Post do
7
7
  end
8
8
 
9
9
  it "should extract description" do
10
- @posts.each {|post| post.description.should_not be_empty }
10
+ @posts.each {|post| expect(post.description).to_not be_empty }
11
11
  end
12
12
 
13
13
  it "should extract href" do
14
- @posts.each {|post| post.href.should_not be_empty }
14
+ @posts.each {|post| expect(post.href).to_not be_empty }
15
15
  end
16
16
 
17
17
  it "should extract extended" do
18
- @posts.each {|post| post.extended.should_not be_empty }
18
+ @posts.each {|post| expect(post.extended).to_not be_empty }
19
19
  end
20
20
 
21
21
  it "should extract time" do
22
- @posts.each {|post| post.created_at.should be_an_instance_of(DateTime) }
22
+ @posts.each {|post| expect(post.created_at).to be_an_instance_of(DateTime) }
23
23
  end
24
24
  end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require_relative './../../examples/search_query'
3
+
4
+ describe SearchQuery do
5
+
6
+ before do
7
+ @search = SearchQuery.new
8
+ @search.query = 'This is a random search query.'
9
+
10
+ @saved_search = SearchQuery.from_xml("<searchquery><query>Search for something</query></searchquery>")
11
+ end
12
+
13
+ it 'should return the default value for all attributes where no value is set' do
14
+ expect(@search.language).to eq('EN')
15
+ @search.max_results == 20
16
+ end
17
+
18
+ it 'should return the same object for the default value' do
19
+ expect(@search.language.object_id).to eq(@search.language.object_id)
20
+ end
21
+
22
+ it 'should respect the defaults when loading from xml' do
23
+ expect(@saved_search.language).to eq('EN')
24
+ @saved_search.max_results == 20
25
+ end
26
+ end
@@ -8,11 +8,11 @@ describe Statuses do
8
8
  end
9
9
 
10
10
  it "should extract text" do
11
- @statuses.each {|status| status.text.should_not be_empty }
11
+ @statuses.each {|status| expect(status.text).to_not be_empty }
12
12
  end
13
13
 
14
14
  it "should extract source" do
15
- @statuses.each {|status| status.source.should_not be_empty }
15
+ @statuses.each {|status| expect(status.source).to_not be_empty }
16
16
  end
17
17
 
18
18
  describe User do
@@ -21,11 +21,11 @@ describe Statuses do
21
21
  end
22
22
 
23
23
  it "should extract name" do
24
- @users.each {|user| user.name.should == "John Nunemaker" }
24
+ @users.each {|user| expect(user.name).to eq("John Nunemaker") }
25
25
  end
26
26
 
27
27
  it "should extract screen_name" do
28
- @users.each {|user| user.screen_name.should == "jnunemaker" }
28
+ @users.each {|user| expect(user.screen_name).to eq("jnunemaker") }
29
29
  end
30
30
  end
31
31
  end
@@ -23,12 +23,12 @@ describe ROXML::XMLRef do
23
23
 
24
24
  it "should properly reconstruct wrappers with multiple elements" do
25
25
 
26
- reference.should be_a(ROXML::XMLHashRef)
26
+ expect(reference).to be_a(ROXML::XMLHashRef)
27
27
 
28
28
  xml = ROXML::XML.new_node('org').tap do |root|
29
29
  reference.update_xml(root, org.fines)
30
30
  end
31
31
 
32
- xml_path( xml ).should == %w{org policy fines fine name}
32
+ expect(xml_path( xml )).to eq(%w{org policy fines fine name})
33
33
  end
34
34
  end
@@ -4,16 +4,21 @@ describe ROXML do
4
4
  describe 'frozen nils' do
5
5
  subject { nil }
6
6
 
7
- context 'before unmarshalling an XML document' do
8
- it { should_not be_frozen }
9
- end
10
-
11
- context 'after unmarshalling an XML document' do
12
- before do
13
- lib = Library.from_xml(fixture(:library))
7
+ # Prior to ruby-2.2, nil was not frozen. This test watches for
8
+ # a regression in previous versions of roxml that caused nil to
9
+ # become frozen. FIXME: remove after ruby-2.1 support is removed.
10
+ if RUBY_VERSION < "2.2"
11
+ context 'before unmarshalling an XML document' do
12
+ it { is_expected.to_not be_frozen }
14
13
  end
15
14
 
16
- it { should_not be_frozen }
15
+ context 'after unmarshalling an XML document' do
16
+ before do
17
+ lib = Library.from_xml(fixture(:library))
18
+ end
19
+
20
+ it { is_expected.to_not be_frozen }
21
+ end
17
22
  end
18
23
  end
19
24
  end
@@ -3,7 +3,7 @@ require_relative './spec_helper'
3
3
  describe ROXML do
4
4
  describe "::VERSION" do
5
5
  it "should be equal to the VERSION file contents" do
6
- ROXML::VERSION.should == File.read('VERSION')
6
+ expect(ROXML::VERSION).to eq(File.read('VERSION'))
7
7
  end
8
8
  end
9
9
 
@@ -11,8 +11,8 @@ describe ROXML do
11
11
  shared_examples_for "from_xml call" do
12
12
  it "should fetch values" do
13
13
  book = BookWithContributors.from_xml(@path)
14
- book.title.should == "Programming Ruby - 2nd Edition"
15
- book.contributors.map(&:name).should == ["David Thomas","Andrew Hunt","Chad Fowler"]
14
+ expect(book.title).to eq("Programming Ruby - 2nd Edition")
15
+ expect(book.contributors.map(&:name)).to eq(["David Thomas","Andrew Hunt","Chad Fowler"])
16
16
  end
17
17
  end
18
18
 
@@ -81,14 +81,14 @@ describe ROXML, "#xml" do
81
81
  end
82
82
 
83
83
  it "should raise on duplicate accessor name" do
84
- proc do
84
+ expect do
85
85
  Class.new do
86
86
  include ROXML
87
87
 
88
88
  xml_reader :id
89
89
  xml_accessor :id
90
90
  end
91
- end.should raise_error(RuntimeError)
91
+ end.to raise_error(RuntimeError)
92
92
  end
93
93
 
94
94
  class OctalInteger
@@ -139,19 +139,6 @@ describe ROXML, "#xml" do
139
139
  @expected_pages = 239
140
140
  end
141
141
 
142
- describe "with :as block shorthand" do
143
- class BookWithOctalPagesBlockShorthand
144
- include ROXML
145
-
146
- xml_accessor :pages, :as => Integer, :required => true
147
- end
148
-
149
- it "should apply filtering on input" do
150
- book = BookWithOctalPagesBlockShorthand.from_xml(@book_with_octal_pages_xml)
151
- book.pages.should == @expected_pages
152
- end
153
- end
154
-
155
142
  describe "with #from_xml defined on the object" do
156
143
  class BookWithOctalPagesType
157
144
  include ROXML
@@ -161,7 +148,7 @@ describe ROXML, "#xml" do
161
148
 
162
149
  it "should apply filtering on input" do
163
150
  book = BookWithOctalPagesType.from_xml(@book_with_octal_pages_xml)
164
- book.pages.should == @expected_pages
151
+ expect(book.pages).to eq(@expected_pages)
165
152
  end
166
153
  end
167
154
  end
@@ -194,11 +181,11 @@ describe ROXML, "#xml" do
194
181
 
195
182
  describe "indirect reference via an object" do
196
183
  it "does not inherit the frozen status from its parent" do
197
- @frozen.writable.frozen?.should be_false
198
- @frozen.readonly.frozen?.should be_true
184
+ expect(@frozen.writable.frozen?).to be_falsey
185
+ expect(@frozen.readonly.frozen?).to be_truthy
199
186
 
200
- @unfrozen.writable.frozen?.should be_false
201
- @unfrozen.readonly.frozen?.should be_true
187
+ expect(@unfrozen.writable.frozen?).to be_falsey
188
+ expect(@unfrozen.readonly.frozen?).to be_truthy
202
189
  end
203
190
  end
204
191
  end
@@ -212,8 +199,8 @@ describe ROXML, "#xml" do
212
199
  it_should_behave_like "freezable xml reference"
213
200
 
214
201
  it "should apply :frozen to the constituent elements" do
215
- @frozen.all?(&:frozen?).should be_true
216
- @unfrozen.any?(&:frozen?).should be_false
202
+ expect(@frozen.all?(&:frozen?)).to be_truthy
203
+ expect(@unfrozen.any?(&:frozen?)).to be_falsey
217
204
  end
218
205
 
219
206
  context "no elements are present in root, no :in is specified" do
@@ -237,7 +224,7 @@ describe ROXML, "#xml" do
237
224
  </contributors>
238
225
  </book>
239
226
  })
240
- book.contributors.map(&:name).sort.should == ["David Thomas","Andrew Hunt","Chad Fowler"].sort
227
+ expect(book.contributors.map(&:name).sort).to eq(["David Thomas","Andrew Hunt","Chad Fowler"].sort)
241
228
  end
242
229
  end
243
230
  end
@@ -267,13 +254,13 @@ describe ROXML, "#xml" do
267
254
  it_should_behave_like "freezable xml reference"
268
255
 
269
256
  it "should have frozen keys, as with all hashes" do
270
- @frozen.keys.all?(&:frozen?).should be_true
271
- @unfrozen.keys.all?(&:frozen?).should be_true
257
+ expect(@frozen.keys.all?(&:frozen?)).to be_truthy
258
+ expect(@unfrozen.keys.all?(&:frozen?)).to be_truthy
272
259
  end
273
260
 
274
261
  it "should apply :frozen to the constituent values" do
275
- @frozen.values.all?(&:frozen?).should be_true
276
- @unfrozen.values.any?(&:frozen?).should be_false
262
+ expect(@frozen.values.all?(&:frozen?)).to be_truthy
263
+ expect(@unfrozen.values.any?(&:frozen?)).to be_falsey
277
264
  end
278
265
  end
279
266
  end
@@ -343,29 +330,29 @@ describe ROXML, "inheritance" do
343
330
 
344
331
  describe "parent" do
345
332
  it "should include its attributes" do
346
- @child.isbn.should == "0201710897"
347
- @child.title.should == "The PickAxe"
348
- @child.description.should == "Probably the best Ruby book out there"
349
- @child.author.should == 'David Thomas, Andrew Hunt, Dave Thomas'
350
- @child.pages.should == nil
333
+ expect(@child.isbn).to eq("0201710897")
334
+ expect(@child.title).to eq("The PickAxe")
335
+ expect(@child.description).to eq("Probably the best Ruby book out there")
336
+ expect(@child.author).to eq('David Thomas, Andrew Hunt, Dave Thomas')
337
+ expect(@child.pages).to eq(nil)
351
338
  end
352
339
 
353
340
  it "should not include its child's attributes" do
354
- @parent.should_not respond_to(:depth)
341
+ expect(@parent).to_not respond_to(:depth)
355
342
  end
356
343
  end
357
344
 
358
345
  describe "child" do
359
346
  it "should include its parent's attributes" do
360
- @child.isbn.should == @parent.isbn
361
- @child.title.should == @parent.title
362
- @child.description.should == @parent.description
363
- @child.author.should == @parent.author
364
- @child.pages.should == @parent.pages
347
+ expect(@child.isbn).to eq(@parent.isbn)
348
+ expect(@child.title).to eq(@parent.title)
349
+ expect(@child.description).to eq(@parent.description)
350
+ expect(@child.author).to eq(@parent.author)
351
+ expect(@child.pages).to eq(@parent.pages)
365
352
  end
366
353
 
367
354
  it "should include its attributes" do
368
- @child.depth.to_s.should == '11.3 meters'
355
+ expect(@child.depth.to_s).to eq('11.3 meters')
369
356
  end
370
357
 
371
358
  it "should include parent's attributes added after declaration" do
@@ -374,7 +361,7 @@ describe ROXML, "inheritance" do
374
361
  end
375
362
 
376
363
  book = InheritedBookWithDepth.from_xml(@book_xml)
377
- book.publisher.should == "Pragmattic Programmers"
364
+ expect(book.publisher).to eq("Pragmattic Programmers")
378
365
  end
379
366
  end
380
367
  end