solidus_dev_support 1.5.0 → 2.2.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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +10 -17
  3. data/.mergify.yml +2 -0
  4. data/.rubocop.yml +42 -0
  5. data/CHANGELOG.md +72 -0
  6. data/Gemfile +1 -1
  7. data/README.md +13 -4
  8. data/Rakefile +13 -1
  9. data/lib/solidus_dev_support/extension.rb +32 -23
  10. data/lib/solidus_dev_support/rake_tasks.rb +14 -0
  11. data/lib/solidus_dev_support/rspec/capybara.rb +20 -0
  12. data/lib/solidus_dev_support/rspec/feature_helper.rb +17 -18
  13. data/lib/solidus_dev_support/rspec/rails_helper.rb +8 -5
  14. data/lib/solidus_dev_support/rubocop/config.yml +82 -203
  15. data/lib/solidus_dev_support/solidus_command.rb +8 -1
  16. data/lib/solidus_dev_support/templates/extension/.circleci/config.yml +6 -0
  17. data/lib/solidus_dev_support/templates/extension/.github/stale.yml +4 -4
  18. data/lib/solidus_dev_support/templates/extension/CHANGELOG.md +1 -0
  19. data/lib/solidus_dev_support/templates/extension/README.md +18 -10
  20. data/lib/solidus_dev_support/templates/extension/bin/rails-sandbox +1 -1
  21. data/lib/solidus_dev_support/templates/extension/bin/sandbox.tt +2 -0
  22. data/lib/solidus_dev_support/templates/extension/extension.gemspec.tt +4 -4
  23. data/lib/solidus_dev_support/templates/extension/github_changelog_generator +2 -0
  24. data/lib/solidus_dev_support/templates/extension/lib/%file_name%.rb.tt +1 -0
  25. data/lib/solidus_dev_support/templates/extension/lib/%file_name%/configuration.rb.tt +21 -0
  26. data/lib/solidus_dev_support/templates/extension/lib/%file_name%/{factories.rb.tt → testing_support/factories.rb.tt} +0 -0
  27. data/lib/solidus_dev_support/templates/extension/lib/generators/%file_name%/install/install_generator.rb.tt +10 -5
  28. data/lib/solidus_dev_support/templates/extension/lib/generators/%file_name%/install/templates/initializer.rb.tt +6 -0
  29. data/lib/solidus_dev_support/templates/extension/rubocop.yml +3 -0
  30. data/lib/solidus_dev_support/templates/extension/spec/spec_helper.rb.tt +11 -7
  31. data/lib/solidus_dev_support/version.rb +5 -1
  32. data/solidus_dev_support.gemspec +16 -14
  33. data/spec/features/create_extension_spec.rb +187 -0
  34. data/spec/lib/extension_spec.rb +69 -0
  35. data/spec/spec_helper.rb +16 -0
  36. metadata +47 -35
@@ -67,14 +67,17 @@ RSpec.configure do |config|
67
67
  rescue NameError => e
68
68
  class ZeitwerkNameError < NameError; end
69
69
 
70
- message = <<~WARN
71
- Zeitwerk raised the following error when trying to eager load your extension:
72
-
73
- #{if e.message =~ /expected file .*? to define constant [\w:]+/
70
+ error_message =
71
+ if e.message =~ /expected file .*? to define constant [\w:]+/
74
72
  e.message.sub(/expected file #{Regexp.escape(File.expand_path('../..', Rails.root))}./, "expected file ")
75
73
  else
76
74
  e.message
77
- end}
75
+ end
76
+
77
+ message = <<~WARN
78
+ Zeitwerk raised the following error when trying to eager load your extension:
79
+
80
+ #{error_message}
78
81
 
79
82
  This most likely means that your extension's file structure is not
80
83
  compatible with the Zeitwerk autoloader.
