flatrack 1.0.0.alpha5 → 1.0.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.
- checksums.yaml +4 -4
- data/.gitignore +4 -1
- data/.rubocop.yml +6 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +1 -3
- data/Guardfile +11 -0
- data/README.md +41 -10
- data/Rakefile +8 -1
- data/bin/flatrack +1 -1
- data/flatrack.gemspec +30 -20
- data/lib/flatrack.rb +50 -7
- data/lib/flatrack/asset_extensions.rb +2 -4
- data/lib/flatrack/cli.rb +71 -20
- data/lib/flatrack/renderer.rb +18 -7
- data/lib/flatrack/renderer/base.rb +2 -4
- data/lib/flatrack/request.rb +6 -14
- data/lib/flatrack/response.rb +19 -32
- data/lib/flatrack/response/view_context.rb +27 -40
- data/lib/flatrack/site.rb +27 -9
- data/lib/flatrack/version.rb +2 -2
- data/lib/rake/asset_tasks.rb +12 -12
- data/logo.png +0 -0
- data/public/assets/manifest-6d7e78baa6d2c0670a82be957315fcbc.json +1 -0
- data/renderers/erb.rb +1 -3
- data/renderers/html.rb +1 -3
- data/renderers/rb.rb +11 -9
- data/spec/fixtures/assets/application.js.coffee +2 -0
- data/spec/lib/flatrack/asset_extensions_spec.rb +13 -0
- data/spec/lib/flatrack/cli_spec.rb +58 -0
- data/spec/lib/flatrack/renderer/base_spec.rb +4 -0
- data/spec/lib/flatrack/renderer_spec.rb +4 -0
- data/spec/lib/flatrack/request_spec.rb +22 -0
- data/spec/lib/flatrack/response/view_context_spec.rb +76 -0
- data/spec/lib/flatrack/response_spec.rb +22 -0
- data/spec/lib/flatrack/site_spec.rb +39 -0
- data/spec/lib/flatrack_spec.rb +28 -0
- data/spec/lib/rake/asset_tasks_spec.rb +55 -0
- data/spec/renderers/erb_spec.rb +21 -0
- data/spec/renderers/html_spec.rb +21 -0
- data/spec/renderers/rb_spec.rb +21 -0
- data/spec/spec_helper.rb +14 -2
- data/spec/support/site_helper.rb +52 -0
- data/templates/.gitignore +2 -1
- data/{spec/rake/asset_tasks_spec.rb → templates/.keep} +0 -0
- data/templates/404.html +1 -0
- data/templates/500.html +1 -0
- data/templates/Rakefile +1 -1
- data/templates/boot.rb +3 -1
- data/templates/javascript.js.coffee +2 -0
- data/templates/layout.html.erb +5 -3
- data/templates/stylesheet.css.scss +2 -0
- metadata +163 -54
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flatrack::Request do
|
4
|
+
include SiteHelper
|
5
|
+
|
6
|
+
describe '#response' do
|
7
|
+
it 'should return a 404 for page not found' do
|
8
|
+
site do
|
9
|
+
status, headers, body = get_page_response('cant_find_me')
|
10
|
+
expect(status).to eq 404
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should render a page without a layout' do
|
15
|
+
site do
|
16
|
+
touch 'pages/bad_renderer.html.bad'
|
17
|
+
status, headers, body = get_page_response('bad_renderer')
|
18
|
+
expect(status).to eq 500
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flatrack::Response::ViewContext do
|
4
|
+
|
5
|
+
let(:uri) { URI.parse 'http://example.org/index.html' }
|
6
|
+
let(:env){ Rack::MockRequest.env_for uri.to_s }
|
7
|
+
let(:request){ Flatrack::Request.new env }
|
8
|
+
let(:response){ Flatrack::Response.new request }
|
9
|
+
subject(:view){ described_class.new response }
|
10
|
+
|
11
|
+
describe '#initialize' do
|
12
|
+
it 'should set the response' do
|
13
|
+
view = described_class.allocate
|
14
|
+
expect {
|
15
|
+
view.send :initialize, response
|
16
|
+
}.to change {
|
17
|
+
view.instance_variable_get :@response
|
18
|
+
}.to response
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#get_binding' do
|
23
|
+
it 'should yield to the view_context' do
|
24
|
+
view.get_binding do
|
25
|
+
expect(self.class).to be_a described_class
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#image_tag' do
|
31
|
+
it 'should be a proper image tag' do
|
32
|
+
expect(view.image_tag 'test.png')
|
33
|
+
.to eq "<img src=\"/assets/test.png\"/>"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#javascript_tag' do
|
38
|
+
it 'should be a proper javascript tag' do
|
39
|
+
expect(view.javascript_tag :test)
|
40
|
+
.to eq "<script src=\"/assets/test.js\"></script>"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#link_to' do
|
45
|
+
it 'should be a proper link tag with a name' do
|
46
|
+
expect(view.link_to 'test', '/test.html', params: { foo: 'bar' }, class: 'test')
|
47
|
+
.to eq "<a href=\"/test.html?foo=bar\" class=\"test\">test</a>"
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should be a proper link tag without a name' do
|
51
|
+
expect(view.link_to '/test.html', params: { foo: 'bar' }, class: 'test')
|
52
|
+
.to eq "<a href=\"/test.html?foo=bar\" class=\"test\">/test.html?foo=bar</a>"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#params' do
|
57
|
+
let(:uri) { URI.parse 'http://example.org/index.html?foo=bar' }
|
58
|
+
it 'should be extracted from the uri path' do
|
59
|
+
expect(view.params).to include foo: 'bar'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe '#path' do
|
64
|
+
it 'should be extracted from the uri path' do
|
65
|
+
expect(view.path).to eq uri.path
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#stylesheet_tag' do
|
70
|
+
it 'should be a proper stylesheet tag' do
|
71
|
+
expect(view.stylesheet_tag :test)
|
72
|
+
.to eq "<link rel=\"stylesheet\" type=\"text/css\" href=\"/assets/test.css\"/>"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flatrack::Response do
|
4
|
+
include SiteHelper
|
5
|
+
|
6
|
+
describe '#render' do
|
7
|
+
it 'should render a page with a layout' do
|
8
|
+
site do
|
9
|
+
status, headers, body = get_page_response('index')
|
10
|
+
expect(status).to eq 200
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should render a page without a layout' do
|
15
|
+
site do
|
16
|
+
rm_rf 'layouts/layout.html.erb'
|
17
|
+
status, headers, body = get_page_response('index')
|
18
|
+
expect(status).to eq 200
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flatrack::Site do
|
4
|
+
let(:mock_app){ ->(env){ [200,{},['ok']]} }
|
5
|
+
let(:mock_env){ Rack::MockRequest.env_for('example.org', {}) }
|
6
|
+
|
7
|
+
it 'should be a rack app' do
|
8
|
+
expect(described_class).to respond_to :call
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should include all the proper middleware' do
|
12
|
+
allow(described_class).to receive(:site).and_return mock_app
|
13
|
+
|
14
|
+
middlewares = 2.times.map do
|
15
|
+
Class.new do
|
16
|
+
def initialize(app) @app = app end
|
17
|
+
def call(env) @app.call(env) end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Flatrack.config do |site|
|
22
|
+
middlewares.each do |middleware|
|
23
|
+
expect_any_instance_of(middleware)
|
24
|
+
.to receive(:call)
|
25
|
+
.with(mock_env)
|
26
|
+
.and_call_original
|
27
|
+
site.use middleware
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Flatrack::Site.call(mock_env)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should formulate a proper response' do
|
35
|
+
expect(Flatrack::Request).to receive(:new).and_call_original
|
36
|
+
expect_any_instance_of(Flatrack::Request).to receive(:response)
|
37
|
+
Flatrack::Site.call(mock_env)
|
38
|
+
end
|
39
|
+
end
|
data/spec/lib/flatrack_spec.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flatrack do
|
4
|
+
|
5
|
+
describe '.gem_root' do
|
6
|
+
it 'should be the root of the gem' do
|
7
|
+
expect(File.directory? described_class.gem_root).to be true
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.site_root' do
|
12
|
+
it 'should be the root of the gem' do
|
13
|
+
Dir.chdir('/') do
|
14
|
+
expect(File.directory? described_class.site_root).to be true
|
15
|
+
expect(described_class.site_root).to eq '/'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '.config' do
|
21
|
+
it 'should yield the Flatrack module' do
|
22
|
+
described_class.config do |site|
|
23
|
+
expect(site).to be_a Flatrack
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'rake/asset_tasks'
|
3
|
+
require 'coffee-script'
|
4
|
+
|
5
|
+
describe Rake::AssetTasks do
|
6
|
+
include FileUtils
|
7
|
+
|
8
|
+
before(:all) do
|
9
|
+
@rake = Rake::Application.new
|
10
|
+
Rake.application = @rake
|
11
|
+
|
12
|
+
@env = Sprockets::Environment.new(".") do |env|
|
13
|
+
env.append_path File.join Flatrack.gem_root, '../spec/fixtures/assets'
|
14
|
+
end
|
15
|
+
|
16
|
+
@dir = File.join(Dir::tmpdir, 'sprockets/manifest')
|
17
|
+
|
18
|
+
@manifest = Sprockets::Manifest.new(@env, @dir)
|
19
|
+
|
20
|
+
Rake::AssetTasks.new do |t|
|
21
|
+
t.environment = @env
|
22
|
+
t.output = @dir
|
23
|
+
t.log_level = :fatal
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
after(:all) do
|
28
|
+
Rake.application = nil
|
29
|
+
rm_rf(@dir)
|
30
|
+
expect(Dir["#{@dir}/*"]).to be_empty
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should precompile" do
|
34
|
+
digest_path = @env['application.js'].digest_path
|
35
|
+
expect(File.exist? "#{@dir}/#{digest_path}").to be false
|
36
|
+
|
37
|
+
@rake['assets:precompile'].invoke
|
38
|
+
|
39
|
+
expect(Dir["#{@dir}/manifest-*.json"]).to be_present
|
40
|
+
expect(File.exist? "#{@dir}/#{digest_path}").to be true
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should clobber" do
|
44
|
+
digest_path = @env['application.js'].digest_path
|
45
|
+
|
46
|
+
@rake['assets:precompile'].invoke
|
47
|
+
expect(File.exist? "#{@dir}/#{digest_path}").to be true
|
48
|
+
|
49
|
+
@rake['assets:clobber'].invoke
|
50
|
+
expect(File.exist? "#{@dir}/#{digest_path}").to be false
|
51
|
+
end
|
52
|
+
|
53
|
+
xit "should clean" do
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flatrack::Renderer::ERB do
|
4
|
+
include SiteHelper
|
5
|
+
|
6
|
+
let(:template) do
|
7
|
+
<<-ERB
|
8
|
+
<%= 'Hello World'.reverse %>
|
9
|
+
ERB
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should render properly' do
|
13
|
+
sha = SecureRandom.hex
|
14
|
+
site do
|
15
|
+
write_page("#{sha}.html.erb", template)
|
16
|
+
status, headers, body = get_page_response(sha)
|
17
|
+
expect(body.first).to include 'Hello World'.reverse
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flatrack::Renderer::Html do
|
4
|
+
include SiteHelper
|
5
|
+
|
6
|
+
let(:template) do
|
7
|
+
<<-HTML
|
8
|
+
<body>Hello World</body>
|
9
|
+
HTML
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should render properly' do
|
13
|
+
sha = SecureRandom.hex
|
14
|
+
site do
|
15
|
+
write_page("#{sha}.html.html", template)
|
16
|
+
status, headers, body = get_page_response(sha)
|
17
|
+
expect(body.first).to include template
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Flatrack::Renderer::Rb do
|
4
|
+
include SiteHelper
|
5
|
+
|
6
|
+
let(:template) do
|
7
|
+
<<-RUBY
|
8
|
+
'Hello World'.reverse
|
9
|
+
RUBY
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should render properly' do
|
13
|
+
sha = SecureRandom.hex
|
14
|
+
site do
|
15
|
+
write_page("#{sha}.html.rb", template)
|
16
|
+
status, headers, body = get_page_response(sha)
|
17
|
+
expect(body.first).to include 'Hello World'.reverse
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,21 @@
|
|
1
|
-
|
1
|
+
$LOAD_PATH.unshift File.expand_path File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'simplecov'
|
4
|
+
require 'coveralls'
|
5
|
+
|
6
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
7
|
+
SimpleCov::Formatter::HTMLFormatter,
|
8
|
+
Coveralls::SimpleCov::Formatter
|
9
|
+
]
|
10
|
+
SimpleCov.start do
|
11
|
+
add_filter 'spec'
|
12
|
+
end
|
2
13
|
|
3
14
|
require 'flatrack'
|
15
|
+
Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
|
4
16
|
|
5
17
|
RSpec.configure do |config|
|
6
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
7
18
|
config.run_all_when_everything_filtered = true
|
8
19
|
config.filter_run :focus
|
20
|
+
config.before(:each){ Flatrack.reset! }
|
9
21
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module SiteHelper
|
2
|
+
extend FileUtils
|
3
|
+
include FileUtils
|
4
|
+
|
5
|
+
DIR = File.join Flatrack.gem_root, '../tmp/flatrack-sites'
|
6
|
+
mkdir_p DIR
|
7
|
+
|
8
|
+
def site
|
9
|
+
sha = SecureRandom.hex
|
10
|
+
in_temp_sites do
|
11
|
+
Flatrack::CLI.start(
|
12
|
+
['new', sha, '--verbose', 'false', '--bundle', 'false']
|
13
|
+
)
|
14
|
+
Dir.chdir(sha) do
|
15
|
+
yield
|
16
|
+
end
|
17
|
+
end
|
18
|
+
cleanup sha
|
19
|
+
rescue => error
|
20
|
+
cleanup sha
|
21
|
+
raise error
|
22
|
+
end
|
23
|
+
|
24
|
+
def in_temp_sites
|
25
|
+
Dir.chdir DIR do
|
26
|
+
yield
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def write_page(filename, contents)
|
31
|
+
Dir.chdir('pages') do
|
32
|
+
File.open(filename, 'w') do |file|
|
33
|
+
file.write(contents)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_page_response(page)
|
39
|
+
env = Rack::MockRequest.env_for "http://example.org/#{page}.html"
|
40
|
+
Flatrack::Site.call(env)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def cleanup(sha)
|
46
|
+
Dir.chdir(DIR) do
|
47
|
+
rmtree sha
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
end
|
data/templates/.gitignore
CHANGED
File without changes
|
data/templates/404.html
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Not Found
|
data/templates/500.html
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Server Error
|
data/templates/Rakefile
CHANGED
data/templates/boot.rb
CHANGED
data/templates/layout.html.erb
CHANGED