keynote 0.3.1 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 47958b0ca9563a46f28a202ea59a741acbf676a2
4
- data.tar.gz: 9a55df1090430b85ca9b497cd078301a98024e3c
3
+ metadata.gz: 4bb2837127985cda52b837475d149b7a0445de3d
4
+ data.tar.gz: 1c76f12e8ab9ac25fbcd18183d3e5687a560faed
5
5
  SHA512:
6
- metadata.gz: a959170d01ffa63fca236402d1463354f7546009ec6ba1c92b304d6b4bb7070b00eb22d496721c85420dcac5fe5a4c584bbd6ab084973dd7476df478238e40cc
7
- data.tar.gz: 67d243d0e99eb17291f58f889f7f6bafcb853649585a8a58a9b2eb7211d770650b6f26abf5d6f4d4fa2164f4e6527e61f6ea5896711e68205168f99703a18dea
6
+ metadata.gz: a95130c4b619eefa804e6bb2df56eb1f07271a7163e63f7b635aaa518485e7dc252ef41102325b8f09f5a0c7dd21aeb62045ed579a43262843b403d188e23258
7
+ data.tar.gz: 713dd5c6bbb3d69dc74e5e15360706ab61b92b81cfef00169279ddfb30dde8577ce2d7e680566d88a549d9908d65539ad57a8d1ddfff2207ae27cae37bfbe0e9
@@ -1,31 +1,11 @@
1
- language: ruby
2
- rvm:
3
- - 2.1.9
4
- - 2.2.5
5
- - 2.3.1
6
- - jruby-9.1.5.0
7
- gemfile:
8
- - gemfiles/rails31.gemfile
9
- - gemfiles/rails32.gemfile
10
- - gemfiles/rails40.gemfile
11
- - gemfiles/rails41.gemfile
12
- - gemfiles/rails42.gemfile
13
- - gemfiles/rails50.gemfile
14
- matrix:
15
- exclude:
16
- - rvm: 2.2.5
17
- gemfile: gemfiles/rails31.gemfile
18
- - rvm: 2.2.5
19
- gemfile: gemfiles/rails32.gemfile
20
- - rvm: 2.3.1
21
- gemfile: gemfiles/rails31.gemfile
22
- - rvm: 2.3.1
23
- gemfile: gemfiles/rails32.gemfile
24
- - rvm: jruby-9.1.5.0
25
- gemfile: gemfiles/rails31.gemfile
26
- - rvm: jruby-9.1.5.0
27
- gemfile: gemfiles/rails32.gemfile
28
- - rvm: 2.1.9
29
- gemfile: gemfiles/rails50.gemfile
1
+ sudo: required
2
+ services:
3
+ - docker
4
+ before_install:
5
+ - wget https://github.com/rf-/roadshow/releases/download/v1.0.0/roadshow-linux64
6
+ - chmod +x roadshow-linux64
7
+ install: "true" # disable default `bundle install`
8
+ script:
9
+ - ./roadshow-linux64 run
30
10
  notifications:
31
11
  email: false
@@ -1,3 +1,15 @@
1
+ ## v1.0.0
2
+ * Add support for Rails 5.1.
3
+ * Fix all Ruby warnings generated by Keynote itself.
4
+ * Rumble: Always escape quotation marks in HTML attributes, even if the string
5
+ is already marked as HTML-safe.
6
+ * Rumble: Allow user to pass in a `data` hash to generate data attributes.
7
+ * Rumble: Allow user to pass in an array value for an attribute, which will be
8
+ joined by spaces.
9
+
10
+ ## v0.3.1
11
+ * Add support for Rails 5.0. (@dra)
12
+
1
13
  ## v0.3.0
2
14
  * Drop support for Rails 3.0 and Ruby 1.9.2; add support for Rails 4.2.
3
15
  * Drop support for MiniTest::Rails versions older than 2.0; add support for 2.0
data/README.md CHANGED
@@ -29,7 +29,7 @@ class UserPresenter < Keynote::Presenter
29
29
  end
30
30
 
31
31
  def profile_link
32
- link_to user, display_name, data: {user_id: user.id}
32
+ link_to user, display_name, data: { user_id: user.id }
33
33
  end
