license_finder 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,98 @@
1
+ === 0.8.1 / 2013-04-14
2
+
3
+ * Features
4
+
5
+ * Add spinner to show that the binary is actually doing something.
6
+ * JRuby version of the gem.
7
+ * Official ruby 2.0 support.
8
+ * CLI interface for moving dependencies.* files to `doc/`.
9
+
10
+ * Bugfixes
11
+
12
+ * Fix ruby 1.9.2 support.
13
+
14
+ === 0.8.0 / 2013-04-03
15
+
16
+ * Features
17
+
18
+ * Add spinner to show that the binary is actually doing something.
19
+ * Add action items to dependencies.html.
20
+ * Add generation timestamp to dependencies.html.
21
+ * Default location for dependencies.* files is now `doc/`.
22
+ * Temporarily remove non-bundler (e.g. JavaScript) dependencies. This will
23
+ be readded in a more sustainable way soon.
24
+ * Use sqlite, not YAML, for dependencies.
25
+ * Officially deprecate rake tasks.
26
+
27
+ * Bugfixes
28
+
29
+ * Don't blow away manually set licenses when dependencies are rescanned.
30
+ * Ignore empty `readme_files` section in dependencies.yml.
31
+ * Clean up HTML generation for dependencies.html.
32
+ * Add an option to silence the binary's spinner so as not to fill up log
33
+ files.
34
+
35
+ === 0.7.2 / 2013-02-18
36
+
37
+ * Features
38
+
39
+ * Dependency cleanup.
40
+
41
+ === 0.7.1 / 2013-02-18
42
+
43
+ * Features
44
+
45
+ * Add variants to detectable licenses.
46
+ * Remove README files from data persistence.
47
+
48
+ === 0.7.0 / 2012-09-25
49
+
50
+ * Features
51
+
52
+ * Dependencies can be approved via CLI.
53
+ * Dependencies licenses can be set via CLI.
54
+
55
+ === 0.6.0 / 2012-09-15
56
+
57
+ * Features
58
+
59
+ * Create a dependencies.html containing a nicely formatted version of
60
+ dependencies.txt, with lots of extra information.
61
+ * All rake tasks, and the binary, run the init task automatically.
62
+ * Simplify dependencies.txt file since more detail can now go into
63
+ dependencies.html.
64
+ * Promote binary to be the default, take first steps to deprecate rake task.
65
+
66
+ * Bugfixes
67
+
68
+ * Fix formatting of `rake license:action_items` output.
69
+
70
+ === 0.5.0 / 2012-09-12
71
+
72
+ * Features
73
+
74
+ * `rake license:action_items` exits with a non-zero status if there are
75
+ non-approved dependencies.
76
+ * New binary, eventual replacement for rake tasks.
77
+ * Initial implementation of non-gem dependencies.
78
+ * Support BSD, New BSD, and Simplified BSD licenses.
79
+ * Improve ruby license detection.
80
+ * Add dependency's bundler group to dependencies.txt output.
81
+ * Add description and summary to dependencies.txt output.
82
+
83
+ * Bugfixes
84
+
85
+ * Create `config/` director if it doesn't exist, don't blow up.
86
+ * Better support for non-US word spellings.
87
+
88
+ === 0.4.5 / 2012-09-09
89
+
90
+ * Features
91
+
92
+ * Allow dependencies.* files to be written to a custom directory.
93
+ * Detect LGPL licenses
94
+ * Detect ISC licenses
95
+
96
+ * Bugfixes
97
+
98
+ * Fix blow up if there's not `ignore_groups` setting in the config file.
@@ -28,6 +28,7 @@ end
28
28
 
29
29
  options = {}
30
30
  spinner = SpinnerStrategy::Spin
31
+ skip = false
31
32
 
32
33
  OptionParser.new do |opts|
33
34
  opts.banner = "Usage: license_finder [options] [dependency]"
@@ -43,6 +44,16 @@ OptionParser.new do |opts|
43
44
  opts.on("-q", "--quiet") do
44
45
  spinner = SpinnerStrategy::Noop
45
46
  end
47
+
48
+ opts.on("-m", "--move") do
49
+ skip = true
50
+ `sed '$d' < config/license_finder.yml > tmp34567.txt`
51
+ `mv tmp34567.txt config/license_finder.yml`
52
+ `echo "dependencies_file_dir: './doc/'" >> config/license_finder.yml`
53
+ `mkdir doc`
54
+ `mv dependencies.* doc/`
55
+ puts "Congratulations, you have cleaned up your root directory!'"
56
+ end
46
57
  end.parse!
