itms_automation 2.3 → 2.6.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 (83) 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 +106 -0
  30. data/example/desktop web/desktop_web_gmail_login/features/support/hooks.rb +38 -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/step_definitions/repositories/project_object.yml +1 -0
  35. data/features-skeleton/support/env.rb +108 -0
  36. data/features-skeleton/support/hooks.rb +38 -0
  37. data/lib/itms_automation.rb +1 -3
  38. data/lib/itms_automation/assertion_steps.rb +68 -0
  39. data/lib/itms_automation/click_elements_steps.rb +24 -0
  40. data/lib/itms_automation/configuration_steps.rb +7 -0
  41. data/lib/itms_automation/input_steps.rb +59 -0
  42. data/lib/itms_automation/javascript_handling_steps.rb +10 -0
  43. data/lib/itms_automation/methods/assertion_methods.rb +333 -0
  44. data/lib/itms_automation/methods/click_elements_methods.rb +23 -0
  45. data/lib/itms_automation/methods/configuration_methods.rb +35 -0
  46. data/lib/itms_automation/methods/error_handling_methods.rb +93 -0
  47. data/lib/itms_automation/methods/input_methods.rb +69 -0
  48. data/lib/itms_automation/methods/javascript_handling_methods.rb +9 -0
  49. data/lib/itms_automation/methods/misc_methods.rb +63 -0
  50. data/lib/itms_automation/methods/navigate_methods.rb +123 -0
  51. data/lib/itms_automation/methods/progress_methods.rb +15 -0
  52. data/lib/itms_automation/methods/required_files.rb +9 -0
  53. data/lib/itms_automation/methods/screenshot_methods.rb +6 -0
  54. data/lib/itms_automation/navigation_steps.rb +79 -0
  55. data/lib/itms_automation/progress_steps.rb +17 -0
  56. data/lib/itms_automation/screenshot_steps.rb +6 -0
  57. data/lib/itms_automation/version.rb +5 -3
  58. metadata +93 -90
  59. data/bin/console +0 -14
  60. data/bin/documentation_generator.rb +0 -119
  61. data/bin/setup +0 -8
  62. data/lib/itms_automation/all_steps.rb +0 -8
  63. data/lib/itms_automation/assertion_helper.rb +0 -29
  64. data/lib/itms_automation/auto_util.rb +0 -702
  65. data/lib/itms_automation/database_steps_helper.rb +0 -125
  66. data/lib/itms_automation/web_steps_helper.rb +0 -844
  67. data/project/Gemfile +0 -3
  68. data/project/Gemfile.lock +0 -92
  69. data/project/README.md +0 -34
  70. data/project/Rakefile +0 -24
  71. data/project/config/chrome_headless_options.yaml +0 -1
  72. data/project/config/chrome_options.yaml +0 -6
  73. data/project/config/firefox_headless_options.yaml +0 -1
  74. data/project/config/firefox_options.yaml +0 -1
  75. data/project/config/ie_options.yaml +0 -1
  76. data/project/config/remote_options.yaml +0 -6
  77. data/project/config/safari_options.yaml +0 -1
  78. data/project/cucumber.yml +0 -4
  79. data/project/features/TestSuite/WebGUI.feature +0 -5
  80. data/project/features/step_definitions/lib_steps/steps_definition.rb +0 -46
  81. data/project/features/step_definitions/repositories/project_object.yml +0 -26
  82. data/project/features/support/env.rb +0 -9
  83. data/project/features/support/hooks.rb +0 -128
