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.
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>