howitzer 1.1.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +32 -0
  4. data/.travis.yml +1 -4
  5. data/.yardopts +1 -2
  6. data/CHANGELOG.md +28 -1
  7. data/Gemfile +6 -0
  8. data/LICENSE +1 -1
  9. data/README.md +55 -85
  10. data/Rakefile +7 -7
  11. data/bin/howitzer +56 -31
  12. data/features/cli_new.feature +162 -79
  13. data/features/cli_update.feature +114 -21
  14. data/features/step_definitions/common_steps.rb +29 -9
  15. data/features/support/env.rb +1 -1
  16. data/features/support/transformers.rb +2 -2
  17. data/generators/base_generator.rb +121 -49
  18. data/generators/config/config_generator.rb +8 -5
  19. data/generators/config/templates/boot.rb +14 -0
  20. data/generators/config/templates/capybara.rb +156 -0
  21. data/generators/config/templates/custom.yml +2 -3
  22. data/generators/config/templates/default.yml +50 -82
  23. data/generators/cucumber/cucumber_generator.rb +9 -9
  24. data/generators/cucumber/templates/common_steps.rb +4 -4
  25. data/generators/cucumber/templates/cucumber.rake +63 -54
  26. data/generators/cucumber/templates/env.rb +24 -23
  27. data/generators/cucumber/templates/transformers.rb +23 -15
  28. data/generators/emails/emails_generator.rb +4 -2
  29. data/generators/emails/templates/example_email.rb +4 -4
  30. data/generators/prerequisites/prerequisites_generator.rb +24 -0
  31. data/generators/prerequisites/templates/base.rb +22 -0
  32. data/generators/prerequisites/templates/factory_girl.rb +30 -0
  33. data/generators/prerequisites/templates/user.rb +7 -0
  34. data/generators/prerequisites/templates/users.rb +12 -0
  35. data/generators/root/root_generator.rb +11 -7
  36. data/generators/root/templates/.rubocop.yml +32 -0
  37. data/generators/root/templates/Gemfile.erb +27 -0
  38. data/generators/root/templates/Rakefile +6 -8
  39. data/generators/rspec/rspec_generator.rb +7 -7
  40. data/generators/rspec/templates/example_spec.rb +1 -1
  41. data/generators/rspec/templates/rspec.rake +48 -29
  42. data/generators/rspec/templates/spec_helper.rb +33 -32
  43. data/generators/tasks/tasks_generator.rb +4 -2
  44. data/generators/tasks/templates/common.rake +1 -16
  45. data/generators/turnip/templates/.rspec +1 -0
  46. data/generators/turnip/templates/common_steps.rb +25 -0
  47. data/generators/turnip/templates/example.feature +8 -0
  48. data/generators/turnip/templates/spec_helper.rb +56 -0
  49. data/generators/turnip/templates/turnip.rake +61 -0
  50. data/generators/turnip/templates/turnip_helper.rb +6 -0
  51. data/generators/turnip/turnip_generator.rb +26 -0
  52. data/generators/web/templates/example_page.rb +15 -0
  53. data/generators/web/templates/menu_section.rb +13 -0
  54. data/generators/web/web_generator.rb +22 -0
  55. data/howitzer.gemspec +14 -21
  56. data/lib/howitzer.rb +47 -7
  57. data/lib/howitzer/cache.rb +70 -0
  58. data/lib/howitzer/capybara_helpers.rb +194 -0
  59. data/lib/howitzer/email.rb +96 -104
  60. data/lib/howitzer/exceptions.rb +10 -6
  61. data/lib/howitzer/log.rb +120 -0
  62. data/lib/howitzer/mail_adapters.rb +7 -0
  63. data/lib/howitzer/mail_adapters/abstract.rb +84 -0
  64. data/lib/howitzer/mail_adapters/mailgun.rb +115 -0
  65. data/lib/howitzer/mailgun_api.rb +9 -0
  66. data/lib/howitzer/mailgun_api/client.rb +79 -0
  67. data/lib/howitzer/mailgun_api/connector.rb +37 -0
  68. data/lib/howitzer/mailgun_api/response.rb +28 -0
  69. data/lib/howitzer/tasks/framework.rake +2 -2
  70. data/lib/howitzer/utils.rb +7 -1
  71. data/lib/howitzer/utils/string_extensions.rb +66 -0
  72. data/lib/howitzer/version.rb +2 -1
  73. data/lib/howitzer/web.rb +11 -0
  74. data/lib/howitzer/web/base_section.rb +27 -0
  75. data/lib/howitzer/web/blank_page.rb +12 -0
  76. data/lib/howitzer/web/capybara_methods_proxy.rb +29 -0
  77. data/lib/howitzer/web/element_dsl.rb +109 -0
  78. data/lib/howitzer/web/iframe_dsl.rb +93 -0
  79. data/lib/howitzer/web/page.rb +173 -0
  80. data/lib/howitzer/web/page_dsl.rb +64 -0
  81. data/lib/howitzer/web/page_validator.rb +118 -0
  82. data/lib/howitzer/web/section.rb +27 -0
  83. data/lib/howitzer/web/section_dsl.rb +154 -0
  84. data/spec/config/custom.yml +10 -1
  85. data/spec/spec_helper.rb +37 -19
  86. data/spec/support/generator_helper.rb +12 -11
  87. data/spec/support/logger_helper.rb +10 -9
  88. data/spec/support/mailgun_unit_client.rb +52 -44
  89. data/spec/support/shared_examples/capybara_context_holder.rb +33 -0
  90. data/spec/support/shared_examples/capybara_methods_proxy.rb +94 -0
  91. data/spec/support/shared_examples/dynamic_section_methods.rb +35 -0
  92. data/spec/support/shared_examples/element_dsl.rb +119 -0
  93. data/spec/unit/generators/base_generator_spec.rb +64 -33
  94. data/spec/unit/generators/config_generator_spec.rb +11 -7
  95. data/spec/unit/generators/cucumber_generator_spec.rb +26 -17
  96. data/spec/unit/generators/emails_generator_spec.rb +10 -6
  97. data/spec/unit/generators/prerequisites_generator_spec.rb +53 -0
  98. data/spec/unit/generators/root_generator_spec.rb +50 -13
  99. data/spec/unit/generators/rspec_generator_spec.rb +9 -9
  100. data/spec/unit/generators/tasks_generator_spec.rb +6 -6
  101. data/spec/unit/generators/turnip_generator_spec.rb +52 -0
  102. data/spec/unit/generators/web_generator_spec.rb +52 -0
  103. data/spec/unit/lib/cache_spec.rb +85 -0
  104. data/spec/unit/lib/capybara_helpers_spec.rb +696 -0
  105. data/spec/unit/lib/email_spec.rb +104 -91
  106. data/spec/unit/lib/howitzer.rb +31 -0
  107. data/spec/unit/lib/init_spec.rb +0 -1
  108. data/spec/unit/lib/log_spec.rb +122 -0
  109. data/spec/unit/lib/mail_adapters/abstract_spec.rb +62 -0
  110. data/spec/unit/lib/mail_adapters/mailgun_spec.rb +163 -0
  111. data/spec/unit/lib/mailgun_api/client_spec.rb +58 -0
  112. data/spec/unit/lib/mailgun_api/connector_spec.rb +54 -0
  113. data/spec/unit/lib/mailgun_api/response_spec.rb +28 -0
  114. data/spec/unit/lib/utils/string_extensions_spec.rb +77 -0
  115. data/spec/unit/lib/web/base_section_spec.rb +41 -0
  116. data/spec/unit/lib/web/element_dsl_spec.rb +17 -0
  117. data/spec/unit/lib/web/iframe_dsl_spec.rb +99 -0
  118. data/spec/unit/lib/web/page_dsl_spec.rb +52 -0
  119. data/spec/unit/lib/web/page_spec.rb +304 -0
  120. data/spec/unit/lib/web/page_validator_spec.rb +218 -0
  121. data/spec/unit/lib/web/section_dsl_spec.rb +165 -0
  122. data/spec/unit/lib/web/section_spec.rb +61 -0
  123. data/spec/unit/version_spec.rb +1 -1
  124. metadata +116 -203
  125. data/GETTING_STARTED.md +0 -774
  126. data/generators/cucumber/templates/cucumber.yml +0 -10
  127. data/generators/pages/pages_generator.rb +0 -21
  128. data/generators/pages/templates/example_menu.rb +0 -15
  129. data/generators/pages/templates/example_page.rb +0 -15
  130. data/generators/root/templates/Gemfile +0 -7
  131. data/generators/root/templates/boot.rb +0 -10
  132. data/lib/howitzer/blank_page.rb +0 -6
  133. data/lib/howitzer/capybara/dsl_ex.rb +0 -15
  134. data/lib/howitzer/capybara/settings.rb +0 -343
  135. data/lib/howitzer/helpers.rb +0 -230
  136. data/lib/howitzer/init.rb +0 -1
  137. data/lib/howitzer/mailgun/client.rb +0 -65
  138. data/lib/howitzer/mailgun/connector.rb +0 -34
  139. data/lib/howitzer/mailgun/response.rb +0 -28
  140. data/lib/howitzer/patches/rawler_patched.rb +0 -86
  141. data/lib/howitzer/settings.rb +0 -27
  142. data/lib/howitzer/utils/data_generator/data_storage.rb +0 -88
  143. data/lib/howitzer/utils/data_generator/gen.rb +0 -135
  144. data/lib/howitzer/utils/locator_store.rb +0 -217
  145. data/lib/howitzer/utils/log.rb +0 -139
  146. data/lib/howitzer/utils/page_validator.rb +0 -133
  147. data/lib/howitzer/vendor/firebug-1.12.1-fx.xpi +0 -0
  148. data/lib/howitzer/vendor/firepath-0.9.7-fx.xpi +0 -0
  149. data/lib/howitzer/web_page.rb +0 -253
  150. data/spec/active_resource.rb +0 -0
  151. data/spec/config/default.yml +0 -26
  152. data/spec/support/boot_helper.rb +0 -15
  153. data/spec/unit/generators/pages_generator_spec.rb +0 -33
  154. data/spec/unit/lib/capybara/dsl_ex_spec.rb +0 -60
  155. data/spec/unit/lib/capybara/settings_spec.rb +0 -441
  156. data/spec/unit/lib/helpers_spec.rb +0 -1129
  157. data/spec/unit/lib/mailgun/client_spec.rb +0 -36
  158. data/spec/unit/lib/mailgun/connector_spec.rb +0 -70
  159. data/spec/unit/lib/mailgun/response_spec.rb +0 -28
  160. data/spec/unit/lib/settings_spec.rb +0 -17
  161. data/spec/unit/lib/utils/data_generator/data_storage_spec.rb +0 -80
  162. data/spec/unit/lib/utils/data_generator/gen_spec.rb +0 -90
  163. data/spec/unit/lib/utils/locator_store_spec.rb +0 -157
  164. data/spec/unit/lib/utils/log_spec.rb +0 -107
  165. data/spec/unit/lib/utils/page_validator_spec.rb +0 -265
  166. data/spec/unit/lib/web_page_spec.rb +0 -346