@@ -1,203 +1,82 @@
1
- # Relaxed.Ruby.Style
2
- ## Version 2.4
3
-
4
- Style/Alias:
5
- Enabled: false
6
- StyleGuide: https://relaxed.ruby.style/#stylealias
7
-
8
- Style/AsciiComments:
9
- Enabled: false
10
- StyleGuide: https://relaxed.ruby.style/#styleasciicomments
11
-
12
- Style/BeginBlock:
13
- Enabled: false
14
- StyleGuide: https://relaxed.ruby.style/#stylebeginblock
15
-
16
- Style/BlockDelimiters:
17
- Enabled: false
18
- StyleGuide: https://relaxed.ruby.style/#styleblockdelimiters
19
-
20
- Style/CommentAnnotation:
21
- Enabled: false
22
- StyleGuide: https://relaxed.ruby.style/#stylecommentannotation
23
-
24
- Style/Documentation:
25
- Enabled: false
26
- StyleGuide: https://relaxed.ruby.style/#styledocumentation
27
-
28
- Layout/DotPosition:
29
- Enabled: false
30
- StyleGuide: https://relaxed.ruby.style/#layoutdotposition
31
-
32
- Style/DoubleNegation:
33
- Enabled: false
34
- StyleGuide: https://relaxed.ruby.style/#styledoublenegation
35
-
36
- Style/EndBlock:
37
- Enabled: false
38
- StyleGuide: https://relaxed.ruby.style/#styleendblock
39
-
40
- Style/FormatString:
41
- Enabled: false
42
- StyleGuide: https://relaxed.ruby.style/#styleformatstring
43
-
44
- Style/IfUnlessModifier:
45
- Enabled: false
46
- StyleGuide: https://relaxed.ruby.style/#styleifunlessmodifier
47
-
48
- Style/Lambda:
49
- Enabled: false
50
- StyleGuide: https://relaxed.ruby.style/#stylelambda
51
-
52
- Style/ModuleFunction:
53
- Enabled: false
54
- StyleGuide: https://relaxed.ruby.style/#stylemodulefunction
55
-
56
- Style/MultilineBlockChain:
57
- Enabled: false
58
- StyleGuide: https://relaxed.ruby.style/#stylemultilineblockchain
59
-
60
- Style/NegatedIf:
61
- Enabled: false
62
- StyleGuide: https://relaxed.ruby.style/#stylenegatedif
63
-
64
- Style/NegatedWhile:
65
- Enabled: false
66
- StyleGuide: https://relaxed.ruby.style/#stylenegatedwhile
67
-
68
- Style/NumericPredicate:
69
- Enabled: false
70
- StyleGuide: https://relaxed.ruby.style/#stylenumericpredicate
71
-
72
- Style/ParallelAssignment:
73
- Enabled: false
74
- StyleGuide: https://relaxed.ruby.style/#styleparallelassignment
75
-
76
- Style/PercentLiteralDelimiters:
77
- Enabled: false
78
- StyleGuide: https://relaxed.ruby.style/#stylepercentliteraldelimiters
79
-
80
- Style/PerlBackrefs:
81
- Enabled: false
82
- StyleGuide: https://relaxed.ruby.style/#styleperlbackrefs
83
-
84
- Style/Semicolon:
85
- Enabled: false
86
- StyleGuide: https://relaxed.ruby.style/#stylesemicolon
87
-
88
- Style/SignalException:
89
- Enabled: false
90
- StyleGuide: https://relaxed.ruby.style/#stylesignalexception
91
-
92
- Style/SingleLineBlockParams:
93
- Enabled: false
94
- StyleGuide: https://relaxed.ruby.style/#stylesinglelineblockparams
95
-
96
- Style/SingleLineMethods:
97
- Enabled: false
98
- StyleGuide: https://relaxed.ruby.style/#stylesinglelinemethods
99
-
100
- Layout/SpaceBeforeBlockBraces:
101
- Enabled: false
102
- StyleGuide: https://relaxed.ruby.style/#layoutspacebeforeblockbraces
103
-
104
- Layout/SpaceInsideParens:
105
- Enabled: false
106
- StyleGuide: https://relaxed.ruby.style/#layoutspaceinsideparens
107
-
108
- Style/SpecialGlobalVars:
109
- Enabled: false
110
- StyleGuide: https://relaxed.ruby.style/#stylespecialglobalvars
111
-
112
- Style/StringLiterals:
113
- Enabled: false
114
- StyleGuide: https://relaxed.ruby.style/#stylestringliterals
115
-
116
- Style/TrailingCommaInArguments:
117
- Enabled: false
118
- StyleGuide: https://relaxed.ruby.style/#styletrailingcommainarguments
119
-
120
- Style/TrailingCommaInArrayLiteral:
121
- Enabled: false
122
- StyleGuide: https://relaxed.ruby.style/#styletrailingcommainarrayliteral
123
-
124
- Style/TrailingCommaInHashLiteral:
125
- Enabled: false
126
- StyleGuide: https://relaxed.ruby.style/#styletrailingcommainhashliteral
127
-
128
- Style/SymbolArray:
129
- Enabled: false
130
- StyleGuide: http://relaxed.ruby.style/#stylesymbolarray
131
-
132
- Style/WhileUntilModifier:
133
- Enabled: false
134
- StyleGuide: https://relaxed.ruby.style/#stylewhileuntilmodifier
135
-
136
- Style/WordArray:
137
- Enabled: false
138
- StyleGuide: https://relaxed.ruby.style/#stylewordarray
139
-
140
- Lint/AmbiguousRegexpLiteral:
141
- Enabled: false
142
- StyleGuide: https://relaxed.ruby.style/#lintambiguousregexpliteral
143
-
144
- Lint/AssignmentInCondition:
145
- Enabled: false
146
- StyleGuide: https://relaxed.ruby.style/#lintassignmentincondition
147
-
148
- Metrics/AbcSize:
149
- Enabled: false
150
-
151
- Metrics/BlockNesting:
152
- Enabled: false
153
-
154
- Metrics/ClassLength:
155
- Enabled: false
156
-
157
- Metrics/ModuleLength:
158
- Enabled: false
159
-
160
- Metrics/CyclomaticComplexity:
161
- Enabled: false
162
-
163
- # Metrics/LineLength:
164
- # Enabled: false
165
-
166
- Metrics/MethodLength:
167
- Enabled: false
168
-
169
- Metrics/ParameterLists:
170
- Enabled: false
171
-
172
- Metrics/PerceivedComplexity:
173
- Enabled: false
174
-
175
- # Our overrides after this point:
176
-
177
- require:
178
- - rubocop-rspec
179
- - rubocop-rails
180
- - rubocop-performance
181
-
182
- AllCops:
183
- TargetRubyVersion: 2.5
184
- Exclude:
185
- - spec/dummy/**/*
186
- - sandbox/**/*
187
- - vendor/**/*
188
-
189
- Metrics/BlockLength:
190
- Enabled: false
191
-
192
- Metrics/LineLength:
193
- Enabled: true
194
- Max: 100
195
-
196
- RSpec/ExampleLength:
197
- Enabled: false
198
-
199
- Layout/AlignArguments:
200
- EnforcedStyle: with_fixed_indentation
201
-
202
- Layout/MultilineOperationIndentation:
203
- Enabled: false
1
+ require: ["rubocop-rspec", "rubocop-rails", "rubocop-performance"]
2
+
3
+ AllCops: {TargetRubyVersion: 2.5, Exclude: ["spec/dummy/**/*", "sandbox/**/*", "vendor/**/*"]}
4
+
5
+ Layout/ArgumentAlignment: {EnforcedStyle: with_fixed_indentation}
6
+ Layout/DotPosition: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#layoutdotposition"}
7
+ Layout/EmptyLinesAroundAttributeAccessor: {Enabled: true}
8
+ Layout/FirstArgumentIndentation: {EnforcedStyle: "consistent"}
9
+ Layout/FirstArrayElementIndentation: {EnforcedStyle: "consistent"}
10
+ Layout/LineLength: {Enabled: true, Max: 120}
11
+ Layout/MultilineOperationIndentation: {Enabled: false}
12
+ Layout/SpaceAroundMethodCallOperator: {Enabled: true}
13
+ Layout/SpaceBeforeBlockBraces: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#layoutspacebeforeblockbraces"}
14
+ Layout/SpaceInsideParens: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#layoutspaceinsideparens"}
15
+ Lint/AmbiguousRegexpLiteral: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#lintambiguousregexpliteral"}
16
+ Lint/AssignmentInCondition: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#lintassignmentincondition"}
17
+ Lint/DeprecatedOpenSSLConstant: {Enabled: true}
18
+ Lint/MixedRegexpCaptureTypes: {Enabled: true}
19
+ Lint/RaiseException: {Enabled: true}
20
+ Lint/StructNewOverride: {Enabled: true}
21
+ Metrics/AbcSize: {Enabled: false}
22
+ Metrics/BlockLength: {Enabled: false}
23
+ Metrics/BlockNesting: {Enabled: false}
24
+ Metrics/ClassLength: {Enabled: false}
25
+ Metrics/CyclomaticComplexity: {Enabled: false}
26
+ Metrics/MethodLength: {Enabled: false}
27
+ Metrics/ModuleLength: {Enabled: false}
28
+ Metrics/ParameterLists: {Enabled: false}
29
+ Metrics/PerceivedComplexity: {Enabled: false}
30
+ Performance/AncestorsInclude: {Enabled: true}
31
+ Performance/BigDecimalWithNumericArgument: {Enabled: true}
32
+ Performance/RedundantSortBlock: {Enabled: true}
33
+ Performance/RedundantStringChars: {Enabled: true}
34
+ Performance/ReverseFirst: {Enabled: true}
35
+ Performance/SortReverse: {Enabled: true}
36
+ Performance/Squeeze: {Enabled: true}
37
+ Performance/StringInclude: {Enabled: true}
38
+ RSpec/DescribeClass: {Exclude: ["spec/features/**/*"]} # Feature specs are not describing any class or module.
39
+ RSpec/ExampleLength: {Enabled: false}
40
+ Style/AccessorGrouping: {Enabled: true}
41
+ Style/Alias: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylealias"}
42
+ Style/AsciiComments: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styleasciicomments"}
43
+ Style/BeginBlock: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylebeginblock"}
44
+ Style/BisectedAttrAccessor: {Enabled: true}
45
+ Style/BlockDelimiters: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styleblockdelimiters"}
46
+ Style/CommentAnnotation: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylecommentannotation"}
47
+ Style/Documentation: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styledocumentation"}
48
+ Style/DoubleNegation: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styledoublenegation"}
49
+ Style/EndBlock: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styleendblock"}
50
+ Style/ExponentialNotation: {Enabled: true}
51
+ Style/FormatString: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styleformatstring"}
52
+ Style/FrozenStringLiteralComment: {Exclude: ["spec/**/*", "db/migrate/**/*", "bin/**/*"]}
53
+ Style/HashEachMethods: {Enabled: true}
54
+ Style/HashTransformKeys: {Enabled: true}
55
+ Style/HashTransformValues: {Enabled: true}
56
+ Style/IfUnlessModifier: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styleifunlessmodifier"}
57
+ Style/Lambda: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylelambda"}
58
+ Style/ModuleFunction: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylemodulefunction"}
59
+ Style/MultilineBlockChain: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylemultilineblockchain"}
60
+ Style/NegatedIf: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylenegatedif"}
61
+ Style/NegatedWhile: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylenegatedwhile"}
62
+ Style/NumericPredicate: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylenumericpredicate"}
63
+ Style/ParallelAssignment: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styleparallelassignment"}
64
+ Style/PercentLiteralDelimiters: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylepercentliteraldelimiters"}
65
+ Style/PerlBackrefs: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styleperlbackrefs"}
66
+ Style/RedundantAssignment: {Enabled: true}
67
+ Style/RedundantFetchBlock: {Enabled: true}
68
+ Style/RedundantRegexpCharacterClass: {Enabled: true}
69
+ Style/RedundantRegexpEscape: {Enabled: true}
70
+ Style/Semicolon: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylesemicolon"}
71
+ Style/SignalException: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylesignalexception"}
72
+ Style/SingleLineBlockParams: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylesinglelineblockparams"}
73
+ Style/SingleLineMethods: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylesinglelinemethods"}
74
+ Style/SlicingWithRange: {Enabled: true}
75
+ Style/SpecialGlobalVars: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylespecialglobalvars"}
76
+ Style/StringLiterals: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylestringliterals"}
77
+ Style/SymbolArray: {Enabled: false, StyleGuide: "http://relaxed.ruby.style/#stylesymbolarray"}
78
+ Style/TrailingCommaInArguments: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styletrailingcommainarguments"}
79
+ Style/TrailingCommaInArrayLiteral: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styletrailingcommainarrayliteral"}
80
+ Style/TrailingCommaInHashLiteral: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#styletrailingcommainhashliteral"}
81
+ Style/WhileUntilModifier: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylewhileuntilmodifier"}
82
+ Style/WordArray: {Enabled: false, StyleGuide: "https://relaxed.ruby.style/#stylewordarray"}
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'thor'
4
4
  require 'solidus_dev_support/extension'
