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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 771f76ff2fc6fc4e3947ee8a205897a9930a02cc
4
- data.tar.gz: 98c36121c84ad15081e32868ca1c8613365ea6ed
3
+ metadata.gz: 8dc47b05807f9a31c5c14d714c1f2edc3b0f8544
4
+ data.tar.gz: 79e7274d887bde4a5078e2573fa923682b58aa2b
5
5
  SHA512:
6
- metadata.gz: 9893fb5b0c90b082c462128dd4bbd889d375f2913c703ae52b9d97cdb6dcf2de54f92e08032d8efd1007815a50672820bc5902a71fc5001723213719575bac29
7
- data.tar.gz: 6ba0441db8486cdf248debd4e9d7f95d5ef8eafb2cbb53153684b5367679ada012206b289285a8c65eb94455c3a33b91209457814cf46829faf76f77f179bfc3
6
+ metadata.gz: 51eff4770731f8c3aadf3342595c0d8e513d0931790443bb0b8372376bf4893fc3c0ce82ad78542f1c70cc5aba151b696d7c7fda61c5e3e2f76b2b2c0ca41c62
7
+ data.tar.gz: 67015325572d49db533fab92f11319670074531ef424bb5182124e3d0ce3f85413338b488b000673566e05e80aca15ec99ce7886f6e3c06145d731e82f1723cf
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
19
+ Gemfile.lock
20
+ /bin
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ -r spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --plugin yard-tomdoc
2
+ --markup-provider=redcarpet
3
+ --markup=markdown
data/CHANGELOG.md CHANGED
@@ -1,5 +1,33 @@
1
1
  ### Unreleased
2
2
 
3
+ ### Curly 2.6.0 (July 4, 2016)
4
+
5
+ * Add support for Rails 5.
6
+
7
+ * Add support for arbitrary component attributes. If the presenter method accepts
8
+ arbitrary keyword arguments, the corresponding component is allowed to pass
9
+ any attribute it wants.
10
+
11
+ *Jeremy Rodi*
12
+
13
+ * Add support for testing presenters with RSpec:
14
+
15
+ ```ruby\
16
+ require 'curly/rspec'
17
+
18
+ # spec/presenters/posts/show_presenter_spec.rb
19
+ describe Posts::ShowPresenter, type: :presenter do
20
+ describe "#body" do
21
+ it "renders the post's body as Markdown" do
22
+ assign(:post, double(:post, body: "**hello!**"))
23
+ expect(presenter.body).to eq "<strong>hello!</strong>"
24
+ end
25
+ end
26
+ end
27
+ ```
28
+
29
+ *Daniel Schierbeck*
30
+
3
31
  ### Curly 2.5.0 (May 19, 2015)
4
32
 
5
33
  * Allow passing a block as the `default:` option to `presents`.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org/'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
@@ -7,8 +7,10 @@ platform :ruby do
7
7
  gem 'yard-tomdoc'
8
8
  gem 'redcarpet'
9
9
  gem 'github-markup'
10
- gem 'rails', '~> 4.2.0', require: false
10
+ gem 'rails', '~> 5.0.0', require: false
11
11
  gem 'rspec-rails', require: false
12
12
  gem 'benchmark-ips', require: false
13
13
  gem 'stackprof', require: false
14
14
  end
