saper 0.5.1 → 0.5.2

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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -0
  3. data/Rakefile +6 -6
  4. data/bin/saper +17 -36
  5. data/lib/saper.rb +63 -20
  6. data/lib/saper/actions/append_with.rb +1 -1
  7. data/lib/saper/actions/convert_to_html.rb +1 -1
  8. data/lib/saper/actions/convert_to_json.rb +6 -2
  9. data/lib/saper/actions/convert_to_markdown.rb +1 -1
  10. data/lib/saper/actions/convert_to_time.rb +38 -1
  11. data/lib/saper/actions/convert_to_xml.rb +1 -1
  12. data/lib/saper/actions/create_atom.rb +6 -2
  13. data/lib/saper/actions/fetch.rb +3 -2
  14. data/lib/saper/actions/fetch_with_token.rb +18 -0
  15. data/lib/saper/actions/find.rb +1 -1
  16. data/lib/saper/actions/find_first.rb +1 -1
  17. data/lib/saper/actions/get_attribute.rb +7 -2
  18. data/lib/saper/actions/get_contents.rb +1 -1
  19. data/lib/saper/actions/get_text.rb +1 -1
  20. data/lib/saper/actions/nothing.rb +11 -0
  21. data/lib/saper/actions/prepend_with.rb +2 -2
  22. data/lib/saper/actions/remove_after.rb +2 -2
  23. data/lib/saper/actions/remove_before.rb +2 -2
  24. data/lib/saper/actions/remove_matching.rb +2 -2
  25. data/lib/saper/actions/remove_tags.rb +1 -1
  26. data/lib/saper/actions/replace.rb +1 -1
  27. data/lib/saper/actions/run_recipe.rb +2 -2
  28. data/lib/saper/actions/run_recipe_and_save.rb +3 -3
  29. data/lib/saper/actions/save.rb +2 -2
  30. data/lib/saper/actions/select_matching.rb +2 -2
  31. data/lib/saper/actions/set_input.rb +1 -1
  32. data/lib/saper/actions/skip_tags.rb +1 -1
  33. data/lib/saper/actions/split.rb +1 -1
  34. data/lib/saper/arguments/attribute.rb +6 -0
  35. data/lib/saper/arguments/recipe.rb +12 -6
  36. data/lib/saper/arguments/service.rb +12 -0
  37. data/lib/saper/arguments/text.rb +1 -0
  38. data/lib/saper/arguments/timezone.rb +2 -1
  39. data/lib/saper/arguments/url.rb +12 -0
  40. data/lib/saper/arguments/variable.rb +2 -1
  41. data/lib/saper/arguments/xpath.rb +2 -1
  42. data/lib/saper/core/action.rb +43 -13
  43. data/lib/saper/core/argument.rb +30 -14
  44. data/lib/saper/core/browser.rb +29 -28
  45. data/lib/saper/core/dsl.rb +14 -16
  46. data/lib/saper/core/error.rb +1 -1
  47. data/lib/saper/core/item.rb +2 -2
  48. data/lib/saper/core/keychain.rb +58 -5
  49. data/lib/saper/core/namespace.rb +15 -18
  50. data/lib/saper/core/recipe.rb +53 -12
  51. data/lib/saper/core/result.rb +72 -0
  52. data/lib/saper/core/runtime.rb +44 -177
  53. data/lib/saper/core/stack.rb +57 -0
  54. data/lib/saper/items/atom.rb +18 -1
  55. data/lib/saper/items/document.rb +39 -19
  56. data/lib/saper/items/html.rb +52 -7
  57. data/lib/saper/items/json.rb +19 -1
  58. data/lib/saper/items/markdown.rb +14 -4
  59. data/lib/saper/items/nothing.rb +6 -0
  60. data/lib/saper/items/text.rb +28 -3
  61. data/lib/saper/items/time.rb +25 -2
  62. data/lib/saper/items/url.rb +8 -2
  63. data/lib/saper/items/xml.rb +51 -11
  64. data/lib/{lib → saper/patches}/mechanize.rb +0 -0
  65. data/lib/{lib → saper/patches}/nokogiri.rb +0 -0
  66. data/lib/saper/version.rb +2 -2
  67. data/spec/actions/append_with_spec.rb +29 -52
  68. data/spec/actions/convert_to_html_spec.rb +13 -30
  69. data/spec/actions/convert_to_json_spec.rb +13 -30
  70. data/spec/actions/convert_to_markdown_spec.rb +17 -19
  71. data/spec/actions/convert_to_time_spec.rb +25 -43
  72. data/spec/actions/convert_to_xml_spec.rb +15 -11
  73. data/spec/actions/create_atom_spec.rb +11 -19
  74. data/spec/actions/fetch_spec.rb +3 -8
  75. data/spec/actions/find_first_spec.rb +38 -40
  76. data/spec/actions/find_spec.rb +23 -39
  77. data/spec/actions/get_attribute_spec.rb +30 -3
  78. data/spec/actions/{get_contents.rb → get_contents_spec.rb} +0 -0
  79. data/spec/actions/{get_text.rb → get_text_spec.rb} +0 -0
  80. data/spec/actions/nothing_spec.rb +7 -0
  81. data/spec/actions/prepend_with_spec.rb +31 -18
  82. data/spec/actions/{remove_after.rb → remove_after_spec.rb} +0 -0
  83. data/spec/actions/{remove_before.rb → remove_before_spec.rb} +0 -0
  84. data/spec/actions/remove_matching_spec.rb +7 -0
  85. data/spec/actions/remove_tags_spec.rb +7 -0
  86. data/spec/actions/run_recipe_and_save_spec.rb +7 -0
  87. data/spec/actions/run_recipe_spec.rb +7 -0
  88. data/spec/arguments/attribute_spec.rb +7 -0
  89. data/spec/arguments/recipe_spec.rb +7 -0
  90. data/spec/arguments/text_spec.rb +7 -0
  91. data/spec/arguments/timezone_spec.rb +7 -0
  92. data/spec/arguments/variable_spec.rb +7 -0
  93. data/spec/arguments/xpath_spec.rb +7 -0
  94. data/spec/core/action_spec.rb +13 -142
  95. data/spec/core/argument_spec.rb +38 -71
  96. data/spec/core/browser_spec.rb +18 -3
  97. data/spec/core/dsl_spec.rb +1 -1
  98. data/spec/core/item_spec.rb +1 -1
  99. data/spec/core/namespace_spec.rb +0 -11
  100. data/spec/core/recipe_spec.rb +54 -77
  101. data/spec/core/result_spec.rb +7 -0
  102. data/spec/core/runtime_spec.rb +20 -151
  103. data/spec/core/stack_spec.rb +7 -0
  104. data/spec/integration/simple_invalid_spec.rb +39 -0
  105. data/spec/integration/simple_valid_spec.rb +39 -0
  106. data/spec/items/atom_spec.rb +6 -1
  107. data/spec/items/document_spec.rb +93 -15
  108. data/spec/items/html_spec.rb +45 -28
  109. data/spec/items/json_spec.rb +10 -10
  110. data/spec/items/markdown_spec.rb +24 -3
  111. data/spec/items/nothing_spec.rb +1 -1
  112. data/spec/items/text_spec.rb +13 -41
  113. data/spec/items/time_spec.rb +25 -4
  114. data/spec/items/url_spec.rb +1 -7
  115. data/spec/items/xml_spec.rb +46 -39
  116. data/spec/spec_helper.rb +2 -21
  117. metadata +63 -60
  118. data/lib/lib/json_search.rb +0 -54
  119. data/spec/actions/run_recipe_and_save_spec.tmp.rb +0 -52
  120. data/spec/actions/run_recipe_spec.tmp.rb +0 -53