5
+ require 'spree/core/version'
5
6
 
6
7
  module SolidusDevSupport
7
8
  class SolidusCommand < Thor
@@ -13,9 +14,15 @@ module SolidusDevSupport
13
14
  desc 'e', 'Manage solidus extensions (shortcut for "extension")'
14
15
  subcommand 'e', Extension
15
16
 
17
+ desc 'version', 'Displays solidus_dev_support version'
18
+ def version
19
+ puts "Solidus version #{Spree.solidus_gem_version}"
20
+ puts "Solidus Dev Support version #{SolidusDevSupport::VERSION}"
21
+ end
22
+ map ['-v', '--version'] => :version
23
+
16
24
  def self.exit_on_failure?
17
25
  true
18
26
  end
19
27
  end
20
28
  end
21
-
@@ -16,12 +16,18 @@ jobs:
16
16
  executor: solidusio_extensions/mysql
17
17
  steps:
18
18
  - solidusio_extensions/run-tests
19
+ lint-code:
20
+ executor: solidusio_extensions/sqlite-memory
21
+ steps:
22
+ - solidusio_extensions/lint-code
19
23
 
20
24
  workflows:
21
25
  "Run specs on supported Solidus versions":
22
26
  jobs:
23
27
  - run-specs-with-postgres
24
28
  - run-specs-with-mysql
