itms_automation 2.1 → 2.5.6

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/bin/generate.rb +3 -37
  3. data/bin/helper.rb +23 -10
  4. data/bin/itms_automation +18 -23
  5. data/doc/installation.md +16 -0
  6. data/doc/itms-automation-API.md +103 -0
  7. data/doc/itms-automation-help.md +18 -0
  8. data/example/android/android_app/android_app_calculator.zip +0 -0
  9. data/example/android/android_app/android_app_calculator/AndroidCalculator.apk +0 -0
  10. data/example/android/android_app/android_app_calculator/features/calculator.feature +36 -0
  11. data/example/android/android_app/android_app_calculator/features/my_first.feature +13 -0
  12. data/example/android/android_app/android_app_calculator/features/screenshots/test.png +0 -0
  13. data/example/android/android_app/android_app_calculator/features/step_definitions/custom_steps.rb +5 -0
  14. data/example/android/android_app/android_app_calculator/features/support/env.rb +52 -0
  15. data/example/android/android_app/android_app_calculator/features/support/hooks.rb +26 -0
  16. data/example/android/android_web/android_web_gmail_login.zip +0 -0
  17. data/example/android/android_web/android_web_gmail_login/features/gmail_login.feature +12 -0
  18. data/example/android/android_web/android_web_gmail_login/features/my_first.feature +1 -0
  19. data/example/android/android_web/android_web_gmail_login/features/screenshots/test.png +0 -0
  20. data/example/android/android_web/android_web_gmail_login/features/step_definitions/custom_steps.rb +5 -0
  21. data/example/android/android_web/android_web_gmail_login/features/support/env.rb +51 -0
  22. data/example/android/android_web/android_web_gmail_login/features/support/hooks.rb +27 -0
  23. data/example/desktop web/desktop_web_gmail_login.zip +0 -0
  24. data/example/desktop web/desktop_web_gmail_login/features/gmail_login.feature +9 -0
  25. data/example/desktop web/desktop_web_gmail_login/features/gmail_multi_login.feature +21 -0
  26. data/example/desktop web/desktop_web_gmail_login/features/my_first.feature +1 -0
  27. data/example/desktop web/desktop_web_gmail_login/features/screenshots/test.png +0 -0
  28. data/example/desktop web/desktop_web_gmail_login/features/step_definitions/custom_steps.rb +5 -0
  29. data/example/desktop web/desktop_web_gmail_login/features/support/env.rb +51 -0
  30. data/example/desktop web/desktop_web_gmail_login/features/support/hooks.rb +26 -0
  31. data/features-skeleton/my_first.feature +5 -0
  32. data/features-skeleton/screenshots/test.png +0 -0
  33. data/features-skeleton/step_definitions/custom_steps.rb +5 -0
  34. data/features-skeleton/support/env.rb +104 -0
  35. data/features-skeleton/support/hooks.rb +74 -0
  36. data/lib/itms_automation.rb +1 -3
  37. data/lib/itms_automation/assertion_steps.rb +68 -0
  38. data/lib/itms_automation/click_elements_steps.rb +24 -0
  39. data/lib/itms_automation/configuration_steps.rb +7 -0
  40. data/lib/itms_automation/input_steps.rb +59 -0
  41. data/lib/itms_automation/javascript_handling_steps.rb +10 -0
  42. data/lib/itms_automation/methods/assertion_methods.rb +344 -0
  43. data/lib/itms_automation/methods/click_elements_methods.rb +23 -0
  44. data/lib/itms_automation/methods/configuration_methods.rb +35 -0
  45. data/lib/itms_automation/methods/error_handling_methods.rb +87 -0
  46. data/lib/itms_automation/methods/input_methods.rb +69 -0
  47. data/lib/itms_automation/methods/javascript_handling_methods.rb +9 -0
  48. data/lib/itms_automation/methods/misc_methods.rb +47 -0
  49. data/lib/itms_automation/methods/navigate_methods.rb +123 -0
  50. data/lib/itms_automation/methods/progress_methods.rb +15 -0
  51. data/lib/itms_automation/methods/required_files.rb +9 -0
  52. data/lib/itms_automation/methods/screenshot_methods.rb +6 -0
  53. data/lib/itms_automation/navigation_steps.rb +79 -0
  54. data/lib/itms_automation/progress_steps.rb +17 -0
  55. data/lib/itms_automation/screenshot_steps.rb +6 -0
  56. data/lib/itms_automation/version.rb +5 -3
  57. metadata +84 -102
  58. data/bin/console +0 -14
  59. data/bin/documentation_generator.rb +0 -119
  60. data/bin/setup +0 -8
  61. data/lib/itms_automation/all_steps.rb +0 -8
  62. data/lib/itms_automation/assertion_helper.rb +0 -29
  63. data/lib/itms_automation/auto_util.rb +0 -694
  64. data/lib/itms_automation/database_steps_helper.rb +0 -125
  65. data/lib/itms_automation/web_steps_helper.rb +0 -606
  66. data/project/Gemfile +0 -3
  67. data/project/Gemfile.lock +0 -92
  68. data/project/README.md +0 -34
  69. data/project/Rakefile +0 -24
  70. data/project/config/chrome_headless_options.yaml +0 -1
  71. data/project/config/chrome_options.yaml +0 -6
  72. data/project/config/firefox_headless_options.yaml +0 -1
  73. data/project/config/firefox_options.yaml +0 -1
  74. data/project/config/ie_options.yaml +0 -1
  75. data/project/config/remote_options.yaml +0 -6
  76. data/project/config/safari_options.yaml +0 -1
  77. data/project/cucumber.yml +0 -4
  78. data/project/features/TestSuite/WebGUI.feature +0 -5
  79. data/project/features/step_definitions/lib_steps/steps_definition.rb +0 -46
  80. data/project/features/step_definitions/repositories/project_object.yml +0 -26
  81. data/project/features/support/env.rb +0 -9
  82. data/project/features/support/hooks.rb +0 -130