@@ -2,6 +2,11 @@ require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::Atom do
4
4
 
5
- it # TODO
5
+ it ".new" # TODO
6
+ it "#[]" # TODO
7
+ it "#serialize" # TODO
8
+ it "#to_hash" # TODO
9
+ it "#to_native" # TODO
10
+ it "#to_json" # TODO
6
11
 
7
12
  end
@@ -1,25 +1,103 @@
1
1
  require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::Document do
4
-
5
- context ".new" do
6
-
4
+ let(:doc) do
5
+ Saper::Items::Document.new("")
7
6
  end
7
+ let(:doc_with_params) do
8
+ Saper::Items::Document.new("", "http://google.com", { "content-type" => "text/html; charset=win-1251" })
9
+ end
10
+ it ".new(nil) raises InvalidItem" do
11
+ lambda { Saper::Items::Document.new(nil) }.must_raise(Saper::InvalidItem)
12
+ end
13
+ it "#uri returns nil by default" do
14
+ doc.uri.must_be_nil
15
+ end
16
+ it "#uri returns URI when defined" do
17
+ doc_with_params.uri.must_equal "http://google.com"
18
+ end
19
+ it "#mime returns nil by default" do
20
+ doc.mime.must_be_nil
21
+ end
22
+ it "#mime returns mime type if defined in headers" do
23
+ doc_with_params.mime.must_equal "text/html"
24
+ end
25
+ it "#charset returns nil by defaukt" do
26
+ doc.charset.must_be_nil
27
+ end
28
+ it "#charset returns charset if defined in headers" do
29
+ doc_with_params.charset.must_equal "win-1251"
30
+ end
31
+ end
8
32
 