34
34
  end
35
35
  ```
@@ -62,8 +62,8 @@ fragments. Here's a small example:
62
62
 
63
63
  ``` ruby
64
64
  build_html do
65
- div :id => :content do
66
- h1 'Hello World', :class => :main
65
+ div id: :content do
66
+ h1 'Hello World', class: :main
67
67
  end
68
68
  end
69
69
  ```
@@ -147,7 +147,7 @@ underlying objects, it's easy to do it explicitly with ActiveSupport's
147
147
 
148
148
  class UserPresenter < Keynote::Presenter
149
149
  presents :user
150
- delegate :first_name, :last_name, :to => :user
150
+ delegate :first_name, :last_name, to: :user
151
151
 
152
152
  def display_name
153
153
  "#{first_name} #{last_name}"
@@ -156,7 +156,7 @@ end
156
156
  ```
157
157
 
158
158
  You can also generate prefixed methods like `user_first_name` by passing
159
- `:prefix => true` to the `delegate` method.
159
+ `prefix: true` to the `delegate` method.
160
160
 
161
161
  ## Rationale
162
162
 
@@ -225,23 +225,32 @@ Test::Unit or MiniTest::Rails if applicable.
225
225
 
226
226
  ## Compatibility
227
227
 
228
- Keynote is supported on Rails 3.1, 3.2, 4.0, 4.1, and 4.2. Keynote presenters
229
- are testable with Test::Unit, RSpec, and MiniTest::Rails (>= 2.0).
228
+ Keynote is supported on Rails 3.1 through 5.1. Keynote presenters are testable
229
+ with Test::Unit, RSpec, and MiniTest::Rails (>= 2.0).
230
230
 
231
231
  If you find problems with any of the above integrations, please open an issue.
232
232
 
233
233
  ## Development
234
234
 
235
- You can run Keynote's tests across all supported versions of Rails as follows:
235
+ This repo uses [Roadshow] to generate a [Docker Compose] file for each
236
+ supported version of Rails (with a compatible version of Ruby for each one).
237
+
238
+ To run specs across all versions, you can either [get the Roadshow tool] and
239
+ run `roadshow run`, or use Docker Compose directly:
236
240
 
237
- ``` bash
238
- $ bundle install
239
- $ bundle exec appraisal install
240
- $ bundle exec rake appraisal
241
241
  ```
