appbundler 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +2 -1
- data/.travis.yml +1 -1
- data/appbundler.gemspec +3 -1
- data/lib/appbundler/app.rb +7 -6
- data/lib/appbundler/cli.rb +36 -17
- data/lib/appbundler/version.rb +1 -1
- data/spec/appbundler/app_spec.rb +62 -51
- data/spec/fixtures/{example-app → appbundler-example-app}/Gemfile +0 -0
- data/spec/fixtures/{example-app → appbundler-example-app}/README.md +0 -0
- data/spec/fixtures/{example-app/example-app.gemspec → appbundler-example-app/appbundler-example-app.gemspec} +1 -1
- data/spec/fixtures/{example-app → appbundler-example-app}/bin/app-binary-1 +0 -0
- data/spec/fixtures/{example-app → appbundler-example-app}/bin/app-binary-2 +0 -0
- data/spec/fixtures/{example-app → appbundler-example-app}/lib/example_app.rb +0 -0
- data/spec/spec_helper.rb +0 -1
- metadata +33 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3f810a4157e852584ec425ed6eb051c607c4038
|
4
|
+
data.tar.gz: 5dfe2fbde8fad33d18e81a7957307853bace76cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fe06ba8ebe2ee5938206d4f755d1ebc4a14fb8e540c230bb85eca0fbc151dd7c843097581f4491a5c697820ef4ae0558945a88f4f4221bd53a23911bada2075
|
7
|
+
data.tar.gz: 0f7afde6c93689b42d62e28c61bf96523b83ad092a14cea4ae873ea3cbc3caa2d8a96d514d9fc67573c044a6cb37264ede3d3a529a8e21aa854bffbaf4d4f8a7
|
data/.rspec
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
-
|
1
|
+
-c
|
2
|
+
-f doc
|
data/.travis.yml
CHANGED
data/appbundler.gemspec
CHANGED
@@ -19,7 +19,9 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_development_dependency "rake"
|
22
|
-
spec.add_development_dependency "rspec", "~>
|
22
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
23
23
|
spec.add_development_dependency "pry"
|
24
24
|
spec.add_development_dependency "mixlib-shellout", "~> 1.0"
|
25
|
+
|
26
|
+
spec.add_dependency "mixlib-cli", "~> 1.4"
|
25
27
|
end
|
data/lib/appbundler/app.rb
CHANGED
@@ -116,14 +116,15 @@ E
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def load_statement_for(bin_file)
|
119
|
+
name, version = app_spec.name, app_spec.version
|
120
|
+
bin_basename = File.basename(bin_file)
|
119
121
|
<<-E
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
122
|
+
gem "#{name}", "= #{version}"
|
123
|
+
|
124
|
+
spec = Gem::Specification.find_by_name("#{name}", "= #{version}")
|
125
|
+
bin_file = spec.bin_file("#{bin_basename}")
|
124
126
|
|
125
|
-
|
126
|
-
Kernel.load(File.expand_path('#{relative_bin_file(bin_file)}', bin_dir))
|
127
|
+
Kernel.load(bin_file)
|
127
128
|
E
|
128
129
|
end
|
129
130
|
|
data/lib/appbundler/cli.rb
CHANGED
@@ -1,11 +1,38 @@
|
|
1
1
|
require 'appbundler/version'
|
2
2
|
require 'appbundler/app'
|
3
|
+
require 'mixlib/cli'
|
3
4
|
|
4
5
|
module Appbundler
|
5
6
|
class CLI
|
7
|
+
include Mixlib::CLI
|
8
|
+
|
9
|
+
banner(<<-BANNER)
|
10
|
+
Usage: appbundler APPLICATION_DIR BINSTUB_DIR
|
11
|
+
|
12
|
+
APPLICATION_DIR is the root directory of your app
|
13
|
+
BINSTUB_DIR is the directory where you want generated executables to be written
|
14
|
+
BANNER
|
15
|
+
|
16
|
+
option :version,
|
17
|
+
:short => '-v',
|
18
|
+
:long => '--version',
|
19
|
+
:description => 'Show appbundler version',
|
20
|
+
:boolean => true,
|
21
|
+
:proc => lambda {|v| $stdout.puts("Appbundler Version: #{::Appbundler::VERSION}")},
|
22
|
+
:exit => 0
|
23
|
+
|
24
|
+
option :help,
|
25
|
+
:short => "-h",
|
26
|
+
:long => "--help",
|
27
|
+
:description => "Show this message",
|
28
|
+
:on => :tail,
|
29
|
+
:boolean => true,
|
30
|
+
:show_options => true,
|
31
|
+
:exit => 0
|
6
32
|
|
7
33
|
def self.run(argv)
|
8
34
|
cli = new(argv)
|
35
|
+
cli.handle_options
|
9
36
|
cli.validate!
|
10
37
|
cli.run
|
11
38
|
end
|
@@ -17,17 +44,19 @@ module Appbundler
|
|
17
44
|
|
18
45
|
def initialize(argv)
|
19
46
|
@argv = argv
|
47
|
+
super()
|
48
|
+
end
|
49
|
+
|
50
|
+
def handle_options
|
51
|
+
parse_options(@argv)
|
20
52
|
end
|
21
53
|
|
22
54
|
def validate!
|
23
|
-
if
|
24
|
-
$stdout.print(usage)
|
25
|
-
exit 0
|
26
|
-
elsif argv.size != 2
|
55
|
+
if cli_arguments.size != 2
|
27
56
|
usage_and_exit!
|
28
57
|
else
|
29
|
-
@app_path = File.expand_path(
|
30
|
-
@bin_path = File.expand_path(
|
58
|
+
@app_path = File.expand_path(cli_arguments[0])
|
59
|
+
@bin_path = File.expand_path(cli_arguments[1])
|
31
60
|
verify_app_path
|
32
61
|
verify_bin_path
|
33
62
|
end
|
@@ -62,18 +91,8 @@ module Appbundler
|
|
62
91
|
end
|
63
92
|
|
64
93
|
def usage_and_exit!
|
65
|
-
err(
|
94
|
+
err(banner)
|
66
95
|
exit 1
|
67
96
|
end
|
68
|
-
|
69
|
-
def usage
|
70
|
-
<<-E
|
71
|
-
Usage: appbundler APPLICATION_DIR BINSTUB_DIR
|
72
|
-
|
73
|
-
APPLICATION_DIR is the root directory of your app
|
74
|
-
BINSTUB_DIR is the directory where you want generated executables to be written
|
75
|
-
E
|
76
|
-
end
|
77
|
-
|
78
97
|
end
|
79
98
|
end
|
data/lib/appbundler/version.rb
CHANGED
data/spec/appbundler/app_spec.rb
CHANGED
@@ -24,7 +24,9 @@ describe Appbundler do
|
|
24
24
|
s
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
def target_bindir
|
28
|
+
File.expand_path("../../test-tmp/bin", __FILE__)
|
29
|
+
end
|
28
30
|
|
29
31
|
context "given an app with multiple levels of dependencies" do
|
30
32
|
|
@@ -61,7 +63,7 @@ describe Appbundler do
|
|
61
63
|
end
|
62
64
|
|
63
65
|
before do
|
64
|
-
app.
|
66
|
+
allow(app).to receive(:gemfile_lock_specs).and_return(all_specs)
|
65
67
|
end
|
66
68
|
|
67
69
|
it "finds the running ruby interpreter" do
|
@@ -80,7 +82,7 @@ describe Appbundler do
|
|
80
82
|
expect(app.runtime_dep_specs).to include(second_level_dep_a_a)
|
81
83
|
expect(app.runtime_dep_specs).to include(second_level_dep_b_a)
|
82
84
|
expect(app.runtime_dep_specs).to include(second_level_dep_shared)
|
83
|
-
expect(app.runtime_dep_specs.select {|s| s == second_level_dep_shared}).to
|
85
|
+
expect(app.runtime_dep_specs.select {|s| s == second_level_dep_shared}.size).to eq(1)
|
84
86
|
end
|
85
87
|
|
86
88
|
it "generates gem activation code for the app" do
|
@@ -95,28 +97,16 @@ describe Appbundler do
|
|
95
97
|
expect(app.runtime_activate).to_not include(%q{gem "app"})
|
96
98
|
end
|
97
99
|
|
98
|
-
it "
|
99
|
-
|
100
|
-
|
101
|
-
if File.symlink?(__FILE__)
|
102
|
-
bin_dir = File.dirname(File.readlink(__FILE__))
|
103
|
-
end
|
104
|
-
E
|
100
|
+
it "locks the main app's gem via rubygems, and loads the proper binary" do
|
101
|
+
expected_loading_code = <<-CODE
|
102
|
+
gem "app", "= 1.0.0"
|
105
103
|
|
106
|
-
|
107
|
-
|
104
|
+
spec = Gem::Specification.find_by_name("app", "= 1.0.0")
|
105
|
+
bin_file = spec.bin_file("foo")
|
108
106
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
# will traverse all the way to the root and then back up. Therefore, the
|
113
|
-
# expected output is dependent on how many directories deep this source
|
114
|
-
# clone is from the root:
|
115
|
-
relpath_to_root = Pathname.new("/").relative_path_from(Pathname.new(File.dirname(__FILE__))).to_s
|
116
|
-
|
117
|
-
expected_code_path =
|
118
|
-
%Q[$:.unshift(File.expand_path("#{relpath_to_root}/../opt/app/embedded/apps/app/lib", bin_dir))]
|
119
|
-
expect(app.load_statement_for(bin_path)).to include(expected_code_path)
|
107
|
+
Kernel.load(bin_file)
|
108
|
+
CODE
|
109
|
+
expect(app.load_statement_for(bin_path)).to eq(expected_loading_code)
|
120
110
|
end
|
121
111
|
|
122
112
|
it "generates code to override GEM_HOME and GEM_PATH (e.g., rvm)" do
|
@@ -130,7 +120,7 @@ E
|
|
130
120
|
let(:target_bindir) { "C:/opscode/chef/bin" }
|
131
121
|
|
132
122
|
before do
|
133
|
-
app.
|
123
|
+
allow(app).to receive(:ruby).and_return("C:/opscode/chef/embedded/bin/ruby.exe")
|
134
124
|
end
|
135
125
|
|
136
126
|
it "computes the relative path to ruby" do
|
@@ -152,7 +142,7 @@ E
|
|
152
142
|
context "when created with the example application" do
|
153
143
|
FIXTURES_PATH = File.expand_path("../../fixtures/", __FILE__).freeze
|
154
144
|
|
155
|
-
APP_ROOT = File.join(FIXTURES_PATH, "example-app").freeze
|
145
|
+
APP_ROOT = File.join(FIXTURES_PATH, "appbundler-example-app").freeze
|
156
146
|
|
157
147
|
let(:app_root) { APP_ROOT }
|
158
148
|
|
@@ -163,6 +153,8 @@ E
|
|
163
153
|
before(:all) do
|
164
154
|
Dir.chdir(APP_ROOT) do
|
165
155
|
shellout!("bundle install")
|
156
|
+
shellout!("gem build appbundler-example-app.gemspec")
|
157
|
+
shellout!("gem install appbundler-example-app-1.0.0.gem")
|
166
158
|
end
|
167
159
|
end
|
168
160
|
|
@@ -172,6 +164,7 @@ E
|
|
172
164
|
end
|
173
165
|
|
174
166
|
after(:all) do
|
167
|
+
shellout!("gem uninstall appbundler-example-app -a -q -x")
|
175
168
|
FileUtils.rm_rf(target_bindir) if File.exist?(target_bindir)
|
176
169
|
end
|
177
170
|
|
@@ -180,7 +173,7 @@ E
|
|
180
173
|
end
|
181
174
|
|
182
175
|
it "names the app using the directory basename" do
|
183
|
-
app.name.
|
176
|
+
expect(app.name).to eq("appbundler-example-app")
|
184
177
|
end
|
185
178
|
|
186
179
|
it "lists the app's dependencies" do
|
@@ -191,34 +184,52 @@ E
|
|
191
184
|
it "generates runtime activation code for the app" do
|
192
185
|
expected_gem_activates=<<-E
|
193
186
|
ENV["GEM_HOME"] = ENV["GEM_PATH"] = nil unless ENV["APPBUNDLER_ALLOW_RVM"] == "true"
|
194
|
-
gem "chef", "=
|
195
|
-
gem "chef-
|
196
|
-
gem "
|
197
|
-
gem "
|
187
|
+
gem "chef", "= 12.4.1"
|
188
|
+
gem "chef-config", "= 12.4.1"
|
189
|
+
gem "mixlib-config", "= 2.2.1"
|
190
|
+
gem "mixlib-shellout", "= 2.2.0"
|
191
|
+
gem "chef-zero", "= 4.3.0"
|
192
|
+
gem "ffi-yajl", "= 2.2.2"
|
193
|
+
gem "libyajl2", "= 1.2.0"
|
194
|
+
gem "hashie", "= 2.1.2"
|
198
195
|
gem "mixlib-log", "= 1.6.0"
|
199
|
-
gem "
|
200
|
-
gem "
|
196
|
+
gem "rack", "= 1.6.4"
|
197
|
+
gem "uuidtools", "= 2.1.5"
|
201
198
|
gem "diff-lcs", "= 1.2.5"
|
202
199
|
gem "erubis", "= 2.7.0"
|
203
|
-
gem "highline", "= 1.
|
204
|
-
gem "mime-types", "= 1.25.1"
|
200
|
+
gem "highline", "= 1.7.3"
|
205
201
|
gem "mixlib-authentication", "= 1.3.0"
|
206
|
-
gem "mixlib-cli", "= 1.
|
207
|
-
gem "
|
208
|
-
gem "
|
209
|
-
gem "net-ssh", "= 2.8.0"
|
210
|
-
gem "net-ssh-multi", "= 1.2.0"
|
202
|
+
gem "mixlib-cli", "= 1.5.0"
|
203
|
+
gem "net-ssh", "= 2.9.2"
|
204
|
+
gem "net-ssh-multi", "= 1.2.1"
|
211
205
|
gem "net-ssh-gateway", "= 1.2.0"
|
212
|
-
gem "ohai", "=
|
206
|
+
gem "ohai", "= 8.5.1"
|
207
|
+
gem "ffi", "= 1.9.10"
|
213
208
|
gem "ipaddress", "= 0.8.0"
|
214
|
-
gem "
|
215
|
-
gem "
|
209
|
+
gem "mime-types", "= 2.6.1"
|
210
|
+
gem "rake", "= 10.1.1"
|
211
|
+
gem "systemu", "= 2.6.5"
|
212
|
+
gem "wmi-lite", "= 1.0.0"
|
213
|
+
gem "plist", "= 3.1.0"
|
216
214
|
gem "pry", "= 0.9.12.6"
|
217
215
|
gem "coderay", "= 1.1.0"
|
218
216
|
gem "method_source", "= 0.8.2"
|
219
217
|
gem "slop", "= 3.4.7"
|
220
|
-
gem "
|
221
|
-
gem "
|
218
|
+
gem "rspec-core", "= 3.3.2"
|
219
|
+
gem "rspec-support", "= 3.3.0"
|
220
|
+
gem "rspec-expectations", "= 3.3.1"
|
221
|
+
gem "rspec-mocks", "= 3.3.2"
|
222
|
+
gem "rspec_junit_formatter", "= 0.2.3"
|
223
|
+
gem "builder", "= 3.2.2"
|
224
|
+
gem "serverspec", "= 2.23.1"
|
225
|
+
gem "multi_json", "= 1.11.2"
|
226
|
+
gem "rspec", "= 3.3.0"
|
227
|
+
gem "rspec-its", "= 1.2.0"
|
228
|
+
gem "specinfra", "= 2.43.3"
|
229
|
+
gem "net-scp", "= 1.2.1"
|
230
|
+
gem "net-telnet", "= 0.1.1"
|
231
|
+
gem "sfl", "= 2.2"
|
232
|
+
gem "syslog-logger", "= 1.6.8"
|
222
233
|
E
|
223
234
|
expect(app.runtime_activate).to include(expected_gem_activates)
|
224
235
|
end
|
@@ -242,7 +253,7 @@ E
|
|
242
253
|
|
243
254
|
load_binary = executable_content.lines.to_a.last
|
244
255
|
|
245
|
-
expected_load_path = %Q[Kernel.load(
|
256
|
+
expected_load_path = %Q[Kernel.load(bin_file)\n]
|
246
257
|
|
247
258
|
expect(load_binary).to eq(expected_load_path)
|
248
259
|
end
|
@@ -251,10 +262,10 @@ E
|
|
251
262
|
app.write_executable_stubs
|
252
263
|
binary_1 = File.join(target_bindir, "app-binary-1")
|
253
264
|
binary_2 = File.join(target_bindir, "app-binary-2")
|
254
|
-
expect(File.exist?(binary_1)).to
|
255
|
-
expect(File.exist?(binary_2)).to
|
256
|
-
expect(File.executable?(binary_1)).to
|
257
|
-
expect(File.executable?(binary_1)).to
|
265
|
+
expect(File.exist?(binary_1)).to be(true)
|
266
|
+
expect(File.exist?(binary_2)).to be(true)
|
267
|
+
expect(File.executable?(binary_1)).to be(true)
|
268
|
+
expect(File.executable?(binary_1)).to be(true)
|
258
269
|
expect(shellout!(binary_1).stdout).to eq("binary 1 ran\n")
|
259
270
|
expect(shellout!(binary_2).stdout).to eq("binary 2 ran\n")
|
260
271
|
end
|
@@ -311,8 +322,8 @@ E
|
|
311
322
|
app.write_executable_stubs
|
312
323
|
binary_1 = File.join(target_bindir, "app-binary-1.bat")
|
313
324
|
binary_2 = File.join(target_bindir, "app-binary-2.bat")
|
314
|
-
expect(File.exist?(binary_1)).to
|
315
|
-
expect(File.exist?(binary_2)).to
|
325
|
+
expect(File.exist?(binary_1)).to be(true)
|
326
|
+
expect(File.exist?(binary_2)).to be(true)
|
316
327
|
expect(IO.read(binary_1)).to eq(expected_batch_code)
|
317
328
|
expect(IO.read(binary_2)).to eq(expected_batch_code)
|
318
329
|
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appbundler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- danielsdeleo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '3.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '3.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: mixlib-cli
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.4'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.4'
|
69
83
|
description: Extracts a dependency solution from bundler's Gemfile.lock to speed gem
|
70
84
|
activation
|
71
85
|
email:
|
@@ -89,13 +103,13 @@ files:
|
|
89
103
|
- lib/appbundler/cli.rb
|
90
104
|
- lib/appbundler/version.rb
|
91
105
|
- spec/appbundler/app_spec.rb
|
92
|
-
- spec/fixtures/example-app/Gemfile
|
93
|
-
- spec/fixtures/example-app/Gemfile.lock
|
94
|
-
- spec/fixtures/example-app/README.md
|
95
|
-
- spec/fixtures/example-app/
|
96
|
-
- spec/fixtures/example-app/bin/app-binary-
|
97
|
-
- spec/fixtures/example-app/
|
98
|
-
- spec/fixtures/example-app/lib/example_app.rb
|
106
|
+
- spec/fixtures/appbundler-example-app/Gemfile
|
107
|
+
- spec/fixtures/appbundler-example-app/Gemfile.lock
|
108
|
+
- spec/fixtures/appbundler-example-app/README.md
|
109
|
+
- spec/fixtures/appbundler-example-app/appbundler-example-app.gemspec
|
110
|
+
- spec/fixtures/appbundler-example-app/bin/app-binary-1
|
111
|
+
- spec/fixtures/appbundler-example-app/bin/app-binary-2
|
112
|
+
- spec/fixtures/appbundler-example-app/lib/example_app.rb
|
99
113
|
- spec/spec_helper.rb
|
100
114
|
homepage: ''
|
101
115
|
licenses:
|
@@ -117,18 +131,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
131
|
version: '0'
|
118
132
|
requirements: []
|
119
133
|
rubyforge_project:
|
120
|
-
rubygems_version: 2.
|
134
|
+
rubygems_version: 2.4.6
|
121
135
|
signing_key:
|
122
136
|
specification_version: 4
|
123
137
|
summary: Extracts a dependency solution from bundler's Gemfile.lock to speed gem activation
|
124
138
|
test_files:
|
125
139
|
- spec/appbundler/app_spec.rb
|
126
|
-
- spec/fixtures/example-app/Gemfile
|
127
|
-
- spec/fixtures/example-app/Gemfile.lock
|
128
|
-
- spec/fixtures/example-app/README.md
|
129
|
-
- spec/fixtures/example-app/
|
130
|
-
- spec/fixtures/example-app/bin/app-binary-
|
131
|
-
- spec/fixtures/example-app/
|
132
|
-
- spec/fixtures/example-app/lib/example_app.rb
|
140
|
+
- spec/fixtures/appbundler-example-app/Gemfile
|
141
|
+
- spec/fixtures/appbundler-example-app/Gemfile.lock
|
142
|
+
- spec/fixtures/appbundler-example-app/README.md
|
143
|
+
- spec/fixtures/appbundler-example-app/appbundler-example-app.gemspec
|
144
|
+
- spec/fixtures/appbundler-example-app/bin/app-binary-1
|
145
|
+
- spec/fixtures/appbundler-example-app/bin/app-binary-2
|
146
|
+
- spec/fixtures/appbundler-example-app/lib/example_app.rb
|
133
147
|
- spec/spec_helper.rb
|
134
148
|
has_rdoc:
|