@@ -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,128 +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
- end
16
-
17
- def validate_params_exist
18
- raise "❌ ERROR: Missing param SERVER_URL." if ENV['SERVER_URL'].nil?
19
- raise "❌ ERROR: Missing param BROWSER." if ENV['BROWSER'].nil?
20
- if ENV['REPORT']
21
- raise "❌ ERROR: Missing param TESTSUITE." if ENV['TESTSUITE'].nil?
22
- raise "❌ ERROR: Missing param TESTCASE_REPORT_NAME." if ENV['TESTCASE_REPORT_NAME'].nil?
23
- $report_path = "Reports/#{ENV['TESTSUITE']}"
24
- $testcase_report_name = ENV['TESTCASE_REPORT_NAME']
25
- end
26
- end
27
-
28
- def getDriver
29
- case ENV['BROWSER']
30
- when "chrome"
31
- @chrome_options = loadYAMLfile('config/chrome_options.yaml')
32
- Capybara.register_driver :selenium do |app|
33
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'],:desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: @chrome_options))
34
- end
35
- Capybara.current_driver = :selenium
36
- when "firefox"
37
- @firefox_options = loadYAMLfile('config/firefox_options.yaml')
38
- Capybara.register_driver :selenium do |app|
39
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.firefox(firefoxOptions: @firefox_options))
40
- end
41
- Capybara.current_driver = :selenium
42
- when "safari"
43
- @safari_options = loadYAMLfile('config/safari_options.yaml')
44
- Capybara.register_driver :selenium do |app|
45
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.safari(safariOptions: @safari_options))
46
- end
47
- Capybara.current_driver = :selenium
48
- when "ie"
49
- @ie_options = loadYAMLfile('config/ie_options.yaml')
50
- Capybara.register_driver :selenium do |app|
51
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.internet_explorer(ieOptions: @ie_options))
52
- end
53
- Capybara.current_driver = :selenium
54
- when "chrome_headless"
55
- @chrome_headless_options = loadYAMLfile('config/chrome_headless_options.yaml')
56
- Capybara.register_driver :selenium do |app|
57
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => Selenium::WebDriver::Remote::Capabilities.chrome(chromeOptions: @chrome_headless_options))
58
- end
59
- Capybara.current_driver = :selenium
60
- when "remote"
61
- @capabilities = loadYAMLfile('config/remote_options.yaml')
62
- Capybara.register_driver :selenium do |app|
63
- Capybara::Selenium::Driver.new(app, :url => ENV['SERVER_URL'], :desired_capabilities => @capabilities)
64
- end
65
- Capybara.current_driver = :selenium
66
- else
67
- raise "❌ ERROR: Unsupported browser: #{ENV['BROWSER']}. Available: chrome || chrome headless || firefox || safari || ie || remote"
68
- end
69
- unless ENV["SCREEN_RESOLUTION"].nil?
70
- screen_resolution = ENV["SCREEN_RESOLUTION"].split("x")
71
- Capybara.page.current_window.resize_to(screen_resolution[0], screen_resolution[1])
72
- end
73
- end
74
-
75
- def loadYAMLfile(filename)
76
- begin
77
- return YAML.load_file(filename)
78
- rescue Psych::SyntaxError => ex
79
- raise "❌ SyntaxError when reading file: #{ex}"
80
- end
81
- end
82
-
83
- After do |scenario|
84
- # save_screenshot = ENV['SCREENSHOT'] || false
85
- # if save_screenshot == true
86
- # file_name = 'failed_%s.png' % rand(1000).to_s
87
- # page.save_screenshot($screenshot+file_name) if scenario.failed?
88
- # begin
89
- # Capybara.page.driver.quit
90
- # Capybara.send(:session_pool).delete_if { |key, value| key =~ /selenium/i }
91
- # rescue StandardError => myStandardError
92
- # puts "❌ Error: #{myStandardError}"
93
- # exit(1)
94
- # end
95
- # end
96
- # $browser_data = page.driver.browser.capabilities
97
- # p "$browser_data:#{$browser_data.inspect}"
98
- FileUtils.rm_rf(Dir.glob('downloads/*'))
99
- end
100
-
101
- at_exit do
102
- if ENV['REPORT']
103
- begin
104
- # validateReport
105
- time = Time.now.getutc
106
- if $browser_data
107
- browser_name = $browser_data[:browser_name]
108
- browser_version = $browser_data[:browser_version]
109
- platform = $browser_data[:platform_name]
110
- end
111
- ReportBuilder.configure do |config|
112
- config.report_path = "#{$report_path}/#{$testcase_report_name}"
113
- config.input_path = "#{$report_path}/#{$testcase_report_name}.json"
114
- config.report_types = [:json, :html]
115
- config.color = 'blue'
116
- config.additional_info = {
117
- 'Browser' => browser_name || nil,
118
- 'Platform' => platform || nil,
119
- 'Browser Version' => browser_version || nil,
120
- 'Report Generated' => time
121
- }
122
- end
123
- options = { report_title: "iTMS - Test Management System" }
124
- ReportBuilder.build_report options
125
- rescue NoMethodError
126
- end
127
- end
128
- end