curly-templates 2.5.0 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +20 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +3 -0
  5. data/.yardopts +3 -0
  6. data/CHANGELOG.md +28 -0
  7. data/Gemfile +4 -2
  8. data/README.md +76 -3
  9. data/Rakefile +3 -116
  10. data/circle.yml +1 -1
  11. data/curly-templates.gemspec +6 -83
  12. data/lib/curly.rb +1 -1
  13. data/lib/curly/compiler.rb +2 -12
  14. data/lib/curly/component_compiler.rb +6 -3
  15. data/lib/curly/presenter.rb +32 -20
  16. data/lib/curly/presenter_name_error.rb +16 -0
  17. data/lib/curly/rspec.rb +16 -0
  18. data/lib/curly/version.rb +3 -0
  19. metadata +14 -72
  20. data/perf/compile_benchmark.rb +0 -71
  21. data/perf/compile_profile.rb +0 -64
  22. data/perf/component_benchmark.rb +0 -41
  23. data/spec/attribute_scanner_spec.rb +0 -44
  24. data/spec/collection_blocks_spec.rb +0 -78
  25. data/spec/compiler/collections_spec.rb +0 -230
  26. data/spec/compiler/context_blocks_spec.rb +0 -106
  27. data/spec/compiler_spec.rb +0 -192
  28. data/spec/component_compiler_spec.rb +0 -107
  29. data/spec/component_scanner_spec.rb +0 -36
  30. data/spec/components_spec.rb +0 -43
  31. data/spec/conditional_blocks_spec.rb +0 -40
  32. data/spec/dummy/.gitignore +0 -1
  33. data/spec/dummy/app/controllers/application_controller.rb +0 -2
  34. data/spec/dummy/app/controllers/dashboards_controller.rb +0 -14
  35. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  36. data/spec/dummy/app/presenters/dashboards/collection_presenter.rb +0 -7
  37. data/spec/dummy/app/presenters/dashboards/item_presenter.rb +0 -23
  38. data/spec/dummy/app/presenters/dashboards/new_presenter.rb +0 -29
  39. data/spec/dummy/app/presenters/dashboards/partials_presenter.rb +0 -5
  40. data/spec/dummy/app/presenters/dashboards/show_presenter.rb +0 -12
  41. data/spec/dummy/app/presenters/layouts/application_presenter.rb +0 -21
  42. data/spec/dummy/app/views/dashboards/_item.html.curly +0 -1
  43. data/spec/dummy/app/views/dashboards/collection.html.curly +0 -8
  44. data/spec/dummy/app/views/dashboards/new.html.curly +0 -7
  45. data/spec/dummy/app/views/dashboards/partials.html.curly +0 -3
  46. data/spec/dummy/app/views/dashboards/show.html.curly +0 -3
  47. data/spec/dummy/app/views/layouts/application.html.curly +0 -11
  48. data/spec/dummy/config.ru +0 -4
  49. data/spec/dummy/config/application.rb +0 -12
  50. data/spec/dummy/config/boot.rb +0 -5
  51. data/spec/dummy/config/environment.rb +0 -5
  52. data/spec/dummy/config/environments/test.rb +0 -36
  53. data/spec/dummy/config/routes.rb +0 -6
  54. data/spec/generators/controller_generator_spec.rb +0 -34
  55. data/spec/integration/application_layout_spec.rb +0 -22
  56. data/spec/integration/collection_blocks_spec.rb +0 -37
  57. data/spec/integration/context_blocks_spec.rb +0 -27
  58. data/spec/integration/partials_spec.rb +0 -24
  59. data/spec/matchers/have_structure.rb +0 -29
  60. data/spec/parser_spec.rb +0 -92
  61. data/spec/presenter_spec.rb +0 -247
  62. data/spec/scanner_spec.rb +0 -124
  63. data/spec/spec_helper.rb +0 -45
  64. data/spec/syntax_error_spec.rb +0 -12
  65. data/spec/template_handler_spec.rb +0 -209