29
+ - lint-code
30
+
25
31
  "Weekly run specs against master":
26
32
  triggers:
27
33
  - schedule:
@@ -1,17 +1,17 @@
1
1
  # Number of days of inactivity before an issue becomes stale
2
2
  daysUntilStale: 60
3
3
  # Number of days of inactivity before a stale issue is closed
4
- daysUntilClose: 7
4
+ daysUntilClose: false
5
5
  # Issues with these labels will never be considered stale
6
6
  exemptLabels:
7
7
  - pinned
8
8
  - security
9
9
  # Label to use when marking an issue as stale
10
- staleLabel: wontfix
10
+ staleLabel: stale
11
11
  # Comment to post when marking an issue as stale. Set to `false` to disable
12
12
  markComment: >
13
13
  This issue has been automatically marked as stale because it has not had
14
- recent activity. It will be closed if no further activity occurs. Thank you
14
+ recent activity. It might be closed if no further activity occurs. Thank you
15
15
  for your contributions.
16
16
  # Comment to post when closing a stale issue. Set to `false` to disable
17
- closeComment: false
17
+ closeComment: false
@@ -1,6 +1,9 @@
1
- # <%= class_name %>
1
+ # <%= class_name.gsub(/(?<=[^A-Z])([A-Z])/, ' \1') %>
2
2
 