9
- context "#to_html" do
10
-
33
+ describe "Saper::Items::Document(empty String)" do
34
+ subject do
35
+ Saper::Items::Document.new("")
36
+ end
37
+ it "#size returns zero" do
38
+ subject.size.must_equal 0
39
+ end
40
+ it "#to_html raises InvalidItem" do
41
+ lambda { subject.to_html }.must_raise(Saper::InvalidItem)
42
+ end
43
+ it "#to_markdown raises InvalidItem" do
44
+ lambda { subject.to_markdown }.must_raise(Saper::InvalidItem)
11
45
  end
12
-
13
- context "#to_markdown" do
14
-
46
+ it "#to_native returns empty string" do
47
+ subject.to_native.must_equal ""
15
48
  end
16
-
17
- context "#to_text" do
18
-
49
+ it "#to_text returns Text" do
50
+ subject.to_text.must_be_kind_of(Saper::Items::Text)
19
51
  end
20
-
21
- context "#to_xml" do
22
-
52
+ it "#to_xml raises InvalidItem" do
53
+ lambda { subject.to_xml }.must_raise(Saper::InvalidItem)
23
54
  end
24
-
25
55
  end
56
+
57
+ describe "Saper::Items::Document(HTML as String)" do
58
+ subject do
59
+ Saper::Items::Document.new("<html></html>")
60
+ end
61
+ it "#size returns string length" do
62
+ subject.size.must_equal 13
63
+ end
64
+ it "#to_html returns HTML" do
65
+ subject.to_html.must_be_kind_of(Saper::Items::HTML)
66
+ end
67
+ it "#to_markdown returns Markdown" do
68
+ subject.to_markdown.must_be_kind_of(Saper::Items::Markdown)
69
+ end
70
+ it "#to_native returns document contents" do
71
+ subject.to_native.must_equal "<html></html>"
72
+ end
73
+ it "#to_text returns Text" do
74
+ subject.to_text.must_be_kind_of(Saper::Items::Text)
75
+ end
76
+ it "#to_xml raises InvalidItem" do
77
+ subject.to_xml.must_be_kind_of(Saper::Items::XML)
78
+ end
79
+ end
80
+
81
+ describe "Saper::Items::Document(XML as String)" do
82
+ subject do
83
+ Saper::Items::Document.new("<response></response>")
84
+ end
85
+ it "#size returns string length" do
86
+ subject.size.must_equal 21
87
+ end
88
+ it "#to_html returns HTML" do
89
+ subject.to_html.must_be_kind_of(Saper::Items::HTML)
90
+ end
91
+ it "#to_markdown returns Markdown" do
92
+ subject.to_markdown.must_be_kind_of(Saper::Items::Markdown)
93
+ end
94
+ it "#to_native returns document contents" do
95
+ subject.to_native.must_equal "<response></response>"
96
+ end
97
+ it "#to_text returns Text" do
98
+ subject.to_text.must_be_kind_of(Saper::Items::Text)
99
+ end
100
+ it "#to_xml returns XML" do
101
+ subject.to_xml.must_be_kind_of(Saper::Items::XML)
102
+ end
103
+ end
@@ -1,41 +1,58 @@
1
1
  require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::HTML do
