saper 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
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