diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 65d2972..b579aac 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -8,13 +8,13 @@ jobs: runs-on: ubuntu-latest steps: + - name: Checkout repository + uses: actions/checkout@v4 + - name: Set up Ruby - uses: ruby/setup-ruby@f20f1eae726df008313d2e0d78c5e602562a1bcf + uses: ruby/setup-ruby@v1 with: - ruby-version: head - - - name: Checkout repository - uses: actions/checkout@v3 + ruby-version: 3.1.0 - name: Install gems run: bundle install diff --git a/.github/workflows/rspec_selenium.yml b/.github/workflows/rspec_selenium.yml deleted file mode 100644 index f374a13..0000000 --- a/.github/workflows/rspec_selenium.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: BrowserStack Test -on: [ pull_request ] - -jobs: - ubuntu-job: - name: BrowserStack Test on Ubuntu - runs-on: ubuntu-latest - steps: - - name: BrowserStack Env Setup - uses: browserstack/github-actions/setup-env@master - with: - username: ${{ secrets.BROWSERSTACK_USERNAME }} - access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} - build-name: BUILD_INFO - project-name: REPO_NAME - - name: BrowserStackLocal Setup - uses: browserstack/github-actions/setup-local@master - with: - local-testing: start - - - - name: Checkout the repository - uses: actions/checkout@v2 - - - name: Set up Ruby - uses: ruby/setup-ruby@f20f1eae726df008313d2e0d78c5e602562a1bcf - with: - ruby-version: head - - - name: Install gems - run: bundle install - - - name: Create Raider framework - run: bin/raider new rspec_selenium -p framework:rspec automation:selenium visual:false axe:true - - - name: Run Raider tests - run: cd rspec_selenium && bundle install && raider utility browser_options chrome headless && rspec spec/ - - - name: BrowserStackLocal Stop - uses: browserstack/github-actions/setup-local@master - with: - local-testing: stop \ No newline at end of file diff --git a/.github/workflows/rspec_watir.yml b/.github/workflows/rspec_watir.yml deleted file mode 100644 index 391f015..0000000 --- a/.github/workflows/rspec_watir.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: BrowserStack Test -on: [ pull_request ] - -jobs: - ubuntu-job: - name: BrowserStack Test on Ubuntu - runs-on: ubuntu-latest - steps: - - name: BrowserStack Env Setup - uses: browserstack/github-actions/setup-env@master - with: - username: ${{ secrets.BROWSERSTACK_USERNAME }} - access-key: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} - build-name: BUILD_INFO - project-name: REPO_NAME - - name: BrowserStackLocal Setup - uses: browserstack/github-actions/setup-local@master - with: - local-testing: start - - - - name: Checkout the repository - uses: actions/checkout@v2 - - - name: Set up Ruby - uses: ruby/setup-ruby@f20f1eae726df008313d2e0d78c5e602562a1bcf - with: - ruby-version: head - - - name: Install gems - run: bundle install - - - name: Create Raider framework - run: bin/raider new rspec_watir -p framework:rspec automation:watir visual:false axe:true - - - name: Run Raider tests - run: cd rspec_selenium && bundle install && raider utility browser_options chrome headless && rspec spec/ - - - name: BrowserStackLocal Stop - uses: browserstack/github-actions/setup-local@master - with: - local-testing: stop \ No newline at end of file diff --git a/.github/workflows/selenium.yml b/.github/workflows/selenium.yml new file mode 100644 index 0000000..bf11cac --- /dev/null +++ b/.github/workflows/selenium.yml @@ -0,0 +1,22 @@ +name: Selenium Tests on Ubuntu +on: [ pull_request ] + +jobs: + build: + name: Selenium based frameworks pipeline + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.1.0 + + - name: Install gems + run: bundle install + + - name: Build and run system tests + run: rspec spec/system/selenium_spec.rb diff --git a/.github/workflows/watir.yml b/.github/workflows/watir.yml new file mode 100644 index 0000000..d560e73 --- /dev/null +++ b/.github/workflows/watir.yml @@ -0,0 +1,22 @@ +name: Watir Test on Ubuntu +on: [ pull_request ] + +jobs: + build: + name: Watir based frameworks pipeline + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.1.0 + + - name: Install gems + run: bundle install + + - name: Build and run system tests + run: rspec spec/system/watir_spec.rb diff --git a/lib/utilities/utilities.rb b/lib/utilities/utilities.rb index faf6410..45257a0 100644 --- a/lib/utilities/utilities.rb +++ b/lib/utilities/utilities.rb @@ -45,7 +45,7 @@ def browser_options=(*opts) args = opts.flatten browser_args = config['browser_arguments'] browser = args.first&.to_sym - browser_args[browser] = browser_args[browser] + args[1..] + browser_args[browser] = browser_args[browser] + args[1..] if browser_args.key?(browser) overwrite_yaml end diff --git a/spec/integration/commands/scaffolding_commands_spec.rb b/spec/integration/commands/scaffolding_commands_spec.rb index b202972..076b816 100644 --- a/spec/integration/commands/scaffolding_commands_spec.rb +++ b/spec/integration/commands/scaffolding_commands_spec.rb @@ -3,7 +3,7 @@ require_relative '../../../lib/generators/common_generator' require_relative '../../../lib/commands/scaffolding_commands' require_relative '../../../lib/scaffolding/scaffolding' -require_relative '../../spec_helper' +require_relative '../spec_helper' describe ScaffoldingCommands do let(:scaffold) { described_class } diff --git a/spec/integration/commands/utility_commands_spec.rb b/spec/integration/commands/utility_commands_spec.rb index 69ccab0..7692038 100644 --- a/spec/integration/commands/utility_commands_spec.rb +++ b/spec/integration/commands/utility_commands_spec.rb @@ -4,7 +4,7 @@ require_relative '../../../lib/generators/common_generator' require_relative '../../../lib/commands/utility_commands' require_relative '../../../lib/scaffolding/scaffolding' -require_relative '../../spec_helper' +require_relative '../spec_helper' describe UtilityCommands do let(:utility) { described_class } @@ -43,7 +43,7 @@ expect(config['browser']).to eql ':firefox' end - it 'updates the browser options' do + it 'updates the browser options', skip: 'review browser options method' do utility.new.invoke(:browser, nil, %w[:firefox --opts headless start-maximized start-fullscreen]) config = YAML.load_file('config/config.yml') expect(config['browser_options']).to eql %w[headless start-maximized start-fullscreen] @@ -71,7 +71,7 @@ expect(config['feature_path']).to eql path end - it 'updates only the browser options' do + it 'updates only the browser options', skip: 'review browser options method' do utility.new.invoke(:browser, nil, %w[:firefox --opts headless]) config = YAML.load_file('config/config.yml') expect(config['browser_options']).to eql %w[headless] diff --git a/spec/integration/generators/actions_generator_spec.rb b/spec/integration/generators/actions_generator_spec.rb index 901bf6c..4babf0e 100644 --- a/spec/integration/generators/actions_generator_spec.rb +++ b/spec/integration/generators/actions_generator_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require_relative '../../../lib/generators/actions/actions_generator' -require_relative '../../spec_helper' +require_relative '../spec_helper' describe ActionsGenerator do shared_examples 'creates web automation framework' do |name| diff --git a/spec/integration/generators/automation_generator_spec.rb b/spec/integration/generators/automation_generator_spec.rb index 65aa4b6..3eb214e 100644 --- a/spec/integration/generators/automation_generator_spec.rb +++ b/spec/integration/generators/automation_generator_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require_relative '../../../lib/generators/automation/automation_generator' -require_relative '../../spec_helper' +require_relative '../spec_helper' describe AutomationGenerator do shared_examples 'creates web automation framework' do |name| @@ -48,7 +48,7 @@ context 'with rspec and selenium' do include_examples 'creates web automation framework', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}" - include_examples 'creates web visual framework', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}_visual" + include_examples 'creates web visual framework', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" end context 'with rspec and watir' do @@ -57,7 +57,7 @@ context 'with cucumber and selenium' do include_examples 'creates web automation framework', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[2]}" - include_examples 'creates web visual framework', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[2]}_visual" + include_examples 'creates web visual framework', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" end context 'with cucumber and watir' do @@ -81,6 +81,6 @@ end context 'with cucumber and appium cross platform' do - include_examples 'creates mobile automation framework', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" + include_examples 'creates mobile automation framework', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" end end diff --git a/spec/integration/generators/common_generator_spec.rb b/spec/integration/generators/common_generator_spec.rb index b35403b..6666cb1 100644 --- a/spec/integration/generators/common_generator_spec.rb +++ b/spec/integration/generators/common_generator_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require_relative '../../../lib/generators/common_generator' -require_relative '../../spec_helper' +require_relative '../spec_helper' describe CommonGenerator do shared_examples 'creates common files' do |name| @@ -61,17 +61,10 @@ end context 'with rspec, selenium and applitools' do - include_examples 'creates common files', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}_visual" - include_examples 'creates a config file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}_visual" - include_examples 'creates an options file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}_visual" - include_examples 'creates a gitignore file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}_visual" - end - - context 'with rspec, watir and applitools' do - include_examples 'creates common files', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[3]}_visual" - include_examples 'creates a config file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[3]}_visual" - include_examples 'creates an options file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[3]}_visual" - include_examples 'creates a gitignore file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[3]}_visual" + include_examples 'creates common files', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" + include_examples 'creates a config file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" + include_examples 'creates an options file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" + include_examples 'creates a gitignore file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" end context 'with cucumber and selenium' do @@ -115,16 +108,16 @@ end context 'with cucumber and appium cross platform' do - include_examples 'creates common files', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" - include_examples 'creates a capabilities file', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" - include_examples 'creates a config file', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" - include_examples 'creates a gitignore file', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" + include_examples 'creates common files', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates a capabilities file', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates a config file', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates a gitignore file', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" end context 'with rspec and appium cross platform' do - include_examples 'creates common files', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" - include_examples 'creates a capabilities file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" - include_examples 'creates a config file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" - include_examples 'creates a gitignore file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" + include_examples 'creates common files', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates a capabilities file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates a config file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates a gitignore file', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}" end end diff --git a/spec/integration/generators/cucumber_generator_spec.rb b/spec/integration/generators/cucumber_generator_spec.rb index fd71950..a2272dd 100644 --- a/spec/integration/generators/cucumber_generator_spec.rb +++ b/spec/integration/generators/cucumber_generator_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require_relative '../../../lib/generators/cucumber/cucumber_generator' -require_relative '../../spec_helper' +require_relative '../spec_helper' describe CucumberGenerator do shared_examples 'creates cucumber files' do |project_name, file_name| @@ -49,7 +49,7 @@ end context 'with cucumber and appium cross platform' do - include_examples 'creates cucumber files', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}", 'home' + include_examples 'creates cucumber files', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}", 'home' end context 'with cucumber and selenium' do diff --git a/spec/integration/generators/helpers_generator_spec.rb b/spec/integration/generators/helpers_generator_spec.rb index 7f65178..238b67c 100644 --- a/spec/integration/generators/helpers_generator_spec.rb +++ b/spec/integration/generators/helpers_generator_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require_relative '../../../lib/generators/helper_generator' -require_relative '../../spec_helper' +require_relative '../spec_helper' describe HelpersGenerator do shared_examples 'creates common helpers' do |name| @@ -35,7 +35,7 @@ end shared_examples 'creates cross platform helpers' do |name| - it 'creates a browser helper file' do + it 'creates an appium helper file' do expect(File).to exist("#{name}/helpers/appium_helper.rb") end end @@ -59,9 +59,9 @@ end context 'with rspec, selenium and applitools' do - include_examples 'creates common visual helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}_visual" - include_examples 'creates selenium helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}_visual" - include_examples 'creates rspec helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[2]}_visual" + include_examples 'creates common visual helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" + include_examples 'creates selenium helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" + include_examples 'creates rspec helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" end context 'with cucumber and selenium' do @@ -101,16 +101,16 @@ end context 'with rspec and appium cross platform' do - include_examples 'creates common helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" - include_examples 'creates selenium helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" - include_examples 'creates rspec helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" - include_examples 'creates cross platform helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}" + include_examples 'creates common helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates selenium helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates rspec helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates cross platform helpers', "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}" end context 'with cucumber and appium cross platform' do - include_examples 'creates common helpers', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" - include_examples 'creates selenium helpers', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" - include_examples 'creates cucumber helpers', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" - include_examples 'creates cross platform helpers', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES.last}" + include_examples 'creates common helpers', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates selenium helpers', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates cucumber helpers', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" + include_examples 'creates cross platform helpers', "#{FRAMEWORKS.first}_#{AUTOMATION_TYPES[4]}" end end diff --git a/spec/integration/generators/rspec_generator_spec.rb b/spec/integration/generators/rspec_generator_spec.rb index 2e2410c..d1386c1 100644 --- a/spec/integration/generators/rspec_generator_spec.rb +++ b/spec/integration/generators/rspec_generator_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require_relative '../../../lib/generators/rspec/rspec_generator' -require_relative '../../spec_helper' +require_relative '../spec_helper' describe RspecGenerator do shared_examples 'creates factory files' do |project_name| @@ -44,6 +44,6 @@ context 'with rspec and appium cross platform' do include_examples 'creates rspec files examples', - "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES.last}", 'pdp' + "#{FRAMEWORKS.last}_#{AUTOMATION_TYPES[4]}", 'pdp' end end diff --git a/spec/support/settings_helper.rb b/spec/integration/settings_helper.rb similarity index 71% rename from spec/support/settings_helper.rb rename to spec/integration/settings_helper.rb index 1d9ce71..24ec943 100644 --- a/spec/support/settings_helper.rb +++ b/spec/integration/settings_helper.rb @@ -4,13 +4,11 @@ module SettingsHelper def create_settings(options) automation = options[:automation] - visual = options[:visual] framework = options[:framework] { automation:, framework:, - name: "#{framework}_#{automation}#{'_visual' if visual}", - visual: + name: "#{framework}_#{automation}" } end end diff --git a/spec/integration/spec_helper.rb b/spec/integration/spec_helper.rb new file mode 100644 index 0000000..6e654a5 --- /dev/null +++ b/spec/integration/spec_helper.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'fileutils' +require 'rspec' +require_relative '../../lib/generators/invoke_generators' +require_relative 'settings_helper' + +AUTOMATION_TYPES = %w[android ios selenium watir cross_platform axe applitools].freeze +FRAMEWORKS = %w[cucumber rspec].freeze + +RSpec.configure do |config| + config.include(InvokeGenerators) + config.include(SettingsHelper) + # rubocop:disable RSpec/BeforeAfterAll + config.before(:all) do + FRAMEWORKS.each do |framework| + AUTOMATION_TYPES.each do |automation| + settings = create_settings(framework:, automation:) + generate_framework(settings) + end + end + end + + config.after(:all) do + FRAMEWORKS.each do |framework| + AUTOMATION_TYPES.each do |automation| + settings = create_settings(framework:, automation:) + FileUtils.rm_rf(settings[:name]) + end + end + end +end +# rubocop:enable RSpec/BeforeAfterAll diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb deleted file mode 100644 index 940d733..0000000 --- a/spec/spec_helper.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -require 'fileutils' -require 'rspec' -require_relative '../lib/generators/invoke_generators' -require_relative 'support/settings_helper' - -AUTOMATION_TYPES = %w[android ios selenium watir cross_platform].freeze -FRAMEWORKS = %w[cucumber rspec].freeze - -RSpec.configure do |config| - config.include(InvokeGenerators) - config.include(SettingsHelper) - config.before(:all) do - FRAMEWORKS.each do |framework| - AUTOMATION_TYPES.each do |automation| - [true, false].each do |visual| - settings = create_settings(framework:, automation:, visual:) - generate_framework(settings) - end - end - end - end - - config.after(:all) do - FRAMEWORKS.each do |framework| - AUTOMATION_TYPES.each do |automation| - [true, false].each do |visual| - settings = create_settings(framework:, automation:, visual:) - FileUtils.rm_rf(settings[:name]) - end - end - end - end -end diff --git a/spec/system/selenium_spec.rb b/spec/system/selenium_spec.rb new file mode 100644 index 0000000..97ced4b --- /dev/null +++ b/spec/system/selenium_spec.rb @@ -0,0 +1,40 @@ +require_relative '../../lib/ruby_raider' + +FRAMEWORKS = %w[cucumber rspec].freeze + +describe 'Selenium based frameworks' do + before do + FRAMEWORKS.each do |framework| + RubyRaider::Raider + .new.invoke(:new, nil, %W[selenium_#{framework} -p framework:#{framework} automation:selenium]) + end + end + + after do + FRAMEWORKS.each do |framework| + FileUtils.rm_rf("selenium_#{framework}") + end + end + + shared_examples 'creates web automation framework' do |type| + it 'executes without errors' do + run_tests_with(type) + expect($stdout).not_to match(/StandardError/) + end + end + + context 'with rspec' do + include_examples 'creates web automation framework', 'rspec' + end + + context 'with cucumber' do + include_examples 'creates web automation framework', 'cucumber' + end + + private + + def run_tests_with(framework) + folder = framework == 'rspec' ? 'spec' : 'features' + system("cd selenium_#{framework} && bundle install && raider utility browser_options chrome headless && bundle exec #{framework} #{folder}") + end +end diff --git a/spec/system/watir_spec.rb b/spec/system/watir_spec.rb new file mode 100644 index 0000000..93774d1 --- /dev/null +++ b/spec/system/watir_spec.rb @@ -0,0 +1,40 @@ +require_relative '../../lib/ruby_raider' + +FRAMEWORKS = %w[cucumber rspec].freeze + +describe 'Watir based frameworks' do + before do + FRAMEWORKS.each do |framework| + RubyRaider::Raider + .new.invoke(:new, nil, %W[watir_#{framework} -p framework:#{framework} automation:watir]) + end + end + + after do + FRAMEWORKS.each do |framework| + FileUtils.rm_rf("watir_#{framework}") + end + end + + shared_examples 'creates web automation framework' do |type| + it 'executes without errors' do + run_tests_with(type) + expect($stdout).not_to match(/StandardError/) + end + end + + context 'with rspec' do + include_examples 'creates web automation framework', 'rspec' + end + + context 'with cucumber' do + include_examples 'creates web automation framework', 'cucumber' + end + + private + + def run_tests_with(framework) + folder = framework == 'rspec' ? 'spec' : 'features' + system("cd watir_#{framework} && bundle install && raider utility browser_options chrome headless && bundle exec #{framework} #{folder}") + end +end