flatrack 1.0.0.alpha5 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/.rubocop.yml +6 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +5 -0
  6. data/Gemfile +1 -3
  7. data/Guardfile +11 -0
  8. data/README.md +41 -10
  9. data/Rakefile +8 -1
  10. data/bin/flatrack +1 -1
  11. data/flatrack.gemspec +30 -20
  12. data/lib/flatrack.rb +50 -7
  13. data/lib/flatrack/asset_extensions.rb +2 -4
  14. data/lib/flatrack/cli.rb +71 -20
  15. data/lib/flatrack/renderer.rb +18 -7
  16. data/lib/flatrack/renderer/base.rb +2 -4
  17. data/lib/flatrack/request.rb +6 -14
  18. data/lib/flatrack/response.rb +19 -32
  19. data/lib/flatrack/response/view_context.rb +27 -40
  20. data/lib/flatrack/site.rb +27 -9
  21. data/lib/flatrack/version.rb +2 -2
  22. data/lib/rake/asset_tasks.rb +12 -12
  23. data/logo.png +0 -0
  24. data/public/assets/manifest-6d7e78baa6d2c0670a82be957315fcbc.json +1 -0
  25. data/renderers/erb.rb +1 -3
  26. data/renderers/html.rb +1 -3
  27. data/renderers/rb.rb +11 -9
  28. data/spec/fixtures/assets/application.js.coffee +2 -0
  29. data/spec/lib/flatrack/asset_extensions_spec.rb +13 -0
  30. data/spec/lib/flatrack/cli_spec.rb +58 -0
  31. data/spec/lib/flatrack/renderer/base_spec.rb +4 -0
  32. data/spec/lib/flatrack/renderer_spec.rb +4 -0
  33. data/spec/lib/flatrack/request_spec.rb +22 -0
  34. data/spec/lib/flatrack/response/view_context_spec.rb +76 -0
  35. data/spec/lib/flatrack/response_spec.rb +22 -0
  36. data/spec/lib/flatrack/site_spec.rb +39 -0
  37. data/spec/lib/flatrack_spec.rb +28 -0
  38. data/spec/lib/rake/asset_tasks_spec.rb +55 -0
  39. data/spec/renderers/erb_spec.rb +21 -0
  40. data/spec/renderers/html_spec.rb +21 -0
  41. data/spec/renderers/rb_spec.rb +21 -0
  42. data/spec/spec_helper.rb +14 -2
  43. data/spec/support/site_helper.rb +52 -0
  44. data/templates/.gitignore +2 -1
  45. data/{spec/rake/asset_tasks_spec.rb → templates/.keep} +0 -0
  46. data/templates/404.html +1 -0
  47. data/templates/500.html +1 -0
  48. data/templates/Rakefile +1 -1
  49. data/templates/boot.rb +3 -1
  50. data/templates/javascript.js.coffee +2 -0
  51. data/templates/layout.html.erb +5 -3
  52. data/templates/stylesheet.css.scss +2 -0
  53. metadata +163 -54
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe Flatrack::Renderer::Base do
4
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe Flatrack::Renderer do
4
+ end
@@ -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
@@ -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
@@ -1,9 +1,21 @@
1
- $:.unshift File.expand_path File.dirname(__FILE__)
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
@@ -1,2 +1,3 @@
1
1
  public/assets
2
- .sass-cache
2
+ .sass-cache
3
+ tmp
@@ -0,0 +1 @@
1
+ Not Found
@@ -0,0 +1 @@
1
+ Server Error
@@ -1,4 +1,4 @@
1
1
  require './boot'
2
2
  require 'rake/asset_tasks'
3
3
 
4
- Rake::AssetTasks.new
4
+ Rake::AssetTasks.new
@@ -1,4 +1,6 @@
1
+ $LOAD_PATH << File.dirname(__FILE__)
2
+
1
3
  STDOUT.sync = true
2
4
 
3
5
  require 'bundler/setup'
4
- Bundler.require(:default)
6
+ Bundler.require(:default)
@@ -0,0 +1,2 @@
1
+ #= require_self
2
+ #= require_tree
@@ -1,8 +1,10 @@
1
1
  <!DOCTYPE html>
2
2
  <head>
3
- <title><% @name %></title>
4
- <%%= stylesheet_tag :application %>
3
+ <title>
4
+ <% @name %></title>
5
+ <%%= stylesheet_tag :main %>
6
+ <%%= javascript_tag :main %>
5
7
  </head>
6
8
  <body>
7
- <%%= yield %>
9
+ <%%= yield %>
8
10
  </body>