3
- [Explain what your extension does.]
3
+ [![CircleCI](https://circleci.com/gh/<%= repo %>.svg?style=shield)](https://circleci.com/gh/<%= repo %>)
4
+ [![codecov](https://codecov.io/gh/<%= repo %>/branch/master/graph/badge.svg)](https://codecov.io/gh/<%= repo %>)
5
+
6
+ <!-- Explain what your extension does. -->
4
7
 
5
8
  ## Installation
6
9
 
@@ -13,13 +16,12 @@ gem '<%= file_name %>'
13
16
  Bundle your dependencies and run the installation generator:
14
17
 
15
18
  ```shell
16
- bundle
17
- bundle exec rails g <%= file_name %>:install
19
+ bin/rails generate <%= file_name %>:install
18
20
  ```
19
21
 
20
22
  ## Usage
21
23
 
22
- [Explain how to use your extension once it's been installed.]
24
+ <!-- Explain how to use your extension once it's been installed. -->
23
25
 
24
26
  ## Development
25
27
 
@@ -30,7 +32,6 @@ app if it does not exist, then it will run specs. The dummy app can be regenerat
30
32
  `bin/rake extension:test_app`.
31
33
 
32
34
  ```shell
33
- bundle
34
35
  bin/rake
35
36
  ```
36
37
 
@@ -55,7 +56,7 @@ the sandbox app is `./sandbox` and `bin/rails` will forward any Rails commands t
55
56
 
56
57
  Here's an example:
57
58
 
58
- ```shell
59
+ ```
59
60
  $ bin/rails server
60
61
  => Booting Puma
61
62
  => Rails 6.0.2.1 application starting in development
@@ -63,14 +64,21 @@ $ bin/rails server
63
64
  Use Ctrl-C to stop
64
65
  ```
65
66
 
66
- ### Releasing new versions
67
+ ### Updating the changelog
67
68
 
68
- Your new extension version can be released using `gem-release` like this:
69
+ Before and after releases the changelog should be updated to reflect the up-to-date status of
70
+ the project:
69
71
 
70
72
  ```shell
71
- bundle exec gem bump -v VERSION --tag --push --remote upstream && gem release
73
+ bin/rake changelog
74
+ git add CHANGELOG.md
75
+ git commit -m "Update the changelog"
72
76
  ```
73
77
 
78
+ ### Releasing new versions
79
+
80
+ Please refer to the dedicated [page](https://github.com/solidusio/solidus/wiki/How-to-release-extensions) on Solidus wiki.
81
+
74
82
  ## License
75
83
 
76
84
  Copyright (c) <%= Time.now.year %> [name of extension author], released under the New BSD License.
@@ -5,7 +5,7 @@ app_root = 'sandbox'
5
5
  unless File.exist? "#{app_root}/bin/rails"
6
6
  warn 'Creating the sandbox app...'
7
7
  Dir.chdir "#{__dir__}/.." do
8
- system "#{__dir__}/sandbox" or begin # rubocop:disable Style/AndOr
8
+ system "#{__dir__}/sandbox" or begin
9
9
  warn 'Automatic creation of the sandbox app failed'
10
10
  exit 1
11
11
  end