progressive_render 0.4.1 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 66c3ea0521fead6a74bac5c2684adb2594f37fc8
4
- data.tar.gz: f7f2afaba6f1545d4b6510e29cb2829c62df2da6
3
+ metadata.gz: c0055d64a0089eea6faf3c3c0151b1003b55e90d
4
+ data.tar.gz: b8035bf632af47521f3e31755f7e08deb172f0e7
5
5
  SHA512:
6
- metadata.gz: 1d7b7b5b01e702bdc67e0dd3f6fd6fe5da9078ad3373dfd1efb7ceea7a830f811fd97a675f953aef62b71462f01889fdbceccd96b2d16dd9688cb976ec0cf2f6
7
- data.tar.gz: 414339daf49bb4677914d3e3b625e0e6eb0d838c974969ab9d28b8fe4e07794952ac1e3528f1037b43ff4237a42ff0a6f4b0e47d2ce135780b11afb177e81f6a
6
+ metadata.gz: 6a07fba3ab6163da94523596947685023de5785114c2b714d8b29071c5de78e1d2cf4c565dabcbdf7be35d5c7950c9a1a4ffc03ee890dca997a496c0324ec298
7
+ data.tar.gz: 45add62929d21577da019f699e0fe3906f80ec1929c4af5486f7c7c09aeeb8a4bfc7de965c58552f6649f6bbbb54ef185a9c3903330ccd7879f8d62a8ee453a5
data/.rubocop.yml ADDED
@@ -0,0 +1,11 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ Metrics/LineLength:
4
+ Max: 120
5
+
6
+ AllCops:
7
+ Exclude:
8
+ - spec/dummy/bin/rake
9
+ - spec/dummy/bin/rails
10
+ - spec/dummy/bin/spring
11
+ - gemfiles/vendor/**/*
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,18 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2016-07-31 14:02:10 -0700 using RuboCop version 0.42.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ Metrics/AbcSize:
11
+ Exclude:
12
+ - 'spec/controller_request_spec.rb'
13
+
14
+ # Offense count: 3
15
+ # Configuration parameters: CountComments.
16
+ Metrics/MethodLength:
17
+ Exclude:
18
+ - 'spec/controller_request_spec.rb'
data/.travis.yml CHANGED
@@ -4,6 +4,11 @@ rvm:
4
4
  - 2.2.5
5
5
  - 2.3.1
6
6
  - ruby-head
7
+ # Suppress the container warning
8
+ sudo: false
9
+
10
+ # Cache dependencies
11
+ cache: bundler
7
12
 
8
13
  before_install: gem install bundler -v 1.10.3
9
14
 
data/DESIGN.md CHANGED
@@ -54,7 +54,7 @@ Parses the request object to determine if this is the main load of the app and i
54
54
  ## Basic Syntax ##