47
58
 
48
59
  unless options.empty?
@@ -50,5 +61,5 @@ unless options.empty?
50
61
  end
51
62
 
52
63
  spinner.run {
53
- LicenseFinder::CLI.execute! options
54
- }
64
+ LicenseFinder::CLI.execute!(options)
65
+ } unless skip
@@ -4,11 +4,7 @@ Feature: Approving non-whitelisted Dependencies
4
4
  I want to be able to manually approve dependencies that have licenses which fall outside of my whitelist
5
5
 
6
6
  Scenario: Approving a non-whitelisted dependency via the `license_finder` command
7
- Given I have an app with license finder
8
- And my app depends on a gem "gpl_gem" licensed with "GPL"
9
- When I run "license_finder"
10
- Then I should see "gpl_gem" in its output
11
- When I run "license_finder -a gpl_gem"
12
- When I run "license_finder"
13
- Then I should not see "gpl_gem" in its output
14
- Then I should see the "gpl_gem" in the html flagged as "approved"
7
+ Given I have an app with license finder that depends on a GPL licensed gem
8
+ When I approve that gem
9
+ Then I should not see that gem in the console output
10
+ And I should see that gem approved in dependencies.html
@@ -0,0 +1,26 @@
1
+ Feature: License Finder command line executable
2
+ So that I can report and manage my application's dependencies and licenses to my business
3
+ As an application developer
4
+ I want a command-line interface
5
+
6
+ Scenario: Running without a configuration file
7
+ Given I have an app with license finder that has no config directory
8
+ When I run license_finder
9
+ Then it creates a config directory with the license_finder config
10
+
11
+ Scenario: Auditing an application with non-whitelisted licenses
12
+ Given I have an app with license finder that depends on a MIT licensed gem
13
+ When I run license_finder
14
+ Then it should exit with status code 1
15
+ And should list my MIT gem in the output
16
+
17
+ Scenario: Auditing an application with whitelisted licenses
18
+ Given I have an app with license finder that depends on a MIT licensed gem
19
+ When I whitelist MIT and 'other' licenses
20
+ Then it should exit with status code 0
21
+ And I should see all gems approved for use
22
+
23
+ Scenario: Keep manually set license dependencies
24
+ Given I have a project that depends on mime-types with a manual license type
25
+ When I run license_finder
26
+ Then the mime-types license remains set with my manual license type
@@ -7,32 +7,17 @@ Feature: HTML Report
7
7
  Given I have an app with license finder
8
8
 
9
9
  Scenario: Dependency details listed in HTML report
10
- Given my application depends on a gem "mit_licensed_gem" with:
11
- | license | summary | description | version | homepage | bundler_groups |
12
- | MIT | mit is cool | seriously | 0.0.1 | http://mit_licensed_gem.github.com | test |
13
- When I run "license_finder"
14
- And I should see the "mit_licensed_gem" in the html with the following details:
15
- | license | summary | description | name | bundler_groups |
16
- | MIT | mit is cool | seriously | mit_licensed_gem v0.0.1 | test |
17
- And the text "MIT" should link to "http://opensource.org/licenses/mit-license"
18
- And the text "mit_licensed_gem" should link to "http://mit_licensed_gem.github.com"
10
+ And my app depends on a gem with specific details
11
+ When I run license_finder
12
+ Then I should see my specific gem details listed in the html
19
13
 
20
14
  Scenario: Approval status of dependencies indicated in HTML report
21
- Given my app depends on a gem "gpl_licensed_gem" licensed with "GPL"
22
- And my app depends on a gem "mit_licensed_gem" licensed with "MIT"
23
- And I whitelist the "MIT" license
24
- When I run "license_finder"
25
- Then I should see the "gpl_licensed_gem" in the html flagged as "unapproved"
26
- And I should see the "mit_licensed_gem" in the html flagged as "approved"
15
+ And my app depends on MIT and GPL licensed gems
16
+ When I whitelist the MIT license
17
+ Then I should see the GPL gem unapproved in html
18
+ And the MIT gem approved in html
27
19
 
28
20
  Scenario: Dependency summary