15
+
16
+ gem 'genspec', github: "bquorning/genspec", ref: "rails-5-support"
data/README.md CHANGED
@@ -21,7 +21,8 @@ to a presenter class.
21
21
  3. [Presenters](#presenters)
22
22
  1. [Layouts and content blocks](#layouts-and-content-blocks)
23
23
  2. [Rails helper methods](#rails-helper-methods)
24
- 3. [Examples](#examples)
24
+ 3. [Testing](#testing)
25
+ 4. [Examples](#examples)
25
26
  4. [Caching](#caching)
26
27
 
27
28
 
@@ -151,7 +152,28 @@ All argument values will be strings. A compilation error will be raised if
151
152
  - a required keyword argument in the method definition is not set as an attribute in the
152
153
  component.
153
154
 
154
- You can define default values using Ruby's own syntax.
155
+ You can define default values using Ruby's own syntax. Additionally, if the presenter
156
+ method accepts arbitrary keyword arguments using the `**doublesplat` syntax then all
157
+ attributes will be valid for the component, e.g.
158
+
159
+ ```ruby
160
+ def greetings(**names)
161
+ names.map {|name, greeting| "#{name}: #{greeting}!" }.join("\n")
162
+ end
163
+ ```
164
+
165
+ ```html
166
+ {{greetings alice=hello bob=hi}}
167
+ <!-- The above would be rendered as: -->
168
+ alice: hello!
169
+ bob: hi!
170
+ ```
171
+
172
+ Note that since keyword arguments in Ruby are represented as Symbol objects, which are
173
+ not garbage collected in Ruby versions less than 2.2, accepting arbitrary attributes
174
+ represents a security vulnerability if your application allows untrusted Curly templates
175
+ to be rendered. Only use this feature with trusted templates if you're not on Ruby 2.2
176
+ yet.
155
177
 
156
178
 
157
179
  ### Conditional blocks
@@ -512,6 +534,57 @@ end
512
534
  ```
513
535
 
514
536
 
537
+ ### Testing
538
+
539
+ Presenters can be tested directly, but sometimes it makes sense to integrate with
540
+ Rails on some levels. Currently, only RSpec is directly supported, but you can
541
+ easily instantiate a presenter:
542
+
543
+ ```ruby
544
+ SomePresenter.new(context, assigns)
545
+ ```
546
+
547
+ `context` is a view context, i.e. an object that responds to `render`, has all
548
+ the helper methods you expect, etc. You can pass in a test double and see what
549
+ you need to stub out. `assigns` is the hash containing the controller and local
550
+ assigns. You need to pass in a key for each argument the presenter expects.
551
+
552
+ #### Testing with RSpec
553
+
554
+ In order to test presenters with RSpec, make sure you have `rspec-rails` in your
555
+ Gemfile. Given the following presenter:
556
+
557
+ ```ruby
558
+ # app/presenters/posts/show_presenter.rb
559
+ class Posts::ShowPresenter < Curly::Presenter
560
+ presents :post
561
+
562
+ def body
563
+ Markdown.render(@post.body)
564
+ end
565
+ end
566
+ ```
567
+
568
+ You can test the presenter methods like this:
569
+
570
+ ```ruby
571
+ # You can put this in your `spec_helper.rb`.
572
+ require 'curly/rspec'
573
+
574
+ # spec/presenters/posts/show_presenter_spec.rb
575
+ describe Posts::ShowPresenter, type: :presenter do
576
+ describe "#body" do
577
+ it "renders the post's body as Markdown" do
578
+ assign(:post, double(:post, body: "**hello!**"))
579
+ expect(presenter.body).to eq "<strong>hello!</strong>"
580
+ end
581
+ end
582
+ end
583
+ ```
584
+
585
+ Note that your spec *must* be tagged with `type: :presenter`.
586
+
587
+
515
588
  ### Examples
516
589
 
517
590
  Here is a simple Curly template – it will be looked up by Rails automatically.
@@ -698,7 +771,7 @@ Thanks to [Zendesk](http://zendesk.com/) for sponsoring the work on Curly.
698
771
 
699
772
  - Daniel Schierbeck ([@dasch](https://github.com/dasch))
700
773
  - Benjamin Quorning ([@bquorning](https://github.com/bquorning))
701
- - Jeremy Rodi ([@redjazz96](https://github.com/redjazz96))
774
+ - Jeremy Rodi ([@medcat](https://github.com/medcat))
702
775
  - Alisson Cavalcante Agiani ([@thelinuxlich](https://github.com/thelinuxlich))
703
776
  - Łukasz Niemier ([@hauleth](https://github.com/hauleth))
704
777
  - Cristian Planas ([@Gawyn](https://github.com/Gawyn))
data/Rakefile CHANGED
@@ -1,119 +1,6 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- require 'rake'
4
- require 'date'
5
-
6
- Bundler.setup
7
-
8
- #############################################################################
9
- #
10
- # Helper functions
11
- #
12
- #############################################################################
13
-
14
- def name
15
- "curly"
16
- end
17
-
18
- def gem_name
19
- "#{name}-templates"
20
- end
21
-
22
- def version
23
- line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
24
- line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
25
- end
26
-
27
- def date
28
- Date.today.to_s
29
- end
30
-
31
- def gemspec_file
32
- "#{gem_name}.gemspec"
33
- end
34
-
35
- def gem_file
36
- "#{gem_name}-#{version}.gem"
37
- end
38
-
39
- def replace_header(head, header_name, value = nil)
40
- value ||= send(header_name)
41
- head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{value}'"}
42
- end
43
-
44
- #############################################################################
45
- #
46
- # Standard tasks
47
- #
48
- #############################################################################
49
-
50
- task :default => :spec
51
-
1
+ require 'bundler/gem_tasks'
52
2
  require 'rspec/core/rake_task'
53
- RSpec::Core::RakeTask.new(:spec)
54
-
55
- desc "Open an irb session preloaded with this library"
56
- task :console do
57
- sh "irb -rubygems -r ./lib/#{name}.rb"
58
- end
59
-
60
- #############################################################################
61
- #
62
- # Packaging tasks
63
- #
64
- #############################################################################
65
-
66
- desc "Create tag v#{version} and build and push #{gem_file} to Rubygems"
67
- task :release => :build do
68
- unless `git branch` =~ /^\* master$/
69
- puts "You must be on the master branch to release!"
70
- exit!
71
- end
72
- sh "git commit --allow-empty -a -m 'Release #{version}'"
73
- sh "git tag v#{version}"
74
- sh "git push origin master"
75
- sh "git push origin v#{version}"
76
- sh "gem push pkg/#{gem_name}-#{version}.gem"
77
- end
78
-
79
- desc "Build #{gem_file} into the pkg directory"
80
- task :build => :gemspec do
81
- sh "mkdir -p pkg"
82
- sh "gem build #{gemspec_file}"
83
- sh "mv #{gem_file} pkg"
84
- end
85
3
 
86
- desc "Generate #{gemspec_file}"
87
- task :gemspec => :validate do
88
- # read spec file and split out manifest section
89
- spec = File.read(gemspec_file)
90
- head, manifest, tail = spec.split(" # = MANIFEST =\n")
91
-
92
- # replace name version and date
93
- replace_header(head, :name, gem_name)
94
- replace_header(head, :version)
95
- replace_header(head, :date)
96
-
97
- # determine file list from git ls-files
98
- files = `git ls-files`.
99
- split("\n").
100
- sort.
101
- reject { |file| file =~ /^\./ }.
102
- reject { |file| file =~ /^(rdoc|pkg)/ }.
103
- map { |file| " #{file}" }.
104
- join("\n")
105
-
106
- # piece file back together and write
107
- manifest = " s.files = %w[\n#{files}\n ]\n"
108
- spec = [head, manifest, tail].join(" # = MANIFEST =\n")
109
- File.open(gemspec_file, 'w') { |io| io.write(spec) }
110
- puts "Updated #{gemspec_file}"
111
- end
4
+ RSpec::Core::RakeTask.new(:spec)
112
5
 
113
- desc "Validate #{gemspec_file}"
114
- task :validate do
115
- unless Dir['VERSION*'].empty?
116
- puts "A `VERSION` file at root level violates Gem best practices."
117
- exit!
118
- end
119
- end
6
+ task :default => :spec
data/circle.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  machine:
2
2
  ruby:
3
- version: 2.1.5
3
+ version: 2.2.3
4
4
  dependencies:
5
5
  post:
6
6
  - bundle install
@@ -1,10 +1,12 @@
1
+ require './lib/curly/version'
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.specification_version = 2 if s.respond_to? :specification_version=
3
5
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
6
  s.rubygems_version = '1.3.5'
5
7
 
6
8
  s.name = 'curly-templates'
7
- s.version = '2.5.0'
9
+ s.version = Curly::VERSION
8
10
  s.date = '2015-05-19'
9
11
 
10
12
  s.summary = "Free your views!"
@@ -19,92 +21,13 @@ Gem::Specification.new do |s|
19
21
 
20
22
  s.rdoc_options = ["--charset=UTF-8"]
21
23
 
22
- s.add_dependency("actionpack", [">= 3.1", "< 5.0"])
24
+ s.add_dependency("actionpack", [">= 3.1", "< 5.1"])
23
25
 
24
- s.add_development_dependency("railties", [">= 3.1", "< 5.0"])
26
+ s.add_development_dependency("railties", [">= 3.1", "< 5.1"])
25
27
  s.add_development_dependency("rake")
26
28
  s.add_development_dependency("rspec", "~> 2.12")
27
29
  s.add_development_dependency("genspec")
28
30
 
29
- # = MANIFEST =
30
- s.files = %w[
31
- CHANGELOG.md
32
- CONTRIBUTING.md
33
- Gemfile
34
- README.md
35
- Rakefile
36
- circle.yml
37
- curly-templates.gemspec
38
- lib/curly-templates.rb
39
- lib/curly.rb
40
- lib/curly/attribute_scanner.rb
41
- lib/curly/compiler.rb
42
- lib/curly/component_compiler.rb
43
- lib/curly/component_scanner.rb
44
- lib/curly/dependency_tracker.rb
45
- lib/curly/error.rb
46
- lib/curly/incomplete_block_error.rb
47
- lib/curly/incorrect_ending_error.rb
48
- lib/curly/invalid_component.rb
49
- lib/curly/parser.rb
50
- lib/curly/presenter.rb
51
- lib/curly/presenter_not_found.rb
52
- lib/curly/railtie.rb
53
- lib/curly/scanner.rb
54
- lib/curly/syntax_error.rb
55
- lib/curly/template_handler.rb
56
- lib/generators/curly/controller/controller_generator.rb
57
- lib/generators/curly/controller/templates/presenter.rb.erb
58
- lib/generators/curly/controller/templates/view.html.curly.erb
59
- lib/rails/projections.json
60
- perf/compile_benchmark.rb
61
- perf/compile_profile.rb
62
- perf/component_benchmark.rb
63
- spec/attribute_scanner_spec.rb
64
- spec/collection_blocks_spec.rb
65
- spec/compiler/collections_spec.rb
66
- spec/compiler/context_blocks_spec.rb
67
- spec/compiler_spec.rb
68
- spec/component_compiler_spec.rb
69
- spec/component_scanner_spec.rb
70
- spec/components_spec.rb
71
- spec/conditional_blocks_spec.rb
72
- spec/dummy/.gitignore
73
- spec/dummy/app/controllers/application_controller.rb
74
- spec/dummy/app/controllers/dashboards_controller.rb
75
- spec/dummy/app/helpers/application_helper.rb
76
- spec/dummy/app/presenters/dashboards/collection_presenter.rb
77
- spec/dummy/app/presenters/dashboards/item_presenter.rb
78
- spec/dummy/app/presenters/dashboards/new_presenter.rb
79
- spec/dummy/app/presenters/dashboards/partials_presenter.rb
80
- spec/dummy/app/presenters/dashboards/show_presenter.rb
81
- spec/dummy/app/presenters/layouts/application_presenter.rb
82
- spec/dummy/app/views/dashboards/_item.html.curly
83
- spec/dummy/app/views/dashboards/collection.html.curly
84
- spec/dummy/app/views/dashboards/new.html.curly
85
- spec/dummy/app/views/dashboards/partials.html.curly
86
- spec/dummy/app/views/dashboards/show.html.curly
87
- spec/dummy/app/views/layouts/application.html.curly
88
- spec/dummy/config.ru
89
- spec/dummy/config/application.rb
90
- spec/dummy/config/boot.rb
91
- spec/dummy/config/environment.rb
92
- spec/dummy/config/environments/test.rb
93
- spec/dummy/config/routes.rb
94
- spec/generators/controller_generator_spec.rb
95
- spec/integration/application_layout_spec.rb
96
- spec/integration/collection_blocks_spec.rb
97
- spec/integration/context_blocks_spec.rb
98
- spec/integration/partials_spec.rb
99
- spec/matchers/have_structure.rb
100
- spec/parser_spec.rb
101
- spec/presenter_spec.rb
102
- spec/scanner_spec.rb
103
- spec/spec_helper.rb
104
- spec/syntax_error_spec.rb
105
- spec/template_handler_spec.rb
106
- ]
107
- # = MANIFEST =
108
-
31
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(perf|spec)/}) }
109
32
  s.test_files = s.files.select { |path| path =~ /^spec\/.*_spec\.rb/ }
110
33
  end