55
55
  ```ruby
56
56
  rh = RequestHandler.new(request)
57
- rh.is_main_load?
57
+ rh.main_load?
58
58
  rh.fragment_name
59
59
  rh.load_path(fragment_name)
60
60
  rh.should_render_partial?(fragment_name)
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015 Jeff Johnson
3
+ Copyright (c) 2015, 2016 Jeff Johnson
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # ProgressiveRender [![Gem Version](https://badge.fury.io/rb/progressive_render.svg)](http://badge.fury.io/rb/progressive_render) #
2
2
 
3
- ![ProgressiveRender Demo](http://g.recordit.co/WgVCYoUWuh.gif)
3
+ ![ProgressiveRender Demo](http://i.imgur.com/J9RtbDc.gif)
4
4
 
5
5
  Slow content got you down? Load it later! Use this gem to defer loading of portions of your page until after load. They will be fetched via AJAX and placed on the page when ready.
6
6
 
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'rubocop/rake_task'
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new
5
7
 
6
- task :default => :spec
8
+ task default: %w(rubocop spec)
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "progressive_render"
3
+ require 'bundler/setup'
4
+ require 'progressive_render'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "progressive_render"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start
data/bump_version.sh ADDED
@@ -0,0 +1,20 @@
1
+ #!/bin/bash
2
+
3
+ #
4
+ # Bump the gem version
5
+ # Pass in 'patch, minor, major' to specify what to update. Default is patch.
6
+ #
7
+ # This is needed to ensure all the Gemfile.locks are up to date with the
8
+ # new version. Otherwise any CI builds will fail.
9
+ #
10
+
11
+ gem install gem-release
12
+ gem bump --version ${1:-patch}
13
+ cd spec/dummy
14
+ bundle install
15
+ cd ../../
16
+ appraisal install
17
+ git add spec/dummy/Gemfile.lock
18
+ git add gemfiles/*.lock
19
+ git commit -am "Bumping collateral for new gem version"
20
+ gem release --tag
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- progressive_render (0.4.1)
4
+ progressive_render (0.4.3)
5
5
  coffee-rails
6
6
  jquery-rails
7
7
  nokogiri
@@ -45,6 +45,7 @@ GEM
45
45
  rake
46
46
  thor (>= 0.14.0)
47
47
  arel (5.0.1.20140414130214)
48
+ ast (2.3.0)
48
49
  builder (3.2.2)
49
50
  byebug (5.0.0)
50
51
  columnize (= 0.9.0)
@@ -76,6 +77,9 @@ GEM
76
77
  minitest (5.8.0)
77
78
  nokogiri (1.6.6.2)
78
79
  mini_portile (~> 0.6.0)
80
+ parser (2.3.1.2)
81
+ ast (~> 2.2)
82
+ powerpack (0.1.1)
79
83
  pry (0.10.1)
80
84
  coderay (~> 1.1.0)
81
85
  method_source (~> 0.8.1)
@@ -101,6 +105,7 @@ GEM
101
105
  activesupport (= 4.1.13)
102
106
  rake (>= 0.8.7)
103
107
  thor (>= 0.18.1, < 2.0)
108
+ rainbow (2.1.0)
104
109
  rake (10.4.2)
105
110
  rspec (3.3.0)
106
111
  rspec-core (~> 3.3.0)
@@ -123,6 +128,13 @@ GEM
123
128
  rspec-mocks (~> 3.3.0)
124
129
  rspec-support (~> 3.3.0)
125
130
  rspec-support (3.3.0)
131
+ rubocop (0.42.0)
132
+ parser (>= 2.3.1.1, < 3.0)
133
+ powerpack (~> 0.1)
134
+ rainbow (>= 1.99.1, < 3.0)
135
+ ruby-progressbar (~> 1.7)
136
+ unicode-display_width (~> 1.0, >= 1.0.1)
137
+ ruby-progressbar (1.8.1)
126
138
  sass (3.4.22)
127
139
  sass-rails (5.0.5)
128
140
  railties (>= 4.0.0, < 6)
@@ -150,6 +162,7 @@ GEM
150
162
  thread_safe (~> 0.1)
151
163
  uglifier (3.0.0)
152
164
  execjs (>= 0.3.0, < 3)
165
+ unicode-display_width (1.1.0)
153
166
 
154
167
  PLATFORMS
155
168
  ruby
@@ -165,6 +178,7 @@ DEPENDENCIES
165
178
  rake (~> 10.0)
166
179
  rspec
167
180
  rspec-rails
181
+ rubocop
168
182
  sqlite3
169
183
 
170
184
  BUNDLED WITH
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- progressive_render (0.4.1)
4
+ progressive_render (0.4.3)
5
5
  coffee-rails
6
6
  jquery-rails
7
7
  nokogiri
@@ -54,6 +54,7 @@ GEM
54
54
  rake
55
55
  thor (>= 0.14.0)
56
56
  arel (6.0.3)
57
+ ast (2.3.0)
57
58
  builder (3.2.2)
58
59
  byebug (5.0.0)
59
60
  columnize (= 0.9.0)
@@ -90,6 +91,9 @@ GEM
90
91
  minitest (5.8.0)
91
92
  nokogiri (1.6.6.2)
92
93
  mini_portile (~> 0.6.0)
94
+ parser (2.3.1.2)
95
+ ast (~> 2.2)
96
+ powerpack (0.1.1)
93
97
  pry (0.10.1)
94
98
  coderay (~> 1.1.0)
95
99
  method_source (~> 0.8.1)
@@ -124,6 +128,7 @@ GEM
124
128
  activesupport (= 4.2.4)
125
129
  rake (>= 0.8.7)
126
130
  thor (>= 0.18.1, < 2.0)
131
+ rainbow (2.1.0)
127
132
  rake (10.4.2)
128
133
  rspec (3.3.0)
129
134
  rspec-core (~> 3.3.0)
@@ -146,6 +151,13 @@ GEM
146
151
  rspec-mocks (~> 3.3.0)
147
152
  rspec-support (~> 3.3.0)
148
153
  rspec-support (3.3.0)
154
+ rubocop (0.42.0)
155
+ parser (>= 2.3.1.1, < 3.0)
156
+ powerpack (~> 0.1)
157
+ rainbow (>= 1.99.1, < 3.0)
158
+ ruby-progressbar (~> 1.7)
159
+ unicode-display_width (~> 1.0, >= 1.0.1)
160
+ ruby-progressbar (1.8.1)
149
161
  sass (3.4.22)
150
162
  sass-rails (5.0.5)
151
163
  railties (>= 4.0.0, < 6)
@@ -173,6 +185,7 @@ GEM
173
185
  thread_safe (~> 0.1)
174
186
  uglifier (3.0.0)
175
187
  execjs (>= 0.3.0, < 3)
188
+ unicode-display_width (1.1.0)
176
189
 
177
190
  PLATFORMS
178
191
  ruby
@@ -188,6 +201,7 @@ DEPENDENCIES
188
201
  rake (~> 10.0)
189
202
  rspec
190
203
  rspec-rails
204
+ rubocop
191
205
  sqlite3
192
206
 
193
207
  BUNDLED WITH
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../
3
3
  specs:
4
- progressive_render (0.4.1)
4
+ progressive_render (0.4.3)
5
5
  coffee-rails
6
6
  jquery-rails
7
7
  nokogiri
@@ -56,6 +56,7 @@ GEM
56
56
  rake
57
57
  thor (>= 0.14.0)
58
58
  arel (7.0.0)
59
+ ast (2.3.0)
59
60
  builder (3.2.2)
60
61
  byebug (9.0.5)
61
62
  codeclimate-test-reporter (0.5.1)
@@ -95,7 +96,10 @@ GEM
95
96
  nokogiri (1.6.8)
96
97
  mini_portile2 (~> 2.1.0)
97
98
  pkg-config (~> 1.1.7)
99
+ parser (2.3.1.2)
100
+ ast (~> 2.2)
98
101
  pkg-config (1.1.7)
102
+ powerpack (0.1.1)
99
103
  pry (0.10.3)
100
104
  coderay (~> 1.1.0)
101
105
  method_source (~> 0.8.1)
@@ -133,6 +137,7 @@ GEM
133
137
  method_source
134
138
  rake (>= 0.8.7)
135
139
  thor (>= 0.18.1, < 2.0)
140
+ rainbow (2.1.0)
136
141
  rake (10.5.0)
137
142
  rspec (3.1.0)
138
143
  rspec-core (~> 3.1.0)
@@ -154,6 +159,13 @@ GEM
154
159
  rspec-mocks (~> 3.1.0)
155
160
  rspec-support (~> 3.1.0)
156
161
  rspec-support (3.1.2)
162
+ rubocop (0.42.0)
163
+ parser (>= 2.3.1.1, < 3.0)
164
+ powerpack (~> 0.1)
165
+ rainbow (>= 1.99.1, < 3.0)
166
+ ruby-progressbar (~> 1.7)
167
+ unicode-display_width (~> 1.0, >= 1.0.1)
168
+ ruby-progressbar (1.8.1)
157
169
  sass (3.4.22)
158
170
  sass-rails (5.0.5)
159
171
  railties (>= 4.0.0, < 6)
@@ -182,6 +194,7 @@ GEM
182
194
  thread_safe (~> 0.1)
183
195
  uglifier (3.0.0)
184
196
  execjs (>= 0.3.0, < 3)
197
+ unicode-display_width (1.1.0)
185
198
  websocket-driver (0.6.4)
186
199
  websocket-extensions (>= 0.1.0)
187
200
  websocket-extensions (0.1.2)
@@ -200,6 +213,7 @@ DEPENDENCIES
200
213
  rake (~> 10.0)
201
214
  rspec
202
215
  rspec-rails
216
+ rubocop
203
217
  sqlite3
204
218
 
205
219
  BUNDLED WITH
@@ -1,15 +1,17 @@
1
1
  module ProgressiveRender
2
+ # Generates a prefix for a given progressive_render section in a stable manner.
3
+ # This way on each load we assign the outer most progressive_render block with
4
+ # the same name. Nested progressive_render blocks are not supported, this approach
5
+ # may need to be re-evaluated for that use case.
6
+ class FragmentNameIterator
7
+ def initialize
8
+ @current = 0
9
+ end
2
10
 
3
- class FragmentNameIterator
4
- def initialize
5
- @current = 0
6
- end
7
-
8
- def next!
9
- @current += 1
11
+ def next!
12
+ @current += 1
10
13
 
11
- "#{@current}"
14
+ @current.to_s
15
+ end
12
16
  end
13
17
  end
14
-
15
- end
@@ -1,35 +1,37 @@
1
1
  require 'uri'
2
2
 
3
3
  module ProgressiveRender
4
- module Rack
5
- class RequestHandler
6
- FRAGMENT_KEY = "load_partial"
7
-
8
- def initialize(_request)
9
- @request = _request
10
- end
11
-
12
- def is_main_load?
13
- fragment_name == nil || fragment_name == ""
14
- end
15
-
16
- def fragment_name
17
- @request.GET[FRAGMENT_KEY]
18
- end
19
-
20
- def should_render_fragment?(_fragment_name)
21
- !is_main_load? && fragment_name == _fragment_name
22
- end
23
-
24
- def load_path(fragment_name)
25
- return nil if !is_main_load?
26
-
27
- # Ensure we get a fresh copy of the request and aren't modifying it
28
- query = @request.GET.clone
29
- query[FRAGMENT_KEY] = fragment_name
30
-
31
- URI::HTTP.build(path: @request.path, query: URI.encode_www_form(query)).request_uri
32
- end
33
- end
34
- end
35
- end
4
+ module Rack
5
+ # Wraps a given rack request to determine what sort of request we're dealing with
6
+ # and what specific fragment the request is for when it's a progressive request.
7
+ class RequestHandler
8
+ FRAGMENT_KEY = 'load_partial'.freeze
9
+
10
+ def initialize(request)
11
+ @request = request
12
+ end
13
+
14
+ def main_load?
15
+ fragment_name.nil? || fragment_name == ''
16
+ end
17
+
18
+ def fragment_name
19
+ @request.GET[FRAGMENT_KEY]
20
+ end
21
+
22
+ def should_render_fragment?(user_fragment_name)
23
+ !main_load? && fragment_name == user_fragment_name
24
+ end
25
+
26
+ def load_path(fragment_name)
27
+ return nil unless main_load?
28
+
29
+ # Ensure we get a fresh copy of the request and aren't modifying it
30
+ query = @request.GET.clone
31
+ query[FRAGMENT_KEY] = fragment_name
32
+
33
+ URI::HTTP.build(path: @request.path, query: URI.encode_www_form(query)).request_uri
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,6 +1,7 @@
1
1
  require 'progressive_render/rack/request_handler'
2
2
 
3
3
  module ProgressiveRender
4
- module Rack
5
- end
6
- end
4
+ # Rack specific functionality
5
+ module Rack
6
+ end
7
+ end
@@ -1,54 +1,58 @@
1
1
  require 'progressive_render/rails/helpers'
2
2
 
3
3
  module ProgressiveRender
4
- module Rails
4
+ module Rails
5
+ # Rails controller methods, this module is installed into ActionController
6
+ # These methods should not generally be called by user code besides 'render'
7
+ module Controller
8
+ include Helpers
9
+
10
+ def progressive_render(template = nil)
11
+ logger.warn %(DEPRECATED: calling 'progressive_render' directly in the controller
12
+ is deprecated and will be removed in future versions.
13
+ It is no longer necessary to explicitly call the render method.)
14
+ render template
15
+ end
5
16
 
6
- module Controller
7
- include Helpers
17
+ def render(options = nil, extra_options = {}, &block)
18
+ # Fall back to the ActionView renderer if we're on the main page load
19
+ # OR we are being called from inside our own code (in_progressive_render?)
20
+ if progressive_request.main_load? || in_progressive_render?
21
+ super
22
+ else
23
+ in_progressive_render do
24
+ # To preserve legacy behavior pass options through to resolve_path if it's a string
25
+ # ActiveRecord more properly handles the path so use that when possible.
26
+ template = options if options.is_a? String
27
+ progressive_renderer.render_fragment resolve_path(template), progressive_request.fragment_name
28
+ end
29
+ end
30
+ end
8
31
 
9
- def progressive_render(template=nil)
10
- logger.warn "DEPRECATED: calling 'progressive_render' directly in the controller is deprecated and will be removed in future versions. It is no longer necessary to explicitly call the render method."
11
- render template
12
- end
32
+ private
13
33
 
14
- def resolve_path(template)
15
- tc = Rails::PathResolver::TemplateContext.new
16
- tc.type = :controller
17
- tc.controller = request.params["controller"]
18
- tc.action = request.params["action"]
34
+ def resolve_path(template)
35
+ tc = Rails::PathResolver::TemplateContext.new
36
+ tc.type = :controller
37
+ tc.controller = request.params['controller']
38
+ tc.action = request.params['action']
19
39
 
20
- pr = Rails::PathResolver.new(tc)
40
+ pr = Rails::PathResolver.new(tc)
21
41
 
22
- pr.path_for(template)
23
- end
24
-
25
- def render(options = nil, extra_options = {}, &block)
26
- # Fall back to the ActionView renderer if we're on the main page load
27
- # OR we are being called from inside our own code (in_progressive_render?)
28
- if progressive_request.is_main_load? || in_progressive_render?
29
- super
30
- else
31
- in_progressive_render do
32
- # To preserve legacy behavior pass options through to resolve_path if it's a string
33
- # ActiveRecord more properly handles the path so use that when possible.
34
- template = options if options.is_a? String
35
- progressive_renderer.render_fragment resolve_path(template), progressive_request.fragment_name
42
+ pr.path_for(template)
36
43
  end
37
- end
38
- end
39
44
 
40
- def in_progressive_render?
41
- @in_progressive_render
42
- end
45
+ def in_progressive_render?
46
+ @in_progressive_render
47
+ end
43
48
 
44
- # To prevent the render call from reentrancy we need to remember if we're in our own render path.
45
- # Our rendering code calls 'render' to access the real view renderer so we need a way to fall back to it.
46
- def in_progressive_render(&block)
47
- @in_progressive_render = true
48
- block.call
49
- @in_progressive_render = false
49
+ # To prevent the render call from reentrancy we need to remember if we're in our own render path.
50
+ # Our rendering code calls 'render' to access the real view renderer so we need a way to fall back to it.
51
+ def in_progressive_render
52
+ @in_progressive_render = true
53
+ yield
54
+ @in_progressive_render = false
55
+ end
56
+ end
50
57
  end
51
58
  end
52
-
53
- end
54
- end
@@ -1,21 +1,23 @@
1
1
  module ProgressiveRender
2
- module Rails
2
+ module Rails
3
+ # Rails uses this class to install progressive_render into an application
4
+ # It is responsible for any setup needed for the gem to function
5
+ class Engine < ::Rails::Engine
6
+ initializer 'progressive_render.assets.precompile' do |app|
7
+ app.config.assets.precompile += %w(progressive_render.gif
8
+ progressive_render.js.coffee
9
+ progressive_render.css.scss)
10
+ end
3
11
 
4
- class Engine < ::Rails::Engine
5
- initializer "progressive_render.assets.precompile" do |app|
6
- app.config.assets.precompile += %w( progressive_render.gif progressive_render.js.coffee progressive_render.css.scss )
7
- end
8
-
9
- initializer "progressive_render.install" do
10
- ActionController::Base.class_eval do
11
- prepend ProgressiveRender::Rails::Controller
12
- end
13
-
14
- ActionView::Base.class_eval do
15
- prepend ProgressiveRender::Rails::View
16
- end
17
- end
18
- end
12
+ initializer 'progressive_render.install' do
13
+ ActionController::Base.class_eval do
14
+ prepend ProgressiveRender::Rails::Controller
15
+ end
19
16
 
17
+ ActionView::Base.class_eval do
18
+ prepend ProgressiveRender::Rails::View
19
+ end
20
+ end
21
+ end
22
+ end
20
23
  end
21
- end
@@ -1,14 +1,14 @@
1
1
  module ProgressiveRender
2
- module Rails
2
+ module Rails
3
+ # Shortcuts to object creation used in the view and controller
4
+ module Helpers
5
+ def progressive_request
6
+ @rh ||= Rack::RequestHandler.new(request)
7
+ end
3
8
 
4
- module Helpers
5
- def progressive_request
6
- @rh ||= Rack::RequestHandler.new(request)
7
- end
8
- def progressive_renderer
9
- Rails::ViewRenderer.new(self)
10
- end
9
+ def progressive_renderer
10
+ Rails::ViewRenderer.new(self)
11
+ end
12
+ end
13
+ end
11
14
  end
12
-
13
- end
14
- end
@@ -1,44 +1,61 @@
1
1
  module ProgressiveRender
2
- module Rails
3
- class PathResolver
4
- class TemplateContext
5
- attr_accessor :controller, :action, :type
6
-
7
- def valid?
8
- return false if type != :view && type != :controller
9
- return false if controller.nil? or controller.empty?
10
- return false if action.nil? or action.empty?
11
- true
12
- end
13
- end
14
-
15
- class InvalidTemplateContextException < Exception
16
- end
17
-
18
- class InvalidPathException < Exception
19
- end
20
-
21
- def initialize(_template_context)
22
- @context = _template_context
23
- end
24
-
25
- def path_for(view_name=nil)
26
- raise InvalidTemplateContextException.new unless @context && @context.valid?
27
- raise InvalidPathException.new if (view_name.nil? or view_name.empty?) and view_action?
28
-
29
- path = "#{@context.controller.downcase}/"
30
-
31
- if view_name == nil || view_name.empty?
32
- path += "#{@context.action}"
33
- else
34
- path += "#{view_name}"
35
- end
36
- end
37
-
38
- private
39
- def view_action?
40
- @context.type == :view
41
- end
42
- end
43
- end
44
- end
2
+ module Rails
3
+ # Resolve set of request parameters to a full path to a template file
4
+ class PathResolver
5
+ # Holds the request parameters.
6
+ # Used to decouple the ProgressiveRequest from the renderer.
7
+ class TemplateContext
8
+ attr_accessor :controller, :action, :type
9
+
10
+ def valid?
11
+ valid_type? && valid_controller? && valid_action?
12
+ end
13
+
14
+ private
15
+
16
+ def valid_type?
17
+ type == :view || type == :controller
18
+ end
19
+
20
+ def valid_controller?
21
+ !controller.nil? && !controller.empty?
22
+ end
23
+
24
+ def valid_action?
25
+ !action.nil? && !action.empty?
26
+ end
27
+ end
28
+
29
+ class InvalidTemplateContextException < RuntimeError
30
+ end
31
+
32
+ class InvalidPathException < RuntimeError
33
+ end
34
+
35
+ def initialize(template_context)
36
+ @context = template_context
37
+ end
38
+
39
+ def path_for(view_name = nil)
40
+ raise InvalidTemplateContextException unless @context && @context.valid?
41
+ raise InvalidPathException if (view_name.nil? || view_name.empty?) && view_action?
42
+
43
+ "#{@context.controller.downcase}/#{path_suffix_for(view_name)}"
44
+ end
45
+
46
+ private
47
+
48
+ def path_suffix_for(view_name)
49
+ if view_name.nil? || view_name.empty?
50
+ @context.action.to_s
51
+ else
52
+ view_name.to_s
53
+ end
54
+ end
55
+
56
+ def view_action?
57
+ @context.type == :view
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,39 +1,64 @@
1
1
  require 'progressive_render/rails/helpers'
2
2
 
3
3
  module ProgressiveRender
4
- module Rails
5
-
6
- module View
7
- include Helpers
8
-
9
- def progressive_render(deprecated_fragment_name = nil, placeholder: 'progressive_render/placeholder', cache_keys: nil, &content)
10
- fragment_name = fragment_name_iterator.next!
11
-
12
- if deprecated_fragment_name
13
- logger.warn "DEPRECATED (progressive_render gem): Literal fragment names are deprecated and will be removed in v1.0. The fragment name (#{deprecated_fragment_name}) will be ignored."
14
- end
15
-
16
- progressive_render_content(fragment_name, progressive_request.is_main_load?) do
17
- if progressive_request.is_main_load?
18
- progressive_renderer.render_partial placeholder
19
- elsif progressive_request.should_render_fragment?(fragment_name)
20
- content.call
21
- end
22
- end
23
- end
24
-
25
- def progressive_render_content(fragment_name, placeholder=true)
26
- content_tag(:div, id: "#{fragment_name}_progressive_render",
27
- data: {progressive_render_placeholder: placeholder,
28
- progressive_render_path: progressive_request.load_path(fragment_name)}.select {|k,v| !v.nil? }) do
29
- yield
30
- end
31
- end
32
-
33
- def fragment_name_iterator
34
- @fni ||= FragmentNameIterator.new
35
- end
36
- end
4
+ module Rails
5
+ # Provides methods for application view
6
+ module View
7
+ include Helpers
8
+
9
+ # Mark a section of content to be loaded after initial view of the page.
10
+ #
11
+ # == Usage
12
+ # <%= progressive_render do %>
13
+ # <h2>Content!</h2>
14
+ # <% end %>
15
+ #
16
+ # == Specify a custom placeholder
17
+ # The progressive_render method puts a simple spinner on the page by default but
18
+ # that can be customized per section by passing a path to a partial via `placeholder`
19
+ #
20
+ # <%= progressive_render placeholder: 'shared/custom_placehodler' do %>
21
+ # <h2>More Content!</h2>
22
+ # <% end %>
23
+ def progressive_render(deprecated_fragment_name = nil,
24
+ placeholder: 'progressive_render/placeholder')
25
+ if deprecated_fragment_name
26
+ logger.warn %(DEPRECATED (progressive_render): Literal fragment names are deprecated and will be removed
27
+ in v1.0. The fragment name (#{deprecated_fragment_name}) will be ignored.")
28
+ end
29
+
30
+ progressive_render_impl(placeholder: placeholder) do
31
+ yield
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def progressive_render_impl(placeholder: 'progressive_render/placeholder')
38
+ fragment_name = fragment_name_iterator.next!
39
+
40
+ progressive_render_content(fragment_name, progressive_request.main_load?) do
41
+ if progressive_request.main_load?
42
+ progressive_renderer.render_partial placeholder
43
+ elsif progressive_request.should_render_fragment?(fragment_name)
44
+ yield
45
+ end
46
+ end
47
+ end
48
+
49
+ def progressive_render_content(fragment_name, placeholder = true)
50
+ data = { progressive_render_placeholder: placeholder,
51
+ progressive_render_path: progressive_request.load_path(fragment_name) }.select { |_k, v| !v.nil? }
52
+
53
+ content_tag(:div, id: "#{fragment_name}_progressive_render",
54
+ data: data) do
55
+ yield
56
+ end
57
+ end
37
58
 
59
+ def fragment_name_iterator
60
+ @fni ||= FragmentNameIterator.new
61
+ end
62
+ end
63
+ end
38
64
  end
39
- end
@@ -2,17 +2,21 @@ require 'nokogiri'
2
2
 
3
3
  module ProgressiveRender
4
4
  module Rails
5
+ # Responsible for rendering a full page and extracting fragments for a progressive render.
5
6
  class ViewRenderer
6
7
  attr_accessor :context
7
- def initialize(_view_context)
8
- self.context = _view_context
8
+ def initialize(view_context)
9
+ self.context = view_context
9
10
  end
11
+
10
12
  def render_partial(path)
11
13
  context.render partial: path
12
14
  end
15
+
13
16
  def render_view(path)
14
17
  context.render path
15
18
  end
19
+
16
20
  def render_fragment(path, fragment_name)
17
21
  content = context.render_to_string template: path, layout: false
18
22
  stripped = Nokogiri::HTML(content).at_css("div##{fragment_name}_progressive_render")
@@ -7,6 +7,7 @@ require 'progressive_render/rails/view'
7
7
  require 'progressive_render/rails/controller'
8
8
 
9
9
  module ProgressiveRender
10
- module Rails
11
- end
12
- end
10
+ # Rails specific functionality
11
+ module Rails
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module ProgressiveRender
2
- VERSION = "0.4.1"
2
+ VERSION = '0.4.3'.freeze
3
3
  end
@@ -2,10 +2,11 @@ require 'progressive_render/rack'
2
2
 
3
3
  require 'progressive_render/fragment_name_iterator'
4
4
 
5
+ # Root namespace for the gem
5
6
  module ProgressiveRender
6
- if defined?(::Rails) and Gem::Requirement.new('>= 3.1').satisfied_by?(Gem::Version.new ::Rails.version)
7
- require 'progressive_render/rails'
8
- else
9
- logger.warn "WARNING: ProgressiveRender has not been installed due to missing dependencies"
10
- end
11
- end
7
+ if defined?(::Rails) && Gem::Requirement.new('>= 3.1').satisfied_by?(Gem::Version.new(::Rails.version))
8
+ require 'progressive_render/rails'
9
+ else
10
+ logger.warn 'progressive_render gem has not been installed due to missing dependencies'
11
+ end
12
+ end
@@ -4,35 +4,38 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'progressive_render/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "progressive_render"
7
+ spec.name = 'progressive_render'
8
8
  spec.version = ProgressiveRender::VERSION
9
- spec.authors = ["Jeff Johnson"]
10
- spec.email = ["johnsonjeff@gmail.com"]
9
+ spec.authors = ['Jeff Johnson']
10
+ spec.email = ['johnsonjeff@gmail.com']
11
11
 
12
- spec.summary = %q{Progressively load static or dynamic content on page load}
13
- spec.description = %q{For large or expensive pages, use this gem to load less critical portions of the page. Especially useful for large queries or content that's hidden from the user on load. The best solution may be to optimize your content, but there's not always time for that.}
14
- spec.homepage = "https://github.com/johnsonj/progressive_render"
15
- spec.license = "MIT"
12
+ spec.summary = 'Progressively load static or dynamic content on page load'
13
+ spec.description = %(For large or expensive pages, use this gem to load less critical portions of the page.
14
+ Especially useful for large queries or content that's hidden from the user on load.
15
+ The best solution may be to optimize your content, but there's not always time for that.)
16
+ spec.homepage = 'https://github.com/johnsonj/progressive_render'
17
+ spec.license = 'MIT'
16
18
 
17
19
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
- spec.bindir = "exe"
20
+ spec.bindir = 'exe'
19
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
21
23
 
22
- spec.add_development_dependency "bundler", "~> 1.10"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "rspec"
25
- spec.add_development_dependency "codeclimate-test-reporter"
26
- spec.add_development_dependency "rspec-rails"
27
- spec.add_development_dependency "sqlite3"
28
- spec.add_development_dependency "pry-byebug"
24
+ spec.add_development_dependency 'bundler', '~> 1.10'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec'
27
+ spec.add_development_dependency 'codeclimate-test-reporter'
28
+ spec.add_development_dependency 'rspec-rails'
29
+ spec.add_development_dependency 'sqlite3'
30
+ spec.add_development_dependency 'pry-byebug'
31
+ spec.add_development_dependency 'rubocop'
29
32
 
30
- spec.add_dependency "sass"
31
- spec.add_dependency "sass-rails"
32
- spec.add_dependency "uglifier"
33
- spec.add_dependency "coffee-rails"
34
- spec.add_dependency "railties"
35
- spec.add_dependency "jquery-rails"
36
- spec.add_dependency "rails", ">= 4.1"
37
- spec.add_dependency "nokogiri"
33
+ spec.add_dependency 'sass'
34
+ spec.add_dependency 'sass-rails'
35
+ spec.add_dependency 'uglifier'
36
+ spec.add_dependency 'coffee-rails'
37
+ spec.add_dependency 'railties'
38
+ spec.add_dependency 'jquery-rails'
39
+ spec.add_dependency 'rails', '>= 4.1'
40
+ spec.add_dependency 'nokogiri'
38
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: progressive_render
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Johnson
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: sass
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -220,10 +234,10 @@ dependencies:
220
234
  - - ">="
221
235
  - !ruby/object:Gem::Version
222
236
  version: '0'
223
- description: For large or expensive pages, use this gem to load less critical portions
224
- of the page. Especially useful for large queries or content that's hidden from the
225
- user on load. The best solution may be to optimize your content, but there's not
226
- always time for that.
237
+ description: |-
238
+ For large or expensive pages, use this gem to load less critical portions of the page.
239
+ Especially useful for large queries or content that's hidden from the user on load.
240
+ The best solution may be to optimize your content, but there's not always time for that.
227
241
  email:
228
242
  - johnsonjeff@gmail.com
229
243
  executables: []
@@ -232,6 +246,8 @@ extra_rdoc_files: []
232
246
  files:
233
247
  - ".gitignore"
234
248
  - ".rspec"
249
+ - ".rubocop.yml"
250
+ - ".rubocop_todo.yml"
235
251
  - ".travis.yml"
236
252
  - Appraisals
237
253
  - DESIGN.md
@@ -242,6 +258,7 @@ files:
242
258
  - app/views/progressive_render/_placeholder.html.erb
243
259
  - bin/console
244
260
  - bin/setup
261
+ - bump_version.sh
245
262
  - gemfiles/rails_4_1.gemfile
246
263
  - gemfiles/rails_4_1.gemfile.lock
247
264
  - gemfiles/rails_4_2.gemfile