4
-
5
- context ".new" do
6
-
4
+ let :html do
5
+ "<html><body><p><a href=\"http://google.com\">Google</a></p><p><a href=\"http://yandex.ru\">Yandex</a></p></body></html>"
7
6
  end
8
-
9
- context "#[]" do
10
-
7
+ let :subject do
8
+ Saper::Items::HTML.new html
11
9
  end
12
-
13
- context "#find" do
14
-
10
+ it "::new(nil) raises InvalidItem" do
11
+ lambda { Saper::Items::HTML.new(nil) }.must_raise(Saper::InvalidItem)
15
12
  end
16
-
17
- context "#find_all" do
18
-
13
+ it "::new('') raises InvalidItem" do
14
+ lambda { Saper::Items::HTML.new("") }.must_raise(Saper::InvalidItem)
19
15
  end
20
-
21
- context "#inner_html" do
22
-
16
+ it "::new(String) returns HTML" do
17
+ Saper::Items::HTML.new("string").must_be_instance_of(Saper::Items::HTML)
23
18
  end
24
-
25
- context "#inner_text" do
26
-
19
+ it "#find(valid) returns HTML" do
20
+ subject.find("a").must_be_kind_of(Saper::Items::HTML)
27
21
  end
28
-
29
- context "#remove_children_preserving_content" do
30
-
22
+ it "#find(invalid) returns nil" do
23
+ subject.find("li").must_be_nil
31
24
  end
32
-
33
- context "#remove_children_with_content" do
34
-
25
+ it "#find_all(valid) returns an Array of HTML instances" do
26
+ subject.find_all("a").first.must_be_kind_of(Saper::Items::HTML)
35
27
  end
36
-
37
- context "#to_markdown" do
38
-
28
+ it "#find_all(invalid) returns an empty Array" do
29
+ subject.find_all("li").must_be_empty
30
+ end
31
+ it "#[](valid) returns Text" do
32
+ subject.find("a")["href"].must_be_kind_of(Saper::Items::Text)
33
+ end
34
+ it "#[](invalid) returns nil" do
35
+ subject.find("a")["unknown"].must_be_nil
36
+ end
37
+ it "#inner_html returns Text" do
38
+ subject.inner_html.must_be_kind_of(Saper::Items::Text)
39
+ end
40
+ it "#inner_html returns valid contents" do
41
+ subject.inner_html.must_be :==, html
42
+ end
43
+ it "#inner_text returns Text" do
44
+ subject.inner_text.must_be_kind_of(Saper::Items::Text)
45
+ end
46
+ it "#remove_children_preserving_content returns modified HTML" do
47
+ subject.remove_children_preserving_content("a").to_native.must_equal "<html><body><p>Google</p><p>Yandex</p></body></html>"
48
+ end
49
+ it "#remove_children_with_content returns modified HTML" do
50
+ subject.remove_children_with_content("a").to_native.must_equal "<html><body><p></p><p></p></body></html>"
51
+ end
52
+ it "#to_markdown returns Markdown" do
53
+ subject.to_markdown.must_be_kind_of(Saper::Items::Markdown)
54
+ end
55
+ it "#== returns true for matching string" do
56
+ subject.to_s.must_be :==, html
39
57
  end
40
-
41
58
  end
@@ -1,17 +1,17 @@
1
1
  require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::JSON do
4
-
5
- context ".new" do
6
-
4
+ it "::new(nil) raises InvalidItem" do
5
+ lambda { Saper::Items::JSON.new(nil) }.must_raise(Saper::InvalidItem)
7
6
  end
8
-
9
- context "#find" do
10
-
7
+ it "::new('') raises InvalidItem" do
8
+ lambda { Saper::Items::JSON.new("") }.must_raise(Saper::InvalidItem)
11
9
  end
12
-
13
- context ".find_all" do
14
-
10
+ it "::new(invalid String) raises InvalidItem" do
11
+ lambda { Saper::Items::JSON.new("not json") }.must_raise(Saper::InvalidItem)
15
12
  end