@@ -1,230 +0,0 @@
1
- require 'howitzer/exceptions'
2
-
3
- module Helpers
4
-
5
- CHECK_YOUR_SETTINGS_MSG = "Please check your settings"
6
-
7
- ##
8
- #
9
- # Returns whether or not the current driver is SauceLabs.
10
- #
11
-
12
- def sauce_driver?
13
- log.error Howitzer::DriverNotSpecifiedError, CHECK_YOUR_SETTINGS_MSG if settings.driver.nil?
14
- settings.driver.to_s.to_sym == :sauce
15
- end
16
-
17
- ##
18
- #
19
- # Returns whether or not the current driver is TestingBot.
20
- #
21
-
22
- def testingbot_driver?
23
- log.error Howitzer::DriverNotSpecifiedError, CHECK_YOUR_SETTINGS_MSG if settings.driver.nil?
24
- settings.driver.to_s.to_sym == :testingbot
25
- end
26
-
27
- ##
28
- #
29
- # Returns whether or not the current driver is Selenium.
30
- #
31
-
32
- def selenium_driver?
33
- log.error Howitzer::DriverNotSpecifiedError, CHECK_YOUR_SETTINGS_MSG if settings.driver.nil?
34
- settings.driver.to_s.to_sym == :selenium
35
- end
36
-
37
- ##
38
- #
39
- # Returns whether or not the current driver is Selenium Grid.
40
- #
41
-
42
- def selenium_grid_driver?
43
- log.error Howitzer::DriverNotSpecifiedError, CHECK_YOUR_SETTINGS_MSG if settings.driver.nil?
44
- settings.driver.to_s.to_sym == :selenium_grid
45
- end
46
-
47
- ##
48
- #
49
- # Returns whether or not the current driver is PhantomJS.
50
- #
51
-
52
- def phantomjs_driver?
53
- log.error Howitzer::DriverNotSpecifiedError, CHECK_YOUR_SETTINGS_MSG if settings.driver.nil?
54
- settings.driver.to_s.to_sym == :phantomjs
55
- end
56
-
57
- ##
58
- #
59
- # Returns whether or not the current browser is Internet Explorer.
60
- #
61
-
62
- def ie_browser?
63
- browser? :ie, :iexplore
64
- end
65
-
66
- ##
67
- #
68
- # Returns whether or not the current browser is FireFox.
69
- #
70
-
71
- def ff_browser?
72
- browser? :ff, :firefox
73
- end
74
-
75
- ##
76
- #
77
- # Returns whether or not the current browser is Google Chrome.
78
- #
79
-
80
- def chrome_browser?
81
- browser? :chrome
82
- end
83
-
84
- ##
85
- #
86
- # Returns whether or not the current browser is Opera.
87
- #
88
-
89
- def opera_browser?
90
- browser? :opera
91
- end
92
-
93
- ##
94
- #
95
- # Returns whether or not the current browser is Safari.
96
- #
97
-
98
- def safari_browser?
99
- browser? :safari
100
- end
101
-
102
- ##
103
- #
104
- # Returns application url including base authentication (if specified in settings)
105
- #
106
-
107
- def app_url
108
- prefix = settings.app_base_auth_login.blank? ? '' : "#{settings.app_base_auth_login}:#{settings.app_base_auth_pass}@"
109
- app_base_url prefix
110
- end
111
-
112
- ##
113
- #
114
- # Returns application url without base authentication by default
115
- #
116
- # *Parameters:*
117
- # * +prefix+ - Sets base authentication prefix (defaults to: nil)
118
- #
119
-
120
- def app_base_url(prefix=nil)
121
- "#{settings.app_protocol || 'http'}://#{prefix}#{settings.app_host}"
122
- end
123
-
124
- ##
125
- #
126
- # Returns formatted duration time
127
- #
128
- # *Parameters:*
129
- # * +time_in_numeric+ - Number of seconds
130
- #
131
-
132
- def duration(time_in_numeric)
133
- secs = time_in_numeric.to_i
134
- mins = secs / 60
135
- hours = mins / 60
136
- if hours > 0
137
- "[#{hours}h #{mins % 60}m #{secs % 60}s]"
138
- elsif mins > 0
139
- "[#{mins}m #{secs % 60}s]"
140
- elsif secs >= 0
141
- "[0m #{secs}s]"
142
- end
143
- end
144
-
145
- ##
146
- #
147
- # Evaluates given value
148
- #
149
- # *Parameters:*
150
- # * +value+ - Value to be evaluated
151
- #
152
-
153
- def ri(value)
154
- raise value.inspect
155
- end
156
-
157
- private
158
-
159
- def browser?(*browser_aliases)
160
- if sauce_driver?
161
- log.error Howitzer::SlBrowserNotSpecifiedError, CHECK_YOUR_SETTINGS_MSG if settings.sl_browser_name.nil?
162
- browser_aliases.include?(settings.sl_browser_name.to_s.to_sym)
163
- elsif testingbot_driver?
164
- log.error Howitzer::TbBrowserNotSpecifiedError, CHECK_YOUR_SETTINGS_MSG if settings.tb_browser_name.nil?
165
- browser_aliases.include?(settings.tb_browser_name.to_s.to_sym)
166
- elsif selenium_driver? || selenium_grid_driver?
167
- log.error Howitzer::SelBrowserNotSpecifiedError, CHECK_YOUR_SETTINGS_MSG if settings.sel_browser.nil?
168
- browser_aliases.include?(settings.sel_browser.to_s.to_sym)
169
- end
170
- end
171
-
172
- end
173
-
174
- include Helpers
175
-
176
- class String
177
-
178
- ##
179
- #
180
- # Delegates WebPage.open method. Useful in cucumber step definitions
181
- #
182
- # *Parameters:*
183
- # * +*args+ - Url to be opened
184
- #
185
-
186
- def open(*args)
187
- as_page_class.open(*args)
188
- end
189
-
190
- ##
191
- #
192
- # Returns page instance
193
- #
194
-
195
- def given
196
- as_page_class.given
197
- end
198
-
199
- ##
200
- #
201
- # Waits until page is opened or raise error
202
- #
203
-
204
- def wait_for_opened
205
- as_page_class.wait_for_opened
206
- end
207
-
208
- ##
209
- #
210
- # Returns page class
211
- #
212
-
213
- def as_page_class
214
- as_class('Page')
215
- end
216
-
217
- ##
218
- #
219
- # Returns email class
220
- #
221
-
222
- def as_email_class
223
- as_class('Email')
224
- end
225
-
226
- private
227
- def as_class(type)
228
- "#{self.gsub(/\s/, '_').camelize}#{type}".constantize
229
- end
230
- end
@@ -1 +0,0 @@
1
- include DataGenerator
@@ -1,65 +0,0 @@
1
- require 'rest_client'
2
- require 'json'
3
- require 'howitzer/mailgun/response'
4
- require 'howitzer/exceptions'
5
-
6
- module Mailgun
7
-
8
- # A Mailgun::Client object is used to communicate with the Mailgun API. It is a
9
- # wrapper around RestClient so you don't have to worry about the HTTP aspect
10
- # of communicating with our API.
11
-
12
- class Client
13
- attr_reader :api_key
14
-
15
- def initialize(api_key, api_host="api.mailgun.net", api_version="v3", ssl=true)
16
- endpoint = endpoint_generator(api_host, api_version, ssl)
17
- @api_key = api_key
18
- @http_client = RestClient::Resource.new(endpoint,
19
- :user => "api",
20
- :password => api_key,
21
- :user_agent => "mailgun-sdk-ruby/1.0.1")
22
- end
23
-
24
- # Generic Mailgun GET Handler
25
- #
26
- # @param [String] resource_path This is the API resource you wish to interact
27
- # with. Be sure to include your domain, where necessary.
28
- # @param [Hash] params This should be a standard Hash for query
29
- # containing required parameters for the requested resource.
30
- # @return [Mailgun::Response] A Mailgun::Response object.
31
-
32
- def get(resource_path, params=nil, accept="*/*")
33
- http_params = {:accept => accept}
34
- http_params = http_params.merge(params: params) if params
35
- response = @http_client[resource_path].get(http_params)
36
- Response.new(response)
37
- rescue => e
38
- log.error Howitzer::CommunicationError, e.message
39
- end
40
-
41
- def get_url(url, params=nil, accept="*/*")
42
- response = ::RestClient::Request.execute(
43
- method: :get,
44
- url: url,
45
- user: 'api',
46
- password: api_key,
47
- user_agent: 'mailgun-sdk-ruby',
48
- accept: accept,
49
- params: params
50
- )
51
- Response.new(response)
52
- rescue => e
53
- log.error Howitzer::CommunicationError, e.message
54
- end
55
-
56
- private
57
-
58
- def endpoint_generator(api_host, api_version, ssl)
59
- scheme = "http#{'s' if ssl}"
60
- res = "#{scheme}://#{api_host}"
61
- res << "/#{api_version}" if api_version
62
- res
63
- end
64
- end
65
- end
@@ -1,34 +0,0 @@
1
- require 'singleton'
2
- require 'howitzer/mailgun/client'
3
- require 'howitzer/exceptions'
4
-
5
- module Mailgun
6
- class Connector
7
- include Singleton
8
-
9
- attr_reader :api_key
10
-
11
- def client(api_key=settings.mailgun_key)
12
- check_api_key(api_key)
13
- if @api_key == api_key && @api_key
14
- @client
15
- else
16
- @api_key = api_key
17
- @client = Mailgun::Client.new(@api_key)
18
- end
19
- end
20
-
21
- def domain
22
- @domain || change_domain
23
- end
24
-
25
- def change_domain(domain_name=settings.mailgun_domain)
26
- @domain = domain_name
27
- end
28
-
29
- private
30
- def check_api_key(api_key)
31
- log.error Howitzer::InvalidApiKeyError, "Api key can not be blank" if api_key.blank?
32
- end
33
- end
34
- end
@@ -1,28 +0,0 @@
1
- require 'howitzer/exceptions'
2
-
3
- module Mailgun
4
- # A Mailgun::Response object is instantiated for each response generated
5
- # by the Client request. The Response object supports deserialization of
6
- # the JSON result.
7
-
8
- class Response
9
-
10
- attr_accessor :body
11
- attr_accessor :code
12
-
13
- def initialize(response)
14
- @body = response.body
15
- @code = response.code
16
- end
17
-
18
- # Return response as Ruby Hash
19
- #
20
- # @return [Hash] A standard Ruby Hash containing the HTTP result.
21
-
22
- def to_h
23
- JSON.parse(@body)
24
- rescue Exception => e
25
- log.error Howitzer::ParseError, e.message
26
- end
27
- end
28
- end
@@ -1,86 +0,0 @@
1
- module Rawler
2
- class Base
3
- def record_response(code, link, from_url, redirection=nil)
4
- message = "#{code} - #{link}"
5
-
6
- if code.to_i >= 300
7
- message += " - Called from: #{from_url}"
8
- end
9
-
10
- message += " - Following redirection to: #{redirection}" if redirection
11
- log_fields = {code: code, link: link, message: message}
12
-
13
- code = code.to_i
14
- case code / 100
15
- when 1,2
16
- Rawler.output.info(message)
17
- add_xml_log_item(log_fields) if settings.add_rawler_xml_log
18
- add_html_log_item(log_fields) if settings.add_rawler_html_log
19
- when 3 then
20
- Rawler.output.warn(message)
21
- add_xml_log_item(log_fields) if settings.add_rawler_xml_log
22
- add_html_log_item(log_fields) if settings.add_rawler_html_log
23
- when 4,5 then
24
- Rawler.output.error(message)
25
- log_fields[:failed] = true
26
- add_xml_log_item(log_fields) if settings.add_rawler_xml_log
27
- add_html_log_item(log_fields) if settings.add_rawler_html_log
28
- else
29
- Rawler.output.error("Unknown code #{message}")
30
- log_fields[:failed] = true
31
- log_fields[:message] = "Unknown code #{message}"
32
- add_xml_log_item(log_fields) if settings.add_rawler_xml_log
33
- add_html_log_item(log_fields) if settings.add_rawler_html_log
34
- end
35
- @logfile.puts(message) if Rawler.log
36
- end
37
-
38
- def add_xml_log_item(fields)
39
- log_file_path = File.expand_path(settings.rawler_xml_log, "#{settings.log_dir}")
40
-
41
- doc = File.exists?(log_file_path) ? Nokogiri::XML::Document.parse(File.read log_file_path) : Nokogiri::XML::Document.new
42
-
43
- doc.encoding = 'UTF-8'
44
-
45
- if doc.root
46
- tests = doc.root > ("testcase")
47
- failures = doc.root > ("testcase failure")
48
- doc.root[:failures] = failures.to_a.size.to_s
49
- doc.root[:tests] = tests.to_a.size.to_s
50
- doc.root[:time] = "#{tests.to_a.size} sec."
51
- else
52
- root = doc.create_element('testsuite')
53
- root[:errors] = "0"
54
- root[:failures] = "0"
55
- root[:name] = "Check links"
56
- root[:skipped] = "0"
57
- root[:tests] = "0"
58
- root[:time] = "0 sec."
59
- doc.root = root
60
- end
61
-
62
- testcase = doc.create_element('testcase')
63
- testcase[:classname] = "Check links"
64
- testcase[:name] = "Check: link '#{fields[:link]}'"
65
- testcase[:time] = "1"
66
-
67
- if fields[:failed]
68
- failure = doc.create_element('failure', message: "Failed responce code: '#{fields[:code]}'", type:'failed')
69
- failure << doc.create_cdata("#{fields[:message]}")
70
- testcase << failure
71
- end
72
-
73
- testcase << doc.create_element('system-out')
74
- testcase << doc.create_element('system-err')
75
- doc.root << testcase
76
-
77
- File.open(log_file_path, 'w+') do |f|
78
- f.write(doc.serialize(:encoding => 'UTF-8', :save_with => Nokogiri::XML::Node::SaveOptions::FORMAT))
79
- end
80
- end
81
-
82
- def add_html_log_item(fields)
83
- #Todo: should be implemented
84
- end
85
- end
86
- end