@@ -1,5 +0,0 @@
1
- module ApplicationHelper
2
- def welcome_message
3
- "Welcome!"
4
- end
5
- end
@@ -1,7 +0,0 @@
1
- class Dashboards::CollectionPresenter < Curly::Presenter
2
- presents :items, :name
3
-
4
- def items
5
- @items
6
- end
7
- end
@@ -1,23 +0,0 @@
1
- class Dashboards::ItemPresenter < Curly::Presenter
2
- presents :item, :name
3
-
4
- def item
5
- @item
6
- end
7
-
8
- def name
9
- @name
10
- end
11
-
12
- def subitems
13
- %w[1 2 3]
14
- end
15
-
16
- class SubitemPresenter < Curly::Presenter
17
- presents :item, :subitem
18
-
19
- def name
20
- @subitem
21
- end
22
- end
23
- end
@@ -1,29 +0,0 @@
1
- class Dashboards::NewPresenter < Curly::Presenter
2
- presents :name
3
-
4
- def form(&block)
5
- form_for(:dashboard, &block)
6
- end
7
-
8
- class FormPresenter < Curly::Presenter
9
- presents :form, :name
10
-
11
- def name_field(&block)
12
- content_tag :div, class: "field" do
13
- block.call
14
- end
15
- end
16
-
17
- class NameFieldPresenter < Curly::Presenter
18
- presents :form, :name
19
-
20
- def label
21
- "Name"
22
- end
23
-
24
- def input
25
- @form.text_field :name, value: @name
26
- end
27
- end
28
- end
29
- end
@@ -1,5 +0,0 @@
1
- class Dashboards::PartialsPresenter < Curly::Presenter
2
- def items
3
- render partial: 'item', collection: ["One", "Two"], locals: { name: "yo" }
4
- end
5
- end
@@ -1,12 +0,0 @@
1
- class Dashboards::ShowPresenter < Curly::Presenter
2
- presents :message
3
-
4
- def message
5
- @message
6
- end
7
-
8
- def welcome
9
- # This is a helper method:
10
- welcome_message
11
- end
12
- end
@@ -1,21 +0,0 @@
1
- class Layouts::ApplicationPresenter < Curly::Presenter
2
- def title
3
- "Dummy app"
4
- end
5
-
6
- def content
7
- yield
8
- end
9
-
10
- def header(&block)
11
- block.call
12
- end
13
-
14
- class HeaderPresenter < Curly::Presenter
15
-
16
- def title
17
- "Dummy app"
18
- end
19
- end
20
-
21
- end
@@ -1 +0,0 @@
1
- <li>{{item}} ({{name}})</li>
@@ -1,8 +0,0 @@
1
- <ul>
2
- {{*items}}
3
- <li>{{item}}</li>
4
- <ul>
5
- {{*subitems}}<li>{{name}}</li>{{/subitems}}
6
- </ul>
7
- {{/items}}
8
- </ul>
@@ -1,7 +0,0 @@
1
- {{@form}}
2
- {{@name_field}}
3
- <b>{{label}}</b> {{input}}
4
- {{/name_field}}
5
- {{/form}}
6
-
7
- <p>Thank you!</p>
@@ -1,3 +0,0 @@
1
- <ul>
2
- {{items}}
3
- </ul>
@@ -1,3 +0,0 @@
1
- <h1>Dashboard</h1>
2
- <p>{{message}}</p>
3
- <p>{{welcome}}</p>
@@ -1,11 +0,0 @@
1
- <html>
2
- <head>
3
- <title>{{title}}</title>
4
- </head>
5
- <body>
6
- {{@header}}<header>
7
- <h1>{{title}}</h1>
8
- </header>{{/header}}
9
- {{content}}
10
- </body>
11
- </html>
data/spec/dummy/config.ru DELETED
@@ -1,4 +0,0 @@
1
- # This file is used by Rack-based servers to start the application.
2
-
3
- require ::File.expand_path('../config/environment', __FILE__)
4
- run Rails.application
@@ -1,12 +0,0 @@
1
- require File.expand_path('../boot', __FILE__)
2
-
3
- require 'action_controller/railtie'
4
-
5
- Bundler.require(*Rails.groups)
6
- require "curly"
7
-
8
- module Dummy
9
- class Application < Rails::Application
10
- end
11
- end
12
-
@@ -1,5 +0,0 @@
1
- # Set up gems listed in the Gemfile.
2
- ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__)
3
-
4
- require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
5
- $LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__)
@@ -1,5 +0,0 @@
1
- # Load the Rails application.
2
- require File.expand_path('../application', __FILE__)
3
-
4
- # Initialize the Rails application.
5
- Rails.application.initialize!
@@ -1,36 +0,0 @@
1
- Rails.application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb.
3
-
4
- # The test environment is used exclusively to run your application's
5
- # test suite. You never need to work with it otherwise. Remember that
6
- # your test database is "scratch space" for the test suite and is wiped
7
- # and recreated between test runs. Don't rely on the data there!
8
- config.cache_classes = true
9
-
10
- # Do not eager load code on boot. This avoids loading your whole application
11
- # just for the purpose of running a single test. If you are using a tool that
12
- # preloads Rails for running tests, you may have to set it to true.
13
- config.eager_load = false
14
-
15
- # Configure static asset server for tests with Cache-Control for performance.
16
- config.serve_static_files = true
17
- config.static_cache_control = 'public, max-age=3600'
18
-
19
- # Show full error reports and disable caching.
20
- config.consider_all_requests_local = true
21
- config.action_controller.perform_caching = false
22
-
23
- # Raise exceptions instead of rendering exception templates.
24
- config.action_dispatch.show_exceptions = false
25
-
26
- # Disable request forgery protection in test environment.
27
- config.action_controller.allow_forgery_protection = false
28
-
29
- # Print deprecation notices to the stderr.
30
- config.active_support.deprecation = :stderr
31
-
32
- # Raises error for missing translations
33
- # config.action_view.raise_on_missing_translations = true
34
-
35
- config.secret_key_base = "yolo"
36
- end
@@ -1,6 +0,0 @@
1
- Rails.application.routes.draw do
2
- root to: "dashboards#show"
3
- get "/collection", to: "dashboards#collection"
4
- get "/partials", to: "dashboards#partials"
5
- get "/new", to: "dashboards#new"
6
- end
@@ -1,34 +0,0 @@
1
- require 'genspec'
2
- require 'generators/curly/controller/controller_generator'
3
-
4
- describe Curly::Generators::ControllerGenerator do
5
- with_args "animals/cows", "foo"
6
-
7
- it "generates a Curly template for each action" do
8
- subject.should generate("app/views/animals/cows/foo.html.curly") {|content|
9
- expected_content = "<h1>Animals::Cows#foo</h1>\n" +
10
- "<p>Find me in app/views/animals/cows/foo.html.curly</p>\n"
11
-
12
- content.should == expected_content
13
- }
14
- end
15
-
16
- it "generates a Curly presenter for each action" do
17
- subject.should generate("app/presenters/animals/cows/foo_presenter.rb") {|content|
18
- expected_content = (<<-RUBY).gsub(/^\s{8}/, "")
19
- class Animals::Cows::FooPresenter < Curly::Presenter
20
- # If you need to assign variables to the presenter, you can use the
21
- # `presents` method.
22
- #
23
- # presents :foo, :bar
24
- #
25
- # Any public method defined in a presenter class will be available
26
- # to the Curly template as a variable. Consider making these methods
27
- # idempotent.
28
- end
29
- RUBY
30
-
31
- content.should == expected_content
32
- }
33
- end
34
- end
@@ -1,22 +0,0 @@
1
- describe "Using Curly for the application layout", type: :request do
2
- example "A simple layout view" do
3
- get '/'
4
-
5
- response.body.should == <<-HTML.strip_heredoc
6
- <html>
7
- <head>
8
- <title>Dummy app</title>
9
- </head>
10
- <body>
11
- <header>
12
- <h1>Dummy app</h1>
13
- </header>
14
- <h1>Dashboard</h1>
15
- <p>Hello, World!</p>
16
- <p>Welcome!</p>
17
-
18
- </body>
19
- </html>
20
- HTML
21
- end
22
- end
@@ -1,37 +0,0 @@
1
- describe "Collection blocks", type: :request do
2
- example "Rendering collections" do
3
- get '/collection'
4
-
5
- response.body.should == <<-HTML.strip_heredoc
6
- <html>
7
- <head>
8
- <title>Dummy app</title>
9
- </head>
10
- <body>
11
- <header>
12
- <h1>Dummy app</h1>
13
- </header>
14
- <ul>
15
-
16
- <li>uno</li>
17
- <ul>
18
- <li>1</li><li>2</li><li>3</li>
19
- </ul>
20
-
21
- <li>dos</li>
22
- <ul>
23
- <li>1</li><li>2</li><li>3</li>
24
- </ul>
25
-
26
- <li>tres!</li>
27
- <ul>
28
- <li>1</li><li>2</li><li>3</li>
29
- </ul>
30
-
31
- </ul>
32
-
33
- </body>
34
- </html>
35
- HTML
36
- end
37
- end
@@ -1,27 +0,0 @@
1
- require 'matchers/have_structure'
2
-
3
- describe "Context blocks", type: :request do
4
- example "A context block" do
5
- get '/new'
6
-
7
- response.body.should have_structure <<-HTML.strip_heredoc
8
- <html>
9
- <head>
10
- <title>Dummy app</title>
11
- </head>
12
- <body>
13
- <header>
14
- <h1>Dummy app</h1>
15
- </header>
16
- <form accept-charset="UTF-8" action="/new" method="post"><input name="utf8" type="hidden" value="&#x2713;" />
17
- <div class="field">
18
- <b>Name</b> <input id="dashboard_name" name="dashboard[name]" type="text" value="test" />
19
- </div>
20
- </form>
21
-
22
- <p>Thank you!</p>
23
- </body>
24
- </html>
25
- HTML
26
- end
27
- end
@@ -1,24 +0,0 @@
1
- describe "Using Curly for Rails partials", type: :request do
2
- example "Rendering a partial" do
3
- get '/partials'
4
-
5
- response.body.should == <<-HTML.strip_heredoc
6
- <html>
7
- <head>
8
- <title>Dummy app</title>
9
- </head>
10
- <body>
11
- <header>
12
- <h1>Dummy app</h1>
13
- </header>
14
- <ul>
15
- <li>One (yo)</li>
16
- <li>Two (yo)</li>
17
-
18
- </ul>
19
-
20
- </body>
21
- </html>
22
- HTML
23
- end
24
- end
@@ -1,29 +0,0 @@
1
- require 'rspec/expectations'
2
- require 'nokogiri'
3
-
4
- RSpec::Matchers.define(:have_structure) do |expected|
5
- match do |actual|
6
- normalized(actual).should == normalized(expected)
7
- end
8
-
9
- failure_message_for_should do |actual|
10
- "Expected\n\n#{actual}\n\n" \
11
- "to have the same structure as\n\n#{expected}"
12
- end
13
-
14
- failure_message_for_should_not do |actual|
15
- "Expected\n\n#{actual}\n\n" \
16
- "to NOT have the same canonicalized structure as\n\n#{expected}"
17
- end
18
-
19
- def normalized(text)
20
- document = Nokogiri::XML("<snippet>#{text}</snippet>")
21
- document.traverse do |node|
22
- node.content = node.text.strip if node.text?
23
- end
24
-
25
- document.canonicalize do |node, parent|
26
- !(node.text? && node.text.empty?)
27
- end
28
- end
29
- end
data/spec/parser_spec.rb DELETED
@@ -1,92 +0,0 @@
1
- describe Curly::Parser do
2
- it "parses component tokens" do
3
- tokens = [
4
- [:component, "a", nil, {}],
5
- ]
6
-
7
- parse(tokens).should == [
8
- component("a")
9
- ]
10
- end
11
-
12
- it "parses conditional blocks" do
13
- tokens = [
14
- [:conditional_block_start, "a?", nil, {}],
15
- [:component, "hello", nil, {}],
16
- [:block_end, "a?", nil],
17
- ]
18
-
19
- parse(tokens).should == [
20
- conditional_block(component("a?"), [component("hello")])
21
- ]
22
- end
23
-
24
- it "parses inverse conditional blocks" do
25
- tokens = [
26
- [:inverse_conditional_block_start, "a?", nil, {}],
27
- [:component, "hello", nil, {}],
28
- [:block_end, "a?", nil],
29
- ]
30
-
31
- parse(tokens).should == [
32
- inverse_conditional_block(component("a?"), [component("hello")])
33
- ]
34
- end
35
-
36
- it "parses collection blocks" do
37
- tokens = [
38
- [:collection_block_start, "mice", nil, {}],
39
- [:component, "hello", nil, {}],
40
- [:block_end, "mice", nil],
41
- ]
42
-
43
- parse(tokens).should == [
44
- collection_block(component("mice"), [component("hello")])
45
- ]
46
- end
47
-
48
- it "fails if a block is not closed" do
49
- tokens = [
50
- [:collection_block_start, "mice", nil, {}],
51
- ]
52
-
53
- expect { parse(tokens) }.to raise_exception(Curly::IncompleteBlockError)
54
- end
55
-
56
- it "fails if a block is closed with the wrong component" do
57
- tokens = [
58
- [:collection_block_start, "mice", nil, {}],
59
- [:block_end, "men", nil, {}],
60
- ]
61
-
62
- expect { parse(tokens) }.to raise_exception(Curly::IncorrectEndingError)
63
- end
64
-
65
- it "fails if there is a closing component too many" do
66
- tokens = [
67
- [:block_end, "world", nil, {}],
68
- ]
69
-
70
- expect { parse(tokens) }.to raise_exception(Curly::IncorrectEndingError)
71
- end
72
-
73
- def parse(tokens)
74
- described_class.parse(tokens)
75
- end
76
-
77
- def component(*args)
78
- Curly::Parser::Component.new(*args)
79
- end
80
-
81
- def conditional_block(*args)
82
- Curly::Parser::Block.new(:conditional, *args)
83
- end
84
-
85
- def inverse_conditional_block(*args)
86
- Curly::Parser::Block.new(:inverse_conditional, *args)
87
- end
88
-
89
- def collection_block(*args)
90
- Curly::Parser::Block.new(:collection, *args)
91
- end
92
- end