242
+ $ for fn in scenarios/*.docker-compose-yml; do docker-compose -f $fn run --rm scenario; done
243
+ ```
244
+
245
+ To update the set of scenarios, edit `scenarios.yml` and run `roadshow
246
+ generate`, although the Gemfiles in the `scenarios` directory need to be
247
+ maintained manually.
242
248
 
243
249
  Feel free to submit pull requests according to the usual conventions for Ruby
244
250
  projects.
245
251
 
246
252
  [DisplayCase]: https://github.com/objects-on-rails/display-case
247
253
  [Draper]: https://github.com/drapergem/draper
254
+ [Roadshow]: https://github.com/rf-/roadshow
255
+ [Docker Compose]: https://docs.docker.com/compose/
256
+ [get the Roadshow tool]: https://github.com/rf-/roadshow/releases
@@ -26,7 +26,9 @@ module Keynote
26
26
  end
27
27
 
28
28
  # Initialize our cache on the view context if it doesn't already exist.
29
- if (cache = view.instance_variable_get(:@_keynote_cache)).nil?
29
+ if view.instance_variable_defined?(:@_keynote_cache)
30
+ cache = view.instance_variable_get(:@_keynote_cache)
31
+ else
30
32
  cache = {}
31
33
  view.instance_variable_set(:@_keynote_cache, cache)
32
34
  end
@@ -173,10 +173,10 @@ module Keynote
173
173
 
174
174
  private
175
175
 
176
- def read_template(source_file, line)
176
+ def read_template(source_file, line_num)
177
177
  result = ""
178
178
 
179
- File.foreach(source_file).drop(line).each do |line|
179
+ File.foreach(source_file).drop(line_num).each do |line|
180
180
  if line =~ COMMENTED_LINE
181
181
  result << $1 << "\n"
182
182
  else
@@ -228,7 +228,7 @@ module Keynote
228
228
 
229
229
  compile(view, view.class)
230
230
 
231
- @source = nil if @virtual_path
231
+ @source = nil if defined?(@virtual_path) && @virtual_path
232
232
  @compiled = true
233
233
  end
234
234
  end
@@ -248,7 +248,7 @@ module Keynote
248
248
 
249
249
  compile(view.class)
250
250
 
251
- @source = nil if @virtual_path
251
+ @source = nil if defined?(@virtual_path) && @virtual_path
252
252
  @compiled = true
253
253
  end
254
254
  end
@@ -34,7 +34,7 @@ module Keynote
34
34
  self.object_names = objects.dup
35
35
 
36
36
  objects.unshift :view
37
- attr_reader *objects
37
+ attr_reader(*objects)
38
38
 
39
39
  param_list = objects.join(', ')
40
40
  ivar_list = objects.map { |o| "@#{o}" }.join(', ')
@@ -228,6 +228,7 @@ module Keynote
228
228
  @instance = instance
229
229
  @name = name
230
230
  @sc = sc
231
+ @done, @content = nil
231
232
  end
232
233
 
233
234
  def attributes
@@ -266,6 +267,14 @@ module Keynote
266
267
  content = nil
267
268
  end
268
269
 
270
+ # Flatten `data` hash into individual attributes if necessary
271
+ if attrs && attrs[:data].is_a?(Hash)
272
+ attrs = attrs.dup
273
+ attrs.delete(:data).each do |key, value|
274
+ attrs[:"data-#{key}"] = value.to_s
275
+ end
276
+ end
277
+
269
278
  merge_attributes(attrs) if attrs
270
279
 
271
280
  if block_given?
@@ -314,10 +323,18 @@ module Keynote
314
323
 
315
324
  def attrs_to_s
316
325
  attributes.inject("") do |res, (name, value)|
317
- if value
318
- value = (value == true) ? name : Rumble.html_escape(value)
319
- res << " #{name}=\"#{value}\""
320
- end
326
+ next unless value
327
+
328
+ value =
329
+ if value.is_a?(Array)
330
+ value.map { |val| Rumble.html_escape(val) }.join(" ")
331
+ elsif value == true
332
+ name
333
+ else
334
+ Rumble.html_escape(value)
335
+ end
336
+
337
+ res << " #{name}=\"#{value.gsub('"'.freeze, '&quot;'.freeze)}\""
321
338
  res
322
339
  end
323
340
  end
@@ -326,7 +343,9 @@ module Keynote
326
343
  # Generate HTML using Rumble tag methods. If tag methods are called
327
344
  # outside a `build_html` block, they'll raise an exception.
328
345
  def build_html
329
- ctx = @rumble_context
346
+ if defined?(@rumble_context)
347
+ ctx = @rumble_context
348
+ end
330
349
  @rumble_context = Context.new
331
350
  yield
332
351
  rumble_cleanup(ctx).to_s
@@ -337,7 +356,7 @@ module Keynote
337
356
  def text(str = nil, &blk)
338
357
  str = Rumble.html_escape(str || blk.call)
339
358
 
340
- if @rumble_context
359
+ if defined?(@rumble_context) && @rumble_context
341
360
  @rumble_context << str
342
361
  else
343
362
  str
@@ -346,12 +365,12 @@ module Keynote
346
365
 
347
366
  # @private
348
367
  def rumble_context
349
- @rumble_context
368
+ defined?(@rumble_context) ? @rumble_context : nil
350
369
  end
351
370
 
352
371
  # @private
353
372
  def rumble_cleanup(value = nil)
354
- @rumble_context
373
+ defined?(@rumble_context) ? @rumble_context : nil
355
374
  ensure
356
375
  @rumble_context = value
357
376
  end
@@ -359,7 +378,7 @@ module Keynote
359
378
  private
360
379
 
361
380
  def rumble_tag(name, sc, content = nil, attrs = nil, &blk)
362
- if !@rumble_context
381
+ if !defined?(@rumble_context) || !@rumble_context
363
382
  raise Rumble::Error, "Must enclose tags in `rumble { ... }` block"
364
383
  end
365
384
 
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Keynote
4
4
  # @private
5
- VERSION = "0.3.1"
5
+ VERSION = "1.0.0"
6
6
  end
@@ -0,0 +1,25 @@
1
+ project: keynote
2
+
3
+ shared:
4
+ from: ruby:2.4
5
+ cmd: "(bundle check || bundle install) && bundle exec rake"
6
+ service:
7
+ volumes:
8
+ - bundle_{{scenario_name}}:/usr/local/bundle
9
+ environment:
10
+ BUNDLE_GEMFILE: scenarios/{{scenario_name}}.gemfile
11
+ volumes:
12
+ bundle_{{scenario_name}}:
13
+
14
+ scenarios:
15
+ rails31:
16
+ from: ruby:2.0
17
+ rails32:
18
+ from: ruby:2.0
19
+ rails40:
20
+ from: ruby:2.3
21
+ rails41:
22
+ from: ruby:2.3
23
+ rails42: {}
24
+ rails50: {}
25
+ rails51: {}
@@ -0,0 +1,15 @@
1
+ ---
2
+ version: "2"
3
+ services:
4
+ scenario:
5
+ build:
6
+ context: ..
7
+ dockerfile: scenarios/rails31.dockerfile
8
+ image: keynote_scenario_rails31
9
+ volumes:
10
+ - "..:/scenario"
11
+ - "bundle_rails31:/usr/local/bundle"
12
+ environment:
13
+ BUNDLE_GEMFILE: scenarios/rails31.gemfile
14
+ volumes:
15
+ bundle_rails31: {}
@@ -0,0 +1,5 @@
1
+ FROM ruby:2.0
2
+ RUN mkdir -p /scenario
3
+ WORKDIR /scenario
4
+ ENV LANG=C.UTF-8
5
+ CMD (bundle check || bundle install) && bundle exec rake
@@ -1,8 +1,7 @@
1
- # This file was generated by Appraisal
2
-
3
1
  source "https://rubygems.org"
4
2
 
5
- gem "rails", "3.1.12"
3
+ gem "rails", "~> 3.1.0"
6
4
  gem "minitest", "< 5"
5
+ gem "haml", "~> 4.0.4"
7
6
 
8
7
  gemspec :path => "../"
@@ -0,0 +1,15 @@
1
+ ---
2
+ version: "2"
3
+ services:
4
+ scenario:
5
+ build:
6
+ context: ..
7
+ dockerfile: scenarios/rails32.dockerfile
8
+ image: keynote_scenario_rails32
9
+ volumes:
10
+ - "..:/scenario"
11
+ - "bundle_rails32:/usr/local/bundle"
12
+ environment:
13
+ BUNDLE_GEMFILE: scenarios/rails32.gemfile
14
+ volumes:
15
+ bundle_rails32: {}
@@ -0,0 +1,5 @@
1
+ FROM ruby:2.0
2
+ RUN mkdir -p /scenario
3
+ WORKDIR /scenario
4
+ ENV LANG=C.UTF-8
5
+ CMD (bundle check || bundle install) && bundle exec rake
@@ -1,8 +1,6 @@
1
- # This file was generated by Appraisal
2
-
3
1
  source "https://rubygems.org"
4
2
 
5
- gem "rails", "3.2.21"
3
+ gem "rails", "~> 3.2.0"
6
4
  gem "minitest", "< 5"
7
5
 
8
6
  gemspec :path => "../"
@@ -0,0 +1,15 @@
1
+ ---
2
+ version: "2"
3
+ services:
4
+ scenario:
5
+ build:
6
+ context: ..
7
+ dockerfile: scenarios/rails40.dockerfile
8
+ image: keynote_scenario_rails40
9
+ volumes:
10
+ - "..:/scenario"
11
+ - "bundle_rails40:/usr/local/bundle"
12
+ environment:
13
+ BUNDLE_GEMFILE: scenarios/rails40.gemfile
14
+ volumes:
15
+ bundle_rails40: {}
@@ -0,0 +1,5 @@
1
+ FROM ruby:2.3
2
+ RUN mkdir -p /scenario
3
+ WORKDIR /scenario
4
+ ENV LANG=C.UTF-8
5
+ CMD (bundle check || bundle install) && bundle exec rake
@@ -1,8 +1,6 @@
1
- # This file was generated by Appraisal
2
-
3
1
  source "https://rubygems.org"
4
2
 
5
- gem "rails", "4.0.13"
3
+ gem "rails", "~> 4.0.0"
6
4
  gem "minitest", "< 5"
7
5
 
8
6
  gemspec :path => "../"
@@ -0,0 +1,15 @@
1
+ ---
2
+ version: "2"
3
+ services:
4
+ scenario:
5
+ build:
6
+ context: ..
7
+ dockerfile: scenarios/rails41.dockerfile
8
+ image: keynote_scenario_rails41
9
+ volumes:
10
+ - "..:/scenario"
11
+ - "bundle_rails41:/usr/local/bundle"
12
+ environment:
13
+ BUNDLE_GEMFILE: scenarios/rails41.gemfile
14
+ volumes:
15
+ bundle_rails41: {}
@@ -0,0 +1,5 @@
1
+ FROM ruby:2.3
2
+ RUN mkdir -p /scenario
3
+ WORKDIR /scenario
4
+ ENV LANG=C.UTF-8
5
+ CMD (bundle check || bundle install) && bundle exec rake
@@ -1,8 +1,6 @@
1
- # This file was generated by Appraisal
2
-
3
1
  source "https://rubygems.org"
4
2
 
5
- gem "rails", "4.1.9"
3
+ gem "rails", "~> 4.1.0"
6
4
  gem "minitest", "~> 5.0"
7
5
 
8
6
  gemspec :path => "../"
@@ -0,0 +1,15 @@
1
+ ---
2
+ version: "2"
3
+ services:
4
+ scenario:
5
+ build:
6
+ context: ..
7
+ dockerfile: scenarios/rails42.dockerfile
8
+ image: keynote_scenario_rails42
9
+ volumes:
10
+ - "..:/scenario"
11
+ - "bundle_rails42:/usr/local/bundle"
12
+ environment:
13
+ BUNDLE_GEMFILE: scenarios/rails42.gemfile
14
+ volumes:
15
+ bundle_rails42: {}
@@ -0,0 +1,5 @@
1
+ FROM ruby:2.4
2
+ RUN mkdir -p /scenario
3
+ WORKDIR /scenario
4
+ ENV LANG=C.UTF-8
5
+ CMD (bundle check || bundle install) && bundle exec rake
@@ -1,8 +1,6 @@
1
- # This file was generated by Appraisal
2
-
3
1
  source "https://rubygems.org"
4
2
 
5
- gem "rails", "4.2.0"
3
+ gem "rails", "~> 4.2.0"
6
4
  gem "minitest", "~> 5.0"
7
5
 
8
6
  gemspec :path => "../"
@@ -0,0 +1,15 @@
1
+ ---
2
+ version: "2"
3
+ services:
4
+ scenario:
5
+ build:
6
+ context: ..
7
+ dockerfile: scenarios/rails50.dockerfile
8
+ image: keynote_scenario_rails50
9
+ volumes:
10
+ - "..:/scenario"
11
+ - "bundle_rails50:/usr/local/bundle"
12
+ environment:
13
+ BUNDLE_GEMFILE: scenarios/rails50.gemfile
14
+ volumes:
15
+ bundle_rails50: {}
@@ -0,0 +1,5 @@
1
+ FROM ruby:2.4
2
+ RUN mkdir -p /scenario
3
+ WORKDIR /scenario
4
+ ENV LANG=C.UTF-8
5
+ CMD (bundle check || bundle install) && bundle exec rake
@@ -1,8 +1,6 @@
1
- # This file was generated by Appraisal
2
-
3
1
  source "https://rubygems.org"
4
2
 
5
- gem "rails", "5.0.0.1"
3
+ gem "rails", "~> 5.0.0"
6
4
  gem "minitest", "~> 5.0"
7
5
 
8
6
  gemspec :path => "../"
@@ -0,0 +1,15 @@
1
+ ---
2
+ version: "2"
3
+ services:
4
+ scenario:
5
+ build:
6
+ context: ..
7
+ dockerfile: scenarios/rails51.dockerfile
8
+ image: keynote_scenario_rails51
9
+ volumes:
10
+ - "..:/scenario"
11
+ - "bundle_rails51:/usr/local/bundle"
12
+ environment:
13
+ BUNDLE_GEMFILE: scenarios/rails51.gemfile
14
+ volumes:
15
+ bundle_rails51: {}
@@ -0,0 +1,5 @@
1
+ FROM ruby:2.4
2
+ RUN mkdir -p /scenario
3
+ WORKDIR /scenario
4
+ ENV LANG=C.UTF-8
5
+ CMD (bundle check || bundle install) && bundle exec rake
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "rails", "~> 5.1.0"
4
+ gem "minitest", "~> 5.0"
5
+
6
+ gemspec :path => "../"
@@ -28,7 +28,7 @@ describe "generators" do
28
28
  end
29
29
 
30
30
  def file_contents(path)
31
- file_contents = File.read(File.join(output_path, path))
31
+ File.read(File.join(output_path, path))
32
32
  end
33
33
 
34
34
  describe "when the test_framework is :test_unit" do
@@ -46,24 +46,24 @@ describe "generators" do
46
46
  )
47
47
 
48
48
  file_contents('app/presenters/post_presenter.rb').
49
- must_match /class PostPresenter < Keynote::Presenter/
49
+ must_match(/class PostPresenter < Keynote::Presenter/)
50
50
 
51
51
  file_contents('test/unit/presenters/post_presenter_test.rb').
52
- must_match /class PostPresenterTest < Keynote::TestCase/
52
+ must_match(/class PostPresenterTest < Keynote::TestCase/)
53
53
  end
54
54
  end
55
55
 
56
56
  it "does not add a 'presents' line" do
57
57
  invoke_generator 'post' do |files|
58
58
  file_contents('app/presenters/post_presenter.rb').
59
- wont_match /presents/
59
+ wont_match(/presents/)
60
60
  end
61
61
  end
62
62
 
63
63
  it "generates an appropriate present() call" do
64
64
  invoke_generator 'post' do |files|
65
65
  file_contents('test/unit/presenters/post_presenter_test.rb').
66
- must_match /present\(:post\)/
66
+ must_match(/present\(:post\)/)
67
67
  end
68
68
  end
69
69
 
@@ -71,14 +71,14 @@ describe "generators" do
71
71
  it "adds a 'presents' line" do
72
72
  invoke_generator 'post', 'foo' do |files|
73
73
  file_contents('app/presenters/post_presenter.rb').
74
- must_match /presents :foo$/
74
+ must_match(/presents :foo$/)
75
75
  end
76
76
  end
77
77
 
78
78
  it "generates an appropriate present() call" do
79
79
  invoke_generator 'post', 'foo' do |files|
80
80
  file_contents('test/unit/presenters/post_presenter_test.rb').
81
- must_match /present\(:post, :foo\)/
81
+ must_match(/present\(:post, :foo\)/)
82
82
  end
83
83
  end
84
84
  end
@@ -87,14 +87,14 @@ describe "generators" do
87
87
  it "adds a 'presents' line" do
88
88
  invoke_generator 'post', 'foo', 'bar' do |files|
89
89
  file_contents('app/presenters/post_presenter.rb').
90
- must_match /presents :foo, :bar$/
90
+ must_match(/presents :foo, :bar$/)
91
91
  end
92
92
  end
93
93
 
94
94
  it "generates an appropriate present() call" do
95
95
  invoke_generator 'post', 'foo', 'bar' do |files|
96
96
  file_contents('test/unit/presenters/post_presenter_test.rb').
97
- must_match /present\(:post, :foo, :bar\)/
97
+ must_match(/present\(:post, :foo, :bar\)/)
98
98
  end
99
99
  end
100
100
  end
@@ -112,10 +112,10 @@ describe "generators" do
112
112
  )
113
113
 
114
114
  file_contents('app/presenters/post_presenter.rb').
115
- must_match /class PostPresenter < Keynote::Presenter/
115
+ must_match(/class PostPresenter < Keynote::Presenter/)
116
116
 
117
117
  file_contents('spec/presenters/post_presenter_spec.rb').
118
- must_match /describe PostPresenter do/
118
+ must_match(/describe PostPresenter do/)
119
119
  end
120
120
  end
121
121
 
@@ -131,10 +131,10 @@ describe "generators" do
131
131
  )
132
132
 
133
133
  file_contents('app/presenters/post_presenter.rb').
134
- must_match /class PostPresenter < Keynote::Presenter/
134
+ must_match(/class PostPresenter < Keynote::Presenter/)
135
135
 
136
136
  file_contents('test/presenters/post_presenter_test.rb').
137
- must_match /describe PostPresenter do/
137
+ must_match(/describe PostPresenter do/)
138
138
  end
139
139
  end
140
140
 
@@ -150,10 +150,10 @@ describe "generators" do
150
150
  )
151
151
 
152
152
  file_contents('app/presenters/post_presenter.rb').
153
- must_match /class PostPresenter < Keynote::Presenter/
153
+ must_match(/class PostPresenter < Keynote::Presenter/)
154
154
 
155
155
  file_contents('test/presenters/post_presenter_test.rb').
156
- must_match /class PostPresenterTest < Keynote::TestCase/
156
+ must_match(/class PostPresenterTest < Keynote::TestCase/)
157
157
  end
158
158
  end
159
159
  end
@@ -114,8 +114,14 @@ module Keynote
114
114
  end
115
115
 
116
116
  e.must_be_instance_of ActionView::Template::Error
117
- e.original_exception.must_be_instance_of RuntimeError
118
- e.original_exception.message.must_equal "UH OH"
117
+
118
+ if e.respond_to?(:original_exception)
119
+ e.original_exception.must_be_instance_of RuntimeError
120
+ e.original_exception.message.must_equal "UH OH"
121
+ else
122
+ e.cause.must_be_instance_of RuntimeError
123
+ e.cause.message.must_equal "UH OH"
124
+ end
119
125
  end
120
126
 
121
127
  it "should remove leading indentation" do
@@ -118,11 +118,10 @@ describe Keynote do
118
118
 
119
119
  describe "when there's no view context" do
120
120
  it "shouldn't cache" do
121
- model_1 = Normal.new
122
- model_2 = Normal.new
121
+ model = Normal.new
123
122
 
124
- presented_1 = Keynote.present(nil, model_1)
125
- presented_2 = Keynote.present(nil, model_1)
123
+ presented_1 = Keynote.present(nil, model)
124
+ presented_2 = Keynote.present(nil, model)
126
125
 
127
126
  presented_1.wont_be :equal?, presented_2
128
127
  end
@@ -122,7 +122,7 @@ describe Keynote::Presenter do
122
122
  describe "#inspect" do
123
123
  it "includes the class name" do
124
124
  CombinedPresenter.new(:view, :a, :b).inspect.
125
- must_match /^#<CombinedPresenter /
125
+ must_match(/^#<CombinedPresenter /)
126
126
  end
127
127
 
128
128
  it "shows .inspect output for each presented object" do
@@ -173,7 +173,7 @@ describe Keynote::Presenter do
173
173
  end
174
174
 
175
175
  err.wont_be_nil
176
- err.message.must_match /Keynote::Presenter/
176
+ err.message.must_match(/Keynote::Presenter/)
177
177
  end
178
178
  end
179
179
  end
@@ -24,6 +24,7 @@ class TestRumble < klass
24
24
  end
25
25
 
26
26
  def setup
27
+ @rumble_context = nil
27
28
  super
28
29
  assert_nil @rumble_context
29
30
  end
@@ -58,6 +59,34 @@ class TestRumble < klass
58
59
  end
59
60
  end
60
61
 
62
+ def test_string_data
63
+ assert_rumble '<div data="whatever"></div>' do
64
+ div data: "whatever"
65
+ end
66
+ end
67
+
68
+ def test_hash_data
69
+ str = <<-HTML
70
+ <div data-modal="true" data-safe="&quot;&quot;&quot;" data-unsafe="&quot;&amp;quot;&quot;">
71
+ </div>
72
+ HTML
73
+
74
+ assert_rumble str do
75
+ div data: { modal: true, safe: '"&quot;"'.html_safe, unsafe: '"&quot;"' }
76
+ end
77
+ end
78
+
79
+ def test_array_attrs
80
+ str = <<-HTML
81
+ <div class="hello &quot;uns&amp;amp;fe&quot; &quot;w&amp;rld&quot;">
82
+ </div>
83
+ HTML
84
+
85
+ assert_rumble str do
86
+ div class: ["hello", '"uns&amp;fe"', '"w&amp;rld"'.html_safe]
87
+ end
88
+ end
89
+
61
90
  def test_several
62
91
  str = <<-HTML
63
92
  <p>Hello</p>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keynote
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Fitzgerald
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-13 00:00:00.000000000 Z
11
+ date: 2017-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -163,18 +163,11 @@ files:
163
163
  - ".gitignore"
164
164
  - ".travis.yml"
165
165
  - ".yardopts"
166
- - Appraisals
167
166
  - CHANGELOG.md
168
167
  - Gemfile
169
168
  - LICENSE
170
169
  - README.md
171
170
  - Rakefile
172
- - gemfiles/rails31.gemfile
173
- - gemfiles/rails32.gemfile
174
- - gemfiles/rails40.gemfile
175
- - gemfiles/rails41.gemfile
176
- - gemfiles/rails42.gemfile
177
- - gemfiles/rails50.gemfile
178
171
  - keynote.gemspec
179
172
  - lib/generators/presenter_generator.rb
180
173
  - lib/generators/templates/keynote_mini_test_spec.rb
@@ -196,6 +189,28 @@ files:
196
189
  - lib/keynote/testing/test_present_method.rb
197
190
  - lib/keynote/testing/test_unit.rb
198
191
  - lib/keynote/version.rb
192
+ - scenarios.yml
193
+ - scenarios/rails31.docker-compose.yml
194
+ - scenarios/rails31.dockerfile
195
+ - scenarios/rails31.gemfile
196
+ - scenarios/rails32.docker-compose.yml
197
+ - scenarios/rails32.dockerfile
198
+ - scenarios/rails32.gemfile
199
+ - scenarios/rails40.docker-compose.yml
200
+ - scenarios/rails40.dockerfile
201
+ - scenarios/rails40.gemfile
202
+ - scenarios/rails41.docker-compose.yml
203
+ - scenarios/rails41.dockerfile
204
+ - scenarios/rails41.gemfile
205
+ - scenarios/rails42.docker-compose.yml
206
+ - scenarios/rails42.dockerfile
207
+ - scenarios/rails42.gemfile
208
+ - scenarios/rails50.docker-compose.yml
209
+ - scenarios/rails50.dockerfile
210
+ - scenarios/rails50.gemfile
211
+ - scenarios/rails51.docker-compose.yml
212
+ - scenarios/rails51.dockerfile
213
+ - scenarios/rails51.gemfile
199
214
  - spec/benchmarks.rb
200
215
  - spec/generator_spec.rb
201
216
  - spec/helper.rb
@@ -224,7 +239,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
239
  version: '0'
225
240
  requirements: []
226
241
  rubyforge_project:
227
- rubygems_version: 2.4.4
242
+ rubygems_version: 2.6.8
228
243
  signing_key:
229
244
  specification_version: 4
230
245
  summary: Flexible presenters for Rails.
data/Appraisals DELETED
@@ -1,29 +0,0 @@
1
- appraise "rails31" do
2
- gem "rails", "3.1.12"
3
- gem "minitest", "< 5"
4
- end
5
-
6
- appraise "rails32" do
7
- gem "rails", "3.2.22.5"
8
- gem "minitest", "< 5"
9
- end
10
-
11
- appraise "rails40" do
12
- gem "rails", "4.0.13"
13
- gem "minitest", "< 5"
14
- end
15
-
16
- appraise "rails41" do
17
- gem "rails", "4.1.16"
18
- gem "minitest", "~> 5.0"
19
- end
20
-
21
- appraise "rails42" do
22
- gem "rails", "4.2.7.1"
23
- gem "minitest", "~> 5.0"
24
- end
25
-
26
- appraise "rails50" do
27
- gem "rails", "5.0.0.1"
28
- gem "minitest", "~> 5.0"
29
- end