@@ -1,3 +0,0 @@
1
- source 'http://rubygems.org'
2
- gem 'report_builder'
3
- gem 'itms_automation'
@@ -1,92 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- addressable (2.7.0)
5
- public_suffix (>= 2.0.2, < 5.0)
6
- backports (3.15.0)
7
- builder (3.2.3)
8
- capybara (3.29.0)
9
- addressable
10
- mini_mime (>= 0.1.3)
11
- nokogiri (~> 1.8)
12
- rack (>= 1.6.0)
13
- rack-test (>= 0.6.3)
14
- regexp_parser (~> 1.5)
15
- xpath (~> 3.2)
16
- childprocess (3.0.0)
17
- colorize (0.8.1)
18
- cucumber (3.1.2)
19
- builder (>= 2.1.2)
20
- cucumber-core (~> 3.2.0)
21
- cucumber-expressions (~> 6.0.1)
22
- cucumber-wire (~> 0.0.1)
23
- diff-lcs (~> 1.3)
24
- gherkin (~> 5.1.0)
25
- multi_json (>= 1.7.5, < 2.0)
26
- multi_test (>= 0.1.2)
27
- cucumber-core (3.2.1)
28
- backports (>= 3.8.0)
29
- cucumber-tag_expressions (~> 1.1.0)
30
- gherkin (~> 5.0)
31
- cucumber-expressions (6.0.1)
32
- cucumber-tag_expressions (1.1.1)
33
- cucumber-wire (0.0.1)
34
- cucumber_priority (0.3.2)
35
- cucumber
36
- diff-lcs (1.3)
37
- gherkin (5.1.0)
38
- itms_automation (1.5)
39
- capybara (~> 3.29.0)
40
- colorize (~> 0.8.1)
41
- cucumber (~> 3.1)
42
- cucumber_priority (~> 0.3.2)
43
- parallel_tests (~> 2.7, >= 2.7.1)
44
- report_builder (~> 1.8, >= 1.8)
45
- rspec (~> 3.8, >= 3.8.0)
46
- selenium-webdriver (~> 3.6, >= 3.6.0)
47
- json (2.3.0)
48
- mini_mime (1.0.2)
49
- mini_portile2 (2.4.0)
50
- multi_json (1.14.0)
51
- multi_test (0.1.2)
52
- nokogiri (1.10.7)
53
- mini_portile2 (~> 2.4.0)
54
- parallel (1.19.1)
55
- parallel_tests (2.29.2)
56
- parallel
57
- public_suffix (4.0.3)
58
- rack (2.0.7)
59
- rack-test (1.1.0)
60
- rack (>= 1.0, < 3)
61
- regexp_parser (1.6.0)
62
- report_builder (1.8)
63
- json (>= 1.8.1)
64
- rspec (3.9.0)
65
- rspec-core (~> 3.9.0)
66
- rspec-expectations (~> 3.9.0)
67
- rspec-mocks (~> 3.9.0)
68
- rspec-core (3.9.1)
69
- rspec-support (~> 3.9.1)
70
- rspec-expectations (3.9.0)
71
- diff-lcs (>= 1.2.0, < 2.0)
72
- rspec-support (~> 3.9.0)
73
- rspec-mocks (3.9.1)
74
- diff-lcs (>= 1.2.0, < 2.0)
75
- rspec-support (~> 3.9.0)
76
- rspec-support (3.9.2)
77
- rubyzip (2.0.0)
78
- selenium-webdriver (3.142.6)
79
- childprocess (>= 0.5, < 4.0)
80
- rubyzip (>= 1.2.2)
81
- xpath (3.2.0)
82
- nokogiri (~> 1.8)
83
-
84
- PLATFORMS
85
- ruby
86
-
87
- DEPENDENCIES
88
- itms_automation
89
- report_builder
90
-
91
- BUNDLED WITH
92
- 2.0.2
@@ -1,34 +0,0 @@
1
- ###itms_automation gem
2
- itms_automation is an open-source tool for automating GUI, RESTful, SOAP, Database and eMail.
3
- Importantly, itms_automation is cross-platform, it allows you to write tests against multiple platforms (Linux, Windows, MacOS) on multiple browsers (chrome, firefox ...) using the same API.
4
-
5
- ###Getting Started
6
- These instructions will get you a copy of the project up and running on your local machine for testing purposes. See deployment for notes on how to install itms_automation gem
7
- ###Prerequisites
8
- - Ruby: 2.3+
9
- ###Installing
10
- `$ gem install itms_automation`
11
- System automatically fetch all relate automation libraries after install itms_automation gem
12
- ###Setup
13
- `$ itms_automation gen`
14
- This command help to create a set folder structure which followed the format of BDD Cucumber and itms_automation.
15
- ###Structure folder format
16
- - Screenshot folder
17
- Once your scenario failed, the screen will be captured and saved to this folder
18
-
19
- - TestSuite folder
20
- Place to store user's feature files.
21
-
22
- - Step_definitions folder
23
- - lib_steps
24
- - actionword.rb
25
- - steps.rb
26
- two file help to create user custom steps
27
- - repositories
28
- - project_object.yml (all web objects will store in this file)
29
- - support
30
- - env.rb
31
- - hook.rb
32
-
33
- - config folder
34
- All browser capabilities configuration
@@ -1,24 +0,0 @@
1
- require 'rubygems'
2
-
3
- begin
4
- require 'cucumber'
5
- require 'cucumber/rake/task'
6
- testsuite_name = ENV['TESTSUITE']
7
- testcase_report_name = ENV['TESTCASE_REPORT_NAME']
8
- report_path = "Reports/#{testsuite_name}"
9
- debug_opts = [ "--format usage", "--out"]
10
- report_opts = ["REPORT=true","--color", "--format junit", "--out #{report_path}", "--format json --out #{report_path}/#{testcase_report_name}.json"]
11
- namespace :execute do
12
- Cucumber::Rake::Task.new(:report, "Execute automation test with report output.") do |t|
13
- t.cucumber_opts = [*report_opts, "--format progress"]
14
- end
15
- Cucumber::Rake::Task.new(:debug, "Debug automation test without report output.") do |t|
16
- t.cucumber_opts = [*debug_opts]
17
- end
18
- end
19
- rescue LoadError
20
- desc 'Cucumber rake task not available'
21
- task :features do
22
- abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
23
- end
24
- end
@@ -1 +0,0 @@
1
- args: ["--headless","--disable-gpu",--no-sandbox]
@@ -1,6 +0,0 @@
1
- args: ["--start-maximized","--disable-infobars","--incognito"]
2
- prefs: {
3
- password_manager_enabled: false,
4
- default_content_settings: {popups: 0},
5
- content_settings: {pattern_pairs: {'*': {'multiple-automatic-downloads': 1}}}
6
- }
@@ -1 +0,0 @@
1
- browser.download.downloadDir: '/home/seluser'
@@ -1 +0,0 @@
1
- browser.download.downloadDir: '/home/seluser'
@@ -1 +0,0 @@
1
- mobileEmulation: {deviceName: "iPhone X"}
@@ -1,6 +0,0 @@
1
- args: ["--start-maximized","--disable-infobars","--incognito", "--user-agent='Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile /9A334 Safari/7534.48.3'"]
2
- prefs: {
3
- password_manager_enabled: false,
4
- default_content_settings: {popups: 0},
5
- content_settings: {pattern_pairs: {'*': {'multiple-automatic-downloads': 1}}}
6
- }
@@ -1 +0,0 @@
1
- mobileEmulation: {deviceName: "iPhone X"}
@@ -1,4 +0,0 @@
1
- chrome: BROWSER=chrome
2
- firefox: BROWSER=firefox
3
- ie: BROWSER=internet_explorer
4
- parallel: parallel_cucumber
@@ -1,5 +0,0 @@
1
- @test
2
- Feature: demo
3
-
4
- Scenario: new scenario
5
- Given Go to Test Cycle Sumary of iTMS project
@@ -1,46 +0,0 @@
1
- And /I open the page "(.*)"/ do |url_site|
2
- execute_openbrowser(url_site)
3
- end
4
-
5
- Given /^test select execute$/ do
6
-
7
- execute_openbrowser("https://infodation.atlassian.net/plugins/servlet/ac/Infodation-tms/test-summary?project.key=IFDTMS&project.id=17400")
8
- # execute_settext("username", "cuong")
9
- # execute_click("okbutton")
10
- switch_to_iframe("iframe1")
11
-
12
- execute_click("verify")
13
- sleep(5)
14
- end
15
-
16
- When /^Go to Test Cycle Sumary of iTMS project$/ do
17
- execute_openbrowser("https://infodation.atlassian.net/plugins/servlet/ac/Infodation-tms/test-summary?project.key=IFDTMS&project.id=17400")
18
- sleep(5)
19
- switch_to_iframe("iframe1")
20
- execute_click("itms_cyclesumarylink")
21
- sleep(3)
22
- custom_action
23
- end
24
-
25
-
26
- def custom_action()
27
- begin
28
- browser = Capybara.current_session.driver.browser
29
- if browser.respond_to?(:clear_cookies)
30
- # Rack::MockSession
31
- browser.clear_cookies
32
- print_log("passed", start, _method_)
33
- elsif browser.respond_to?(:manage) and browser.manage.respond_to?(:delete_all_cookies)
34
- # Selenium::WebDriver
35
- browser.manage.delete_all_cookies
36
- print_log("passed", start, _method_)
37
- else
38
- print_log("failed", start, _method_)
39
- raise "Error: Don't know how to clear cookies. Weird driver?"
40
- end
41
- rescue Exception => e
42
- print_log("failed", start, _method_)
43
- raise "Error: #{e.message}"
44
- end
45
-
46
- end
@@ -1,26 +0,0 @@
1
- username: { xpath_selector: '//input[@id="login"]' }
2
- okbutton: { xpath_selector: '//input[@value="Check Inbox"]' }
3
- iframe: { xpath_selector: '//*[@class="ap-iframe-container iframe-init"]' }
4
- iframe1: { xpath_selector: '//iframe[contains(@id,"Infodation-tms__test-summary_")]' }
5
- verify: { xpath_selector: '//*[@id="aui-uid-1"]' }
6
- firstname:
7
- {
8
- xpath_selector: '/html/body/div[2]/table/tbody/tr/td[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[5]/td/form/table/tbody/tr[2]/td[2]',
9
- }
10
- lastname:
11
- {
12
- xpath_selector: '/html/body/div[2]/table/tbody/tr/td[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[5]/td/form/table/tbody/tr[3]/td[2]/input',
13
- }
14
- selectcountry:
15
- {
16
- xpath_selector: '/html/body/div[2]/table/tbody/tr/td[2]/table/tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[5]/td/form/table/tbody/tr[11]/td[2]/select',
17
- }
18
- loginjira_continuebutton: {xpath_selector: "//button[@id=\"login-submit\"]/span/span/span"}
19
- loginjira_password: {xpath_selector: "//input[@id=\"password\"]"}
20
- loginjira_username: {xpath_selector: "//input[@id=\"username\"]"}
21
- itms_cyclesumarylink: {xpath_selector: "//section[@id=\"content\"]//li[@class=\"menu-item\"]/a"}
22
- itms_createnewtestcyclebutton: {xpath_selector: "//button[@id=\"itms-sidebar-addnew-button\"]"}
23
- itms_createtestcycle_savebutton: {xpath_selector: "//button[@id=\"itms-dialog-confirm\"]"}
24
- itms_createtestcyle_alertmessage: {xpath_selector: "//section[@id=\"ITMS-dialog-cycle\"]//strong"}
25
- itms_clickheretocreatetestcycle: {xpath_selector: "//section[@class=\"aui-buttons\"]/button[3]/span"}
26
- itms_iframe_testsumary: { xpath_selector: '//iframe[contains(@id,"Infodation-tms__test-summary_")]' }
@@ -1,9 +0,0 @@
1
- STDOUT.sync = true
2
- require "rubygems"
3
- require "capybara"
4
- require "capybara/cucumber"
5
- require "cucumber"
6
- require "yaml"
7
- require "selenium-webdriver"
8
- require "itms_automation"
9
- require "report_builder"
@@ -1,130 +0,0 @@
1
- Before do |scenario|
2
- $driver = getDriver
3
- $wait_time = ENV["WAIT_TIME"] || 30
4
- $print_log = ENV["PRINT_LOG"] || false
5
- $browser_data = page.driver.browser.capabilities
6
- end
7
-
8
- AfterConfiguration do
9
- $OBJECT = loadYAMLfile("features/step_definitions/repositories/project_object.yml")
10
- validate_params_exist
11
- if ENV['DELETE_COOKIE']
12
- browser = Capybara.current_session.driver.browser
13
- browser.manage.delete_all_cookies
14
- end
15
-
16
- end
17
-
18
- def validate_params_exist
19
- raise "❌ ERROR: Missing param SERVER_URL." if ENV['SERVER_URL'].nil?
20
- raise "❌ ERROR: Missing param BROWSER." if ENV['BROWSER'].nil?
21
- if ENV['REPORT']
22
- raise "❌ ERROR: Missing param TESTSUITE." if ENV['TESTSUITE'].nil?
23
- raise "❌ ERROR: Missing param TESTCASE_REPORT_NAME." if ENV['TESTCASE_REPORT_NAME'].nil?
24
- $report_path = "Reports/#{ENV['TESTSUITE']}"
25
- $testcase_report_name = ENV['TESTCASE_REPORT_NAME']
26
- end
27
- end
28
-
29
- def getDriver
30
- case ENV['BROWSER']
31
- when "chrome"
32
- @chrome_options = loadYAMLfile('config/chrome_options.yaml')
33
- Capybara.register_driver :selenium do |app|
34
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'],:desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: @chrome_options))
35
- end
36
- Capybara.current_driver = :selenium
37
- when "firefox"
38
- @firefox_options = loadYAMLfile('config/firefox_options.yaml')
39
- Capybara.register_driver :selenium do |app|
40
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.firefox(firefoxOptions: @firefox_options))
41
- end
42
- Capybara.current_driver = :selenium
43
- when "safari"
44
- @safari_options = loadYAMLfile('config/safari_options.yaml')
45
- Capybara.register_driver :selenium do |app|
46
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.safari(safariOptions: @safari_options))
47
- end
48
- Capybara.current_driver = :selenium
49
- when "ie"
50
- @ie_options = loadYAMLfile('config/ie_options.yaml')
51
- Capybara.register_driver :selenium do |app|
52
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.internet_explorer(ieOptions: @ie_options))
53
- end
54
- Capybara.current_driver = :selenium
55
- # when "chrome_headless"
56
- # @chrome_headless_options = loadYAMLfile('config/chrome_headless_options.yaml')
57
- # Capybara.register_driver :selenium do |app|
58
- # Capybara::Selenium::Driver.new(app, :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: @chrome_headless_options))
59
- # end
60
- # Capybara.current_driver = :selenium_headless
61
- # when "firefox_headless"
62
- # @firefox_headless_options = loadYAMLfile('config/firefox_options.yaml')
63
- # Capybara.register_driver :selenium do |app|
64
- # Capybara::Selenium::Driver.new(app, :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.firefox(firefoxOptions: @firefox_headless_options))
65
- # end
66
- # Capybara.current_driver = :selenium_headless
67
- when "remote"
68
- @capabilities = loadYAMLfile('config/remote_options.yaml')
69
- Capybara.register_driver :selenium do |app|
70
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => @capabilities)
71
- end
72
- Capybara.current_driver = :selenium
73
- else
74
- raise "❌ ERROR: Unsupported browser: #{ENV['BROWSER']}. Available: chrome || firefox || safari || ie || remote"
75
- end
76
- end
77
-
78
- def loadYAMLfile(filename)
79
- begin
80
- return YAML.load_file(filename)
81
- rescue Psych::SyntaxError => ex
82
- raise "❌ SyntaxError when reading file: #{ex}"
83
- end
84
- end
85
-
86
- After do |scenario|
87
- # save_screenshot = ENV['SCREENSHOT'] || false
88
- # if save_screenshot == true
89
- # file_name = 'failed_%s.png' % rand(1000).to_s
90
- # page.save_screenshot($screenshot+file_name) if scenario.failed?
91
- # begin
92
- # Capybara.page.driver.quit
93
- # Capybara.send(:session_pool).delete_if { |key, value| key =~ /selenium/i }
94
- # rescue StandardError => myStandardError
95
- # puts "❌ Error: #{myStandardError}"
96
- # exit(1)
97
- # end
98
- # end
99
- # $browser_data = page.driver.browser.capabilities
100
- # p "$browser_data:#{$browser_data.inspect}"
101
- end
102
-
103
- at_exit do
104
- if ENV['REPORT']
105
- begin
106
- # validateReport
107
- time = Time.now.getutc
108
- if $browser_data
109
- browser_name = $browser_data[:browser_name]
110
- browser_version = $browser_data[:browser_version]
111
- platform = $browser_data[:platform_name]
112
- end
113
- ReportBuilder.configure do |config|
114
- config.report_path = "#{$report_path}/#{$testcase_report_name}"
115
- config.input_path = "#{$report_path}/#{$testcase_report_name}.json"
116
- config.report_types = [:json, :html]
117
- config.color = 'blue'
118
- config.additional_info = {
119
- 'Browser' => browser_name || nil,
120
- 'Platform' => platform || nil,
121
- 'Browser Version' => browser_version || nil,
122
- 'Report Generated' => time
123
- }
124
- end
125
- options = { report_title: "iTMS - Test Management System" }
126
- ReportBuilder.build_report options
127
- rescue NoMethodError
128
- end
129
- end
130
- end