16
-
13
+ it "#find" # TODO
14
+ it "#find_all" # TODO
15
+ it "#to_native" # TODO
16
+ it "#to_s" # TODO
17
17
  end
@@ -1,7 +1,28 @@
1
1
  require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::Markdown do
4
-
5
- it # TODO
6
-
4
+ let :html do
5
+ Saper::Items::HTML.new('<p>test</p>')
6
+ end
7
+ let :subject do
8
+ Saper::Items::Markdown.new(html)
9
+ end
10
+ it "::new(nil) raises InvalidItem" do
11
+ lambda { Saper::Items::Markdown.new(nil) }.must_raise(Saper::InvalidItem)
12
+ end
13
+ it "::new('') raises InvalidItem" do
14
+ lambda { Saper::Items::Markdown.new("") }.must_raise(Saper::InvalidItem)
15
+ end
16
+ it "::new(String) returns Markdown" do
17
+ lambda { Saper::Items::Markdown.new("string") }.must_raise(Saper::InvalidItem)
18
+ end
19
+ it "#to_native returns underlying String" do
20
+ subject.to_native.must_equal 'test'
21
+ end
22
+ it "#to_s returns underlying String" do
23
+ subject.to_s.must_equal 'test'
24
+ end
25
+ it "#== returns true for a matching string" do
26
+ subject.to_native.must_equal "test"
27
+ end
7
28
  end
@@ -2,6 +2,6 @@ require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::Nothing do
4
4
 
5
- it # TODO
5
+ it #TODO
6
6
 
7
7
  end
@@ -1,45 +1,17 @@
1
1
  require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::Text do
4
-
5
- context ".new(String)" do
6
- it "returns Text instance" do
7
- Saper::Items::Text.new("text").should be_a(Saper::Items::Text)
8
- end
9
- end
10
-
11
- context ".new(nil)" do
12
- it "raises InvalidItem" do
13
- expect { Saper::Items::Text.new(nil) }.to raise_error(Saper::InvalidItem)
14
- end
15
- end
16
-
17
- context "#gsub" do
18
-
19
- end
20
-
21
- context "#split" do
22
-
23
- end
24
-
25
- context "#to_json" do
26
-
27
- end
28
-
29
- context "#to_html" do
30
-
31
- end
32
-
33
- context "#to_s" do
34
-
35
- end
36
-
37
- context "#to_time" do
38
-
39
- end
40
-
41
- context "#to_xml" do
42
-
43
- end
44
-
4
+ subject do
5
+ Saper::Items::Text.new("text")
6
+ end
7
+ it "#== returns true for comparable String" do
8
+ subject.must_be :==, "text"
9
+ end
10
+ it "#gsub" # TODO
11
+ it "#split" # TODO
12
+ it "#to_json" # TODO
13
+ it "#to_html" # TODO
14
+ it "#to_s" # TODO
15
+ it "#to_time" # TODO
16
+ it "#to_xml" # TODO
45
17
  end
@@ -1,7 +1,28 @@
1
1
  require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::Time do
4
-
5
- it # TODO
6
-
7
- end
4
+ let(:input) do
5
+ '19-04-2014 18:56'
6
+ end
7
+ it ".new(nil) raises InvalidItem" do
8
+ lambda { Saper::Items::Time.new(nil) }.must_raise(Saper::InvalidItem)
9
+ end
10
+ it ".new('') raises InvalidItem" do
11
+ lambda { Saper::Items::Time.new('') }.must_raise(Saper::InvalidItem)
12
+ end
13
+ it ".new(invalid) raises InvalidItem" do
14
+ lambda { Saper::Items::Time.new(input, '%H:%M') }.must_raise(Saper::InvalidItem)
15
+ end
16
+ it ".new(valid) returns Time instance" do
17
+ Saper::Items::Time.new(input, '%d-%m-%Y %H:%M').must_be_instance_of(Saper::Items::Time)
18
+ end
19
+ it ".new(valid) returns valid time" do
20
+ Saper::Items::Time.new(input, '%d-%m-%Y %H:%M').to_s.must_be :==, '2014-04-19T18:56:00+00:00'
21
+ end
22
+ it ".new(valid, tz) returns Time instance" do
23
+ Saper::Items::Time.new(input, '%d-%m-%Y %H:%M', 'Europe/Moscow').to_s.must_be :==, '2014-04-19T18:56:00+04:00'
24
+ end
25
+ it "#to_native returns native Time instance" do
26
+ Saper::Items::Time.new(input, '%d-%m-%Y %H:%M').to_native.must_be_instance_of(Time)
27
+ end
28
+ end
@@ -2,12 +2,6 @@ require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::URL do
4
4
 