29
- Given my app depends on a gem "gpl_licensed_gem" licensed with "GPL"
30
- And my app depends on a gem "mit_licensed_gem" licensed with "MIT"
31
- And I whitelist the following licenses: "MIT, other"
32
- When I run "license_finder"
33
- # rake, bundler, license_finder, my_app, gpl_licensed_gem, mit_licensed_gem
34
- Then I should see "8 total" in the html
35
- # gpl_licensed_gem
36
- And I should see "1 unapproved" in the html
37
- # gpl_licensed_gem
38
- And I should see "1 GPL" in the html
21
+ And my app depends on MIT and GPL licensed gems
22
+ When I whitelist MIT and 'other' licenses
23
+ Then I should see only see GPL liceneses as unapproved in the html
@@ -4,8 +4,7 @@ Feature: Ignore Bundle Groups
4
4
  So that any gems I use in development, or for testing, are automatically approved for use
5
5
 
6
6
  Scenario:
7
- Given I have an app with license finder
8
- And my application depends on a gem "gpl_gem" licensed with "GPL" in the "test" bundler groups
9
- And I whitelist the "test" bundler group
10
- When I run "license_finder"
11
- Then I should not see "gpl_gem" in its output
7
+ Given I have an app with license finder that depends on a GPL licensed gem in the test bundler group
8
+ And I ignore the test group
9
+ When I run license_finder
10
+ Then I should not see the GPL licensed gem in the output
@@ -3,7 +3,7 @@ Feature: The rake task is automatically made available in Rails project
3
3
  As an application developer
4
4
  I want the license_finder rake task automatically loaded for me in a rails project
5
5
 
6
- Scenario: The application is a Rails app
6
+ Scenario: The application is a Rails app #THIS FEATURE SHOULD BE REMOVED FOR 1.0.0 release
7
7
  Given I have a rails app with license finder
8
- When I run "rake license_finder"
9
- Then I should see "Dependencies that need approval:" in its output
8
+ When I run rake license_finder
9
+ Then I should see a normal output
@@ -4,9 +4,6 @@ Feature: Set a dependency's license through a command line interface
4
4
  I want a command line interface to set licenses for specific dependencies
5
5
 
6
6
  Scenario: Setting a license for a dependency
