zassets 0.2.7 → 0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +390 -39
- data/lib/zassets/config.rb +18 -5
- data/lib/zassets/version.rb +1 -1
- metadata +62 -136
- data/.gitignore +0 -3
- data/Gemfile +0 -5
- data/Guardfile +0 -12
- data/LICENSE +0 -23
- data/Rakefile +0 -7
- data/features/builder/build.feature +0 -14
- data/features/builder/manifest.feature +0 -13
- data/features/cli/default_action.feature +0 -5
- data/features/cli/usage.feature +0 -8
- data/features/cli/version.feature +0 -5
- data/features/config/file.feature +0 -10
- data/features/config/paths.feature +0 -11
- data/features/engines/coffee.feature +0 -16
- data/features/engines/sass.feature +0 -28
- data/features/server/handler.feature +0 -13
- data/features/server/interrupt.feature +0 -6
- data/features/server/logging.feature +0 -7
- data/features/server/public_file.feature +0 -18
- data/features/server/static_files.feature +0 -15
- data/features/step_definitions/builder_steps.rb +0 -41
- data/features/step_definitions/config_steps.rb +0 -8
- data/features/step_definitions/manifest_steps.rb +0 -7
- data/features/step_definitions/server_steps.rb +0 -49
- data/features/support/env.rb +0 -3
- data/features/support/env_aruba.rb +0 -16
- data/features/support/env_cucumber-doc_string.rb +0 -23
- data/features/support/env_server.rb +0 -91
- data/spec/fixtures/assets/app.js +0 -1
- data/spec/fixtures/config/zassets.yaml +0 -1
- data/spec/fixtures/public/hello.txt +0 -1
- data/spec/fixtures/public/index.html +0 -1
- data/spec/spec_helper.rb +0 -3
- data/spec/support/fixtures_helpers.rb +0 -13
- data/spec/zassets-plugins-dummy.rb +0 -17
- data/spec/zassets/builder_spec.rb +0 -52
- data/spec/zassets/cli_spec.rb +0 -158
- data/spec/zassets/config_spec.rb +0 -139
- data/spec/zassets/memory_file_spec.rb +0 -46
- data/spec/zassets/server_spec.rb +0 -116
- data/spec/zassets/sprockets_env_spec.rb +0 -44
- data/zassets.gemspec +0 -30
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ZAssets
|
4
|
-
describe Builder do
|
5
|
-
let(:config) { Config.new }
|
6
|
-
subject(:builder) { Builder.new(config) }
|
7
|
-
|
8
|
-
describe '#build' do
|
9
|
-
it 'compiles the manifest' do
|
10
|
-
builder.manifest = double('manifest')
|
11
|
-
expect(builder.manifest).to receive :compile
|
12
|
-
builder.build
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
describe '#manifest' do
|
17
|
-
it 'builds a sprockets manifest' do
|
18
|
-
expect(Sprockets::Manifest).to receive(:new).with(
|
19
|
-
builder.environment,
|
20
|
-
builder.manifest_path
|
21
|
-
)
|
22
|
-
builder.manifest
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'returns the sprockets manifest' do
|
26
|
-
manifest = double('manifest')
|
27
|
-
allow(Sprockets::Manifest).to receive(:new) { manifest }
|
28
|
-
expect(builder.manifest).to be manifest
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe '#manifest_path' do
|
33
|
-
it 'returns the manifest file path' do
|
34
|
-
expected_path = File.join(config[:build_path], 'manifest.json')
|
35
|
-
expect(builder.manifest_path).to eq expected_path
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe '#environment' do
|
40
|
-
it 'builds a sprockets env' do
|
41
|
-
expect(SprocketsEnv).to receive(:new).with(config)
|
42
|
-
builder.environment
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'returns the sprockets env' do
|
46
|
-
environment = double('environment')
|
47
|
-
allow(SprocketsEnv).to receive(:new) { environment }
|
48
|
-
expect(builder.environment).to be environment
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
data/spec/zassets/cli_spec.rb
DELETED
@@ -1,158 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ZAssets
|
4
|
-
describe CLI do
|
5
|
-
let(:args) { ['serve'] }
|
6
|
-
subject(:cli) { CLI.new(args) }
|
7
|
-
|
8
|
-
describe '#initialize' do
|
9
|
-
context 'action arguments parsing' do
|
10
|
-
it 'parses the action' do
|
11
|
-
expect(cli.action).to eq :serve
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'when action is not provided' do
|
15
|
-
let(:args) { [] }
|
16
|
-
|
17
|
-
it 'defaults to build' do
|
18
|
-
expect(cli.action).to eq :build
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'option arguments parsing' do
|
24
|
-
def with_option(option, value = nil)
|
25
|
-
if value
|
26
|
-
CLI.new [option, value, *args]
|
27
|
-
else
|
28
|
-
CLI.new [option, *args]
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'parses the -v option' do
|
33
|
-
expect(with_option('-v').options[:verbose]).to be true
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'parses the -c option' do
|
37
|
-
expect(with_option('-c', 'config').options[:config_file])
|
38
|
-
.to eq 'config'
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'parses the -o option' do
|
42
|
-
expect(with_option('-o', '::0').options[:host]).to eq '::0'
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'parses the -p option' do
|
46
|
-
expect(with_option('-p', '9393').options[:port]).to eq '9393'
|
47
|
-
end
|
48
|
-
|
49
|
-
it 'parses the -s option' do
|
50
|
-
expect(with_option('-s', 'thin').options[:server]).to eq 'thin'
|
51
|
-
end
|
52
|
-
|
53
|
-
context '-h option' do
|
54
|
-
let(:args) { ['-h'] }
|
55
|
-
let(:output) { StringIO.new }
|
56
|
-
subject(:cli) { CLI.new(args, output) }
|
57
|
-
|
58
|
-
it 'prints the usage help' do
|
59
|
-
begin
|
60
|
-
cli
|
61
|
-
rescue SystemExit
|
62
|
-
end
|
63
|
-
expect(output.string).to match /\AUsage: /
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'exits' do
|
67
|
-
expect { cli }.to raise_error SystemExit
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
context '-V option' do
|
72
|
-
let(:args) { ['-V'] }
|
73
|
-
let(:output) { StringIO.new }
|
74
|
-
subject(:cli) { CLI.new(args, output) }
|
75
|
-
|
76
|
-
it 'prints the version' do
|
77
|
-
begin
|
78
|
-
cli
|
79
|
-
rescue SystemExit
|
80
|
-
end
|
81
|
-
expect(output.string.chomp).to eq VERSION
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'exits' do
|
85
|
-
expect { cli }.to raise_error SystemExit
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
describe '#action' do
|
92
|
-
it 'return the current action' do
|
93
|
-
expect(cli.action).to eq args.last.to_sym
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
describe '#config' do
|
98
|
-
it 'builds a config' do
|
99
|
-
expect(Config).to receive(:new).with(cli.options)
|
100
|
-
cli.config
|
101
|
-
end
|
102
|
-
|
103
|
-
it 'returns the config' do
|
104
|
-
config = double('config')
|
105
|
-
allow(Config).to receive(:new) { config }
|
106
|
-
expect(cli.config).to be config
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe '#run' do
|
111
|
-
context 'serve action' do
|
112
|
-
it 'runs the server' do
|
113
|
-
server = double('server')
|
114
|
-
allow(cli).to receive(:server) { server }
|
115
|
-
expect(server).to receive :run
|
116
|
-
cli.run
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
context 'build action' do
|
121
|
-
let(:args) { ['build'] }
|
122
|
-
|
123
|
-
it 'runs the builder' do
|
124
|
-
builder = double('builder')
|
125
|
-
allow(cli).to receive(:builder) { builder }
|
126
|
-
expect(builder).to receive :build
|
127
|
-
cli.run
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
describe '#builder' do
|
133
|
-
it 'builds a builder' do
|
134
|
-
expect(Builder).to receive(:new).with(cli.config)
|
135
|
-
cli.builder
|
136
|
-
end
|
137
|
-
|
138
|
-
it 'returns the builder' do
|
139
|
-
builder = double('builder')
|
140
|
-
allow(Builder).to receive(:new) { builder }
|
141
|
-
expect(cli.builder).to be builder
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
describe '#server' do
|
146
|
-
it 'builds a server' do
|
147
|
-
expect(Server).to receive(:new).with(cli.config)
|
148
|
-
cli.server
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'returns the server' do
|
152
|
-
server = double('server')
|
153
|
-
allow(Server).to receive(:new) { server }
|
154
|
-
expect(cli.server).to be server
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
end
|
data/spec/zassets/config_spec.rb
DELETED
@@ -1,139 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ZAssets
|
4
|
-
describe Config do
|
5
|
-
include FixturesHelpers
|
6
|
-
|
7
|
-
let(:config_file) { fixture_path_for 'config/zassets.yaml' }
|
8
|
-
subject(:config) { Config.new }
|
9
|
-
|
10
|
-
describe '#initialize' do
|
11
|
-
it 'assigns #default_options to @options' do
|
12
|
-
expect(config.instance_eval { @options }).to eq config.default_options
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'registers plugins' do
|
16
|
-
expect_any_instance_of(Config).to receive :register_plugins!
|
17
|
-
Config.new
|
18
|
-
end
|
19
|
-
|
20
|
-
context 'with a non-empty option hash' do
|
21
|
-
it 'merges the option hash' do
|
22
|
-
config = Config.new(verbose: true)
|
23
|
-
expect(config[:verbose]).to be true
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'with config_file option' do
|
28
|
-
subject(:config) { Config.new(config_file: config_file) }
|
29
|
-
|
30
|
-
it 'merges the config file options in @options' do
|
31
|
-
expect(config[:file_option]).to eq :file_value
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'merges the config file options before argument options' do
|
35
|
-
config = Config.new(file_option: :argument_value)
|
36
|
-
expect(config[:file_option]).to eq :argument_value
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe '#default_options' do
|
42
|
-
it 'sets verbose to false' do
|
43
|
-
expect(config.default_options[:verbose]).to be false
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'sets host to ::1' do
|
47
|
-
expect(config.default_options[:host]).to eq '::1'
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'sets port to 9292' do
|
51
|
-
expect(config.default_options[:port]).to eq 9292
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'sets server to puma' do
|
55
|
-
expect(config.default_options[:server]).to eq :puma
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'sets base_url to /assets' do
|
59
|
-
expect(config.default_options[:base_url]).to eq '/assets'
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'sets paths to app directory' do
|
63
|
-
expect(config.default_options[:paths]).to eq ['app']
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'sets public_path to public directory' do
|
67
|
-
expect(config.default_options[:public_path]).to eq 'public'
|
68
|
-
end
|
69
|
-
|
70
|
-
it 'sets build_path to public/assets directory' do
|
71
|
-
expect(config.default_options[:build_path]).to eq 'public/assets'
|
72
|
-
end
|
73
|
-
|
74
|
-
it 'sets build empty' do
|
75
|
-
expect(config.default_options[:build]).to eq []
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe '#load_options' do
|
80
|
-
context 'when path is given as argument' do
|
81
|
-
it 'loads symbolized options from YAML file' do
|
82
|
-
expect(config.load_options(config_file)).to eq({
|
83
|
-
file_option: :file_value
|
84
|
-
})
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
context 'without argument' do
|
89
|
-
it 'loads the default config file path' do
|
90
|
-
expect { config.load_options }
|
91
|
-
.to raise_error /.*no such.+config\/zassets.yaml/i
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
describe '#default_config_file?' do
|
97
|
-
context 'when file does not exist' do
|
98
|
-
it 'returns false' do
|
99
|
-
expect(config.default_config_file?).to be false
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
context 'when file exists' do
|
104
|
-
it 'returns true' do
|
105
|
-
within_fixture_path do
|
106
|
-
expect(config.default_config_file?).to be true
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
describe '#register_plugins!' do
|
113
|
-
subject(:config) { Config.new(plugins: ['dummy']) }
|
114
|
-
|
115
|
-
it 'loads plugins' do
|
116
|
-
config
|
117
|
-
expect(Plugins::Dummy).to be
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'registers them with current config' do
|
121
|
-
expect(config[:dummy_plugin]).to eq :registered
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
describe '#[]' do
|
126
|
-
it 'returns an @options value from its key' do
|
127
|
-
config.instance_eval { @options[:foo] = :bar }
|
128
|
-
expect(config[:foo]).to eq :bar
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
describe '#[]=' do
|
133
|
-
it 'stores a value under given key' do
|
134
|
-
config[:foo] = :bar
|
135
|
-
expect(config[:foo]).to eq :bar
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ZAssets
|
4
|
-
describe MemoryFile do
|
5
|
-
include FixturesHelpers
|
6
|
-
|
7
|
-
let(:file_path) { fixture_path_for('public/index.html') }
|
8
|
-
let(:file) { File.new file_path }
|
9
|
-
subject(:memfile) { MemoryFile.new(file) }
|
10
|
-
|
11
|
-
describe '#headers' do
|
12
|
-
it 'sets the content type to text/html' do
|
13
|
-
expect(memfile.headers['Content-Type']).to eq 'text/html'
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'sets the content length to the file length' do
|
17
|
-
expect(memfile.headers['Content-Length']).to eq file.size.to_s
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
describe '#body' do
|
22
|
-
it 'returns the file content' do
|
23
|
-
expect(memfile.body).to eq File.read(file_path)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
describe '#call' do
|
28
|
-
require 'rack'
|
29
|
-
|
30
|
-
let(:app) { Rack::MockRequest.new(memfile) }
|
31
|
-
let(:response) { app.get '/' }
|
32
|
-
|
33
|
-
it 'returns a successful response' do
|
34
|
-
expect(response).to be_ok
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'sets required headers' do
|
38
|
-
expect(response.headers).to eq memfile.headers
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'returns the body' do
|
42
|
-
expect(response.body).to eq memfile.body
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/spec/zassets/server_spec.rb
DELETED
@@ -1,116 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module ZAssets
|
4
|
-
describe Server do
|
5
|
-
let(:config) { Config.new }
|
6
|
-
subject(:server) { Server.new(config) }
|
7
|
-
|
8
|
-
describe '#run' do
|
9
|
-
let(:handler) { double 'handler' }
|
10
|
-
|
11
|
-
it 'runs the rack app' do
|
12
|
-
allow(server).to receive(:handler) { handler }
|
13
|
-
expect(handler).to receive(:run).with(server.app, server.options)
|
14
|
-
server.run
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '#handler' do
|
19
|
-
it 'returns the configured rack handler' do
|
20
|
-
expect(server.handler).to eq Rack::Handler::Puma
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe '#options' do
|
25
|
-
it 'sets rack environment to development' do
|
26
|
-
expect(server.options[:environment]).to eq :development
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'sets rack handler host to configured host' do
|
30
|
-
expect(server.options[:Host]).to eq config[:host]
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'sets rack handler port to configured port' do
|
34
|
-
expect(server.options[:Port]).to eq config[:port]
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe '#app' do
|
39
|
-
it 'returns a rack application' do
|
40
|
-
expect(server.app).to respond_to :call
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'builds the rack app once' do
|
44
|
-
# When building a rack app with Rack::Builder.new, the app will be
|
45
|
-
# built on each request. We dont want that so we need to either build
|
46
|
-
# using Rack::Builder.app or call #to_app on the returned instance. We
|
47
|
-
# can test if it was done by checking #to_app method absence.
|
48
|
-
expect(server.app).not_to respond_to :to_app
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'Rack application' do
|
52
|
-
include FixturesHelpers
|
53
|
-
|
54
|
-
let(:app) { Rack::MockRequest.new(server.app) }
|
55
|
-
let(:path) { '/' }
|
56
|
-
let(:response) { app.get path }
|
57
|
-
|
58
|
-
it 'logs queries' do
|
59
|
-
expect(response.errors).to match(/GET \/.+404.+/)
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'shows exceptions' do
|
63
|
-
allow_any_instance_of(SprocketsEnv).to receive(:call) { raise RuntimeError }
|
64
|
-
response = app.get(config[:base_url])
|
65
|
-
expect(response).to be_server_error
|
66
|
-
expect(response.body).to match /RuntimeError/
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'assets mount point' do
|
70
|
-
let(:path) { [config[:base_url], 'app.js'].join '/' }
|
71
|
-
let(:config) { Config.new(paths: [fixture_path_for('assets')]) }
|
72
|
-
|
73
|
-
it 'maps the sprockets env' do
|
74
|
-
within_fixture_path do
|
75
|
-
expect(response).to be_ok
|
76
|
-
expect(response.content_type).to eq 'application/javascript'
|
77
|
-
expect(response.body).to eq "console.log('hello!');\n"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
context 'root mount point' do
|
83
|
-
let(:path) { '/hello.txt' }
|
84
|
-
|
85
|
-
it 'maps the static file handler' do
|
86
|
-
within_fixture_path do
|
87
|
-
expect(response).to be_ok
|
88
|
-
expect(response.content_type).to eq 'text/plain'
|
89
|
-
expect(response.body).to eq "hello!\n"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context 'when a public file is configured' do
|
94
|
-
let(:config) { Config.new(public_file: 'index.html') }
|
95
|
-
|
96
|
-
it 'serves the public file' do
|
97
|
-
within_fixture_path do
|
98
|
-
response = app.get('/')
|
99
|
-
expect(response).to be_ok
|
100
|
-
expect(response.content_type).to eq 'text/html'
|
101
|
-
expect(response.body).to eq "hello HTML!\n"
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'serves static file' do
|
106
|
-
within_fixture_path do
|
107
|
-
response = app.get('/hello.txt')
|
108
|
-
expect(response.body).to eq "hello!\n"
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|