5
- context ".new" do
6
-
7
- end
8
-
9
- context "#to_s" do
10
-
11
- end
5
+ it # TODO
12
6
 
13
7
  end
@@ -1,45 +1,52 @@
1
1
  require './spec/spec_helper'
2
2
 
3
3
  describe Saper::Items::XML do
4
-
5
- context ".new(String)" do
6
- it "returns Text instance" do
7
- Saper::Items::Text.new("text").should be_a(Saper::Items::Text)
8
- end
9
- end
10
-
11
- context ".new(nil)" do
12
- it "raises InvalidItem" do
13
- expect { Saper::Items::XML.new(nil) }.to raise_error(Saper::InvalidItem)
14
- end
15
- end
16
-
17
- context "#[]" do
18
-
19
- end
20
-
21
- context "#find" do
22
-
23
- end
24
-
25
- context "#find_all" do
26
-
27
- end
28
-
29
- context "#inner_html" do
30
-
31
- end
32
-
33
- context "#inner_text" do
34
-
35
- end
36
-
37
- context "#remove_children_preserving_content" do
38
-
4
+ let :xml do
5
+ "<response><item name=\"Google\"><host>google.com</host></item><item name=\"Yandex\"><host>yandex.ru</host></item></response>"
39
6
  end
40
-
41
- context "#remove_children_with_content" do
42
-
7
+ let :subject do
8
+ Saper::Items::XML.new xml
9
+ end
10
+ it "::new(nil) raises InvalidItem" do
11
+ lambda { Saper::Items::XML.new(nil) }.must_raise(Saper::InvalidItem)
12
+ end
13
+ it "::new('') raises InvalidItem" do
14
+ lambda { Saper::Items::XML.new("") }.must_raise(Saper::InvalidItem)
15
+ end
16
+ it "::new(String) returns XML" do
17
+ Saper::Items::XML.new("string").must_be_instance_of(Saper::Items::XML)
18
+ end
19
+ it "#find(valid) returns XML" do
20
+ subject.find("host").must_be_kind_of(Saper::Items::XML)
21
+ end
22
+ it "#find(invalid) returns nil" do
23
+ subject.find("smth").must_be_nil
24
+ end
25
+ it "#find_all(valid) returns an Array of XML instances" do
26
+ subject.find_all("host").first.must_be_kind_of(Saper::Items::XML)
27
+ end
28
+ it "#find_all(invalid) returns an empty Array" do
29
+ subject.find_all("smth").must_be_empty
30
+ end
31
+ it "#[](valid) returns Text" do
32
+ subject.find("item")["name"].must_be_kind_of(Saper::Items::Text)
33
+ end
34
+ it "#[](invalid) returns nil" do
35
+ subject.find("item")["unknown"].must_be_nil
36
+ end
37
+ it "#inner_xml returns Text" do
38
+ subject.inner_xml.must_be_kind_of(Saper::Items::Text)
39
+ end
40
+ it "#inner_xml returns valid contents" do
41
+ subject.inner_xml.must_be :==, xml
42
+ end
43
+ it "#inner_text returns Text" do
44
+ subject.inner_text.must_be_kind_of(Saper::Items::Text)
45
+ end
46
+ it "#remove_children_preserving_content returns modified HTML" do
47
+ subject.remove_children_preserving_content("host").to_native.must_equal "<response><item name=\"Google\">google.com</item><item name=\"Yandex\">yandex.ru</item></response>"
48
+ end
49
+ it "#remove_children_with_content returns modified HTML" do
50
+ subject.remove_children_with_content("host").to_native.must_equal "<response><item name=\"Google\"></item><item name=\"Yandex\"></item></response>"
43
51
  end
44
-
45
52
  end