7
- Given I have an app with license finder
8
- And my app depends on a gem "other_license_gem" licensed with "other"
9
- When I run "license_finder"
10
- When I run "license_finder -l MIT other_license_gem"
11
- And I run license_finder again
12
- Then I should see other_license_gem set to MIT license
7
+ Given I have an app with license finder that depends on an other licensed gem
8
+ When I set that gems license to MIT from the command line
9
+ Then I should see that other gems license set to MIT
@@ -0,0 +1,25 @@
1
+ Given(/^I have an app with license finder that depends on a GPL licensed gem$/) do
2
+ @user = ::DSL::User.new
3
+ @user.create_nonrails_app
4
+ @user.add_dependency_to_app "gpl_gem", :license => "GPL"
5
+ end
6
+
7
+ When(/^I approve that gem$/) do
8
+ @output = @user.execute_command "license_finder"
9
+ @output.should include "gpl_gem"
10
+ @output = @user.execute_command "license_finder -a gpl_gem"
11
+ @output = @user.execute_command "license_finder -q"
12
+ end
13
+
14
+ Then(/^I should not see that gem in the console output$/) do
15
+ @output.should_not include "gpl_gem"
16
+ end
17
+
18
+ Then(/^I should see that gem approved in dependencies\.html$/) do
19
+ gem_name = "gpl_gem"
20
+ css_class = "approved"
21
+ html = File.read(@user.dependencies_html_path)
22
+ page = Capybara.string(html)
23
+ gpl_gem = page.find("##{gem_name}")
24
+ gpl_gem[:class].should == css_class
25
+ end
@@ -0,0 +1,45 @@
1
+ Given(/^I have an app with license finder that has no config directory$/) do
2
+ @user = ::DSL::User.new
3
+ @user.create_nonrails_app
4
+ path = @user.app_path('config')
5
+ FileUtils.rm_rf(path)
6
+ File.should_not be_exists(path)
7
+ end
8
+
9
+ Given(/^I have an app with license finder that depends on a MIT licensed gem$/) do
10
+ @user = ::DSL::User.new
11
+ @user.create_nonrails_app
12
+ @user.add_dependency_to_app 'mit_gem', :license => 'MIT'
13
+ end
14
+
15
+ Given(/^I have a project that depends on mime\-types with a manual license type$/) do
16
+ @user = ::DSL::User.new
17
+ @user.create_rails_app
18
+ @user.add_gem_dependency('mime-types')
19
+ @user.bundle_app
20
+ @user.execute_command "license_finder -q"
21
+ @output = @user.execute_command "license_finder -l Ruby mime-types"
22
+ @output.should =~ /mime-types.*Ruby/
23
+ end
24
+
25
+ Then(/^it creates a config directory with the license_finder config$/) do
26
+ File.should be_exists(@user.app_path('config'))
27
+ text = "---\nwhitelist:\n#- MIT\n#- Apache 2.0\nignore_groups:\n#- test\n#- development\ndependencies_file_dir: './doc/'\n"
28
+ File.read(@user.app_path('config/license_finder.yml')).should == text.gsub(/^\s+/, "")
29
+ end
30
+
31
+ Then /^it should exit with status code (\d)$/ do |status|
32
+ $?.exitstatus.should == status.to_i
33
+ end
34
+
35
+ Then(/^should list my MIT gem in the output$/) do
36
+ @output.should include 'mit_gem'
37
+ end
38
+
39
+ Then(/^I should see all gems approved for use$/) do
40
+ @output.should include 'All gems are approved for use'
41
+ end
42
+
43
+ Then(/^the mime\-types license remains set with my manual license type$/) do
44
+ @output.should =~ /mime-types.*Ruby/
45
+ end
@@ -0,0 +1,67 @@
1
+ Given(/^I have an app with license finder$/) do
2
+ @user = ::DSL::User.new
3
+ @user.create_nonrails_app
4
+ end
5
+
6
+ Given(/^my app depends on a gem with specific details$/) do
7
+ @gem_name = "mit_licensed_gem"
8
+ @table = {
9
+ license: "MIT",
10
+ summary: "mit is cool",
11
+ description: "seriously",
12
+ version: "0.0.1",
13
+ homepage: "http://mit_licensed_gem.github.com",
14
+ bundler_groups: "test"
15
+ }
16
+ @user.add_dependency_to_app(@gem_name,
17
+ :license => @table[:license],
18
+ :summary => @table[:summary],
19
+ :description => @table[:description],
20
+ :version => @table[:version],
21
+ :homepage => @table[:homepage],
22
+ :bundler_groups => @table[:bundler_groups]
23
+ )
24
+ end
25
+
26
+ Given(/^my app depends on MIT and GPL licensed gems$/) do
27
+ @user.add_dependency_to_app 'gpl_licensed_gem', :license => "GPL"
28
+ @user.add_dependency_to_app 'mit_licensed_gem', :license => "MIT"
29
+ end
30
+
31
+ When(/^I whitelist the MIT license$/) do
32
+ @user.configure_license_finder_whitelist ["MIT"]
33
+ @user.execute_command "license_finder -q"
34
+ end
35
+
36
+ Then(/^I should see my specific gem details listed in the html$/) do
37
+ html = File.read(@user.dependencies_html_path)
38
+ page = Capybara.string(html)
39
+ section = page.find("##{@gem_name}")
40
+
41
+ @table.first.each do |property_name, property_value|
42
+ section.should have_content property_value
43
+ end
44
+ end
45
+
46
+ Then(/^I should see the GPL gem unapproved in html$/) do
47
+ is_html_status?('gpl_licensed_gem', 'unapproved')
48
+ end
49
+
50
+ Then(/^the MIT gem approved in html$/) do
51
+ is_html_status?('mit_licensed_gem', 'approved')
52
+ end
53
+
54
+ Then(/^I should see only see GPL liceneses as unapproved in the html$/) do
55
+ html = File.read(@user.dependencies_html_path)
56
+ page = Capybara.string(html)
57
+ page.should have_content '8 total'
58
+ page.should have_content '1 unapproved'
59
+ page.should have_content '1 GPL'
60
+ end
61
+
62
+ def is_html_status?(gem, approval)
63
+ html = File.read(@user.dependencies_html_path)
64
+ page = Capybara.string(html)
65
+ gpl_gem = page.find("##{gem}")
66
+ gpl_gem[:class].should == approval
67
+ end
@@ -0,0 +1,13 @@
1
+ Given(/^I have an app with license finder that depends on a GPL licensed gem in the test bundler group$/) do
2
+ @user = ::DSL::User.new
3
+ @user.create_nonrails_app
4
+ @user.add_dependency_to_app 'gpl_gem', :license => 'GPL', :bundler_groups => 'test'
5
+ end
6
+
7
+ And(/^I ignore the test group$/) do
8
+ @user.configure_license_finder_bundler_whitelist('test')
9
+ end
10
+
11
+ Then(/^I should not see the GPL licensed gem in the output$/) do
12
+ @output.should_not include 'gpl_gem'
13
+ end
@@ -0,0 +1,12 @@
1
+ Given /^I have a rails app(?:lication)? with license finder$/ do
2
+ @user = ::DSL::User.new
3
+ @user.create_rails_app
4
+ end
5
+
6
+ When(/^I run rake license_finder$/) do
7
+ @output = @user.execute_command "rake license_finder -q"
8
+ end
9
+
10
+ Then(/^I should see a normal output$/) do
11
+ @output.should include "Dependencies that need approval:"
12
+ end
@@ -0,0 +1,16 @@
1
+ Given(/^I have an app with license finder that depends on an other licensed gem$/) do
2
+ @user = ::DSL::User.new
3
+ @user.create_nonrails_app
4
+ @user.add_license_finder_to_rakefile
5
+ @user.add_dependency_to_app 'other_gem', :license => 'other'
6
+ end
7
+
8
+ When(/^I set that gems license to MIT from the command line$/) do
9
+ @output = @user.execute_command 'license_finder -q'
10
+ @output = @user.execute_command 'license_finder -lq MIT other_gem'
11
+ @output = @user.execute_command 'license_finder -q'
12
+ end
13
+
14
+ Then(/^I should see that other gems license set to MIT$/) do
15
+ @output.should include 'other_gem'
16
+ end
@@ -0,0 +1,203 @@
1
+ require 'fileutils'
2
+ require 'pathname'
3
+ require 'bundler'
4
+ require 'capybara'
5
+
6
+ ########## COMMON STEPS ##########
7
+
8
+ When(/^I run license_finder$/) do
9
+ @output = @user.execute_command "license_finder -q"
10
+ end
11
+
12
+ When(/^I whitelist MIT and 'other' licenses$/) do
13
+ @user.configure_license_finder_whitelist ["MIT","other"]
14
+ @output = @user.execute_command "license_finder -q"
15
+ end
16
+
17
+ module DSL
18
+ class User
19
+ def create_nonrails_app
20
+ reset_projects!
21
+
22
+ `cd #{projects_path} && bundle gem #{app_name}`
23
+
24
+ add_gem_dependency('rake')
25
+ add_gem_dependency('license_finder', :path => root_path)
26
+
27
+ bundle_app
28
+ end
29
+
30
+ def create_rails_app
31
+ reset_projects!
32
+
33
+ `bundle exec rails new #{app_path} --skip-bundle`
34
+
35
+ add_gem_dependency('license_finder', :path => root_path)
36
+
37
+ bundle_app
38
+ end
39
+
40
+ def add_license_finder_to_rakefile
41
+ add_to_rakefile <<-RUBY
42
+ require 'bundler/setup'
43
+ require 'license_finder'
44
+ LicenseFinder.load_rake_tasks
45
+ RUBY
46
+ end
47
+
48
+ def update_gem(name, attrs)
49
+ file_contents = YAML.load(File.read(dependencies_file_path))
50
+
51
+ index = file_contents.index { |gem| gem['name'] == name }
52
+ file_contents[index].merge!(attrs)
53
+
54
+ File.open(dependencies_file_path, "w") do |f|
55
+ f.puts file_contents.to_yaml
56
+ end
57
+ end
58
+
59
+ def append_to_file(filename, text)
60
+ File.open(File.join(app_path, filename), "a") do |f|
61
+ f.puts text
62
+ end
63
+ end
64
+
65
+ def add_dependency_to_app(gem_name, options={})
66
+ license = options.fetch(:license)
67
+ summary = options.fetch(:summary, "")
68
+ description = options.fetch(:description, "")
69
+ bundler_groups = options.fetch(:bundler_groups, "").to_s.split(',').map(&:strip)
70
+ version = options[:version] || "0.0.0"
71
+ homepage = options[:homepage]
72
+
73
+ gem_dir = File.join(projects_path, gem_name)
74
+
75
+ FileUtils.mkdir(gem_dir)
76
+ File.open(File.join(gem_dir, "#{gem_name}.gemspec"), 'w') do |file|
77
+ file.write <<-GEMSPEC
78
+ Gem::Specification.new do |s|
79
+ s.name = "#{gem_name}"
80
+ s.version = "#{version}"
81
+ s.author = "Cucumber"
82
+ s.summary = "#{summary}"
83
+ s.license = "#{license}"
84
+ s.description = "#{description}"
85
+ s.homepage = "#{homepage}"
86
+ end
87
+ GEMSPEC
88
+ end
89
+
90
+ gem_options = {}
91
+ gem_options[:path] = File.join(projects_path, gem_name)
92
+ gem_options[:groups] = bundler_groups unless bundler_groups.empty?
93
+
94
+ add_gem_dependency(gem_name, gem_options)
95
+
96
+ bundle_app
97
+ end
98
+
99
+ def configure_license_finder_whitelist(whitelisted_licenses=[])
100
+ FileUtils.mkdir_p(config_path)
101
+ File.open(File.join(config_path, "license_finder.yml"), "w") do |f|
102
+ f.write({'whitelist' => whitelisted_licenses}.to_yaml)
103
+ end
104
+ end
105
+
106
+ def configure_license_finder_bundler_whitelist(whitelisted_groups=[])
107
+ whitelisted_groups = Array whitelisted_groups
108
+ FileUtils.mkdir_p(config_path)
109
+ File.open(File.join(config_path, "license_finder.yml"), "w") do |f|
110
+ f.write({'ignore_groups' => whitelisted_groups}.to_yaml)
111
+ end
112
+ end
113
+
114
+ def execute_command(command)
115
+ Bundler.with_clean_env do
116
+ @output = `cd #{app_path} && bundle exec #{command}`
117
+ end
118
+
119
+ @output
120
+ end
121
+
122
+ def app_path(sub_directory = nil)
123
+ path = app_path = Pathname.new(File.join(projects_path, app_name)).cleanpath.to_s
124
+
125
+ if sub_directory
126
+ path = Pathname.new(File.join(app_path, sub_directory)).cleanpath.to_s
127
+
128
+ raise "#{name} is outside of the app" unless path =~ %r{^#{app_path}/}
129
+ end
130
+
131
+ path
132
+ end
133
+
134
+ def config_path
135
+ File.join(app_path, 'config')
136
+ end
137
+
138
+ def doc_path
139
+ File.join(app_path, 'doc')
140
+ end
141
+
142
+ def dependencies_file_path
143
+ File.join(doc_path, 'dependencies.yml')
144
+ end
145
+
146
+ def dependencies_html_path
147
+ File.join(doc_path, 'dependencies.html')
148
+ end
149
+
150
+ def add_gem_dependency(name, options = {})
151
+ line = "gem #{name.inspect}"
152
+ line << ", " + options.inspect unless options.empty?
153
+
154
+ add_to_gemfile(line)
155
+ end
156
+
157
+ def bundle_app
158
+ Bundler.with_clean_env do
159
+ `bundle install --gemfile=#{File.join(app_path, "Gemfile")} --path=#{bundle_path}`
160
+ end
161
+ end
162
+
163
+ def modifying_dependencies_file
164
+ FileUtils.mkdir_p(File.dirname(dependencies_file_path))
165
+ File.open(dependencies_file_path, 'w+') { |f| yield f }
166
+ end
167
+
168
+ private
169
+
170
+ def add_to_gemfile(line)
171
+ `echo #{line.inspect} >> #{File.join(app_path, "Gemfile")}`
172
+ end
173
+
174
+ def add_to_rakefile(line)
175
+ `echo #{line.inspect} >> #{File.join(app_path, "Rakefile")}`
176
+ end
177
+
178
+ def app_name
179
+ "my_app"
180
+ end
181
+
182
+ def sandbox_path
183
+ File.join(root_path, "tmp")
184
+ end
185
+
186
+ def projects_path
187
+ File.join(sandbox_path, "projects")
188
+ end
189
+
190
+ def bundle_path
191
+ File.join(sandbox_path, "bundle")
192
+ end
193
+
194
+ def reset_projects!
195
+ `rm -rf #{projects_path}`
196
+ `mkdir -p #{projects_path}`
197
+ end
198
+
199
+ def root_path
200
+ Pathname.new(File.join(File.dirname(__FILE__), "..", "..")).realpath.to_s
201
+ end
202
+ end
203
+ end