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 +4 -4
- data/.rubocop.yml +11 -0
- data/.rubocop_todo.yml +18 -0
- data/.travis.yml +5 -0
- data/DESIGN.md +1 -1
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/Rakefile +5 -3
- data/bin/console +3 -3
- data/bump_version.sh +20 -0
- data/gemfiles/rails_4_1.gemfile.lock +15 -1
- data/gemfiles/rails_4_2.gemfile.lock +15 -1
- data/gemfiles/rails_5_0_0_beta4.gemfile.lock +15 -1
- data/lib/progressive_render/fragment_name_iterator.rb +12 -10
- data/lib/progressive_render/rack/request_handler.rb +34 -32
- data/lib/progressive_render/rack.rb +4 -3
- data/lib/progressive_render/rails/controller.rb +45 -41
- data/lib/progressive_render/rails/engine.rb +19 -17
- data/lib/progressive_render/rails/helpers.rb +11 -11
- data/lib/progressive_render/rails/path_resolver.rb +60 -43
- data/lib/progressive_render/rails/view.rb +59 -34
- data/lib/progressive_render/rails/view_renderer.rb +6 -2
- data/lib/progressive_render/rails.rb +4 -3
- data/lib/progressive_render/version.rb +1 -1
- data/lib/progressive_render.rb +7 -6
- data/progressive_load.gemspec +27 -24
- metadata +22 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0055d64a0089eea6faf3c3c0151b1003b55e90d
|
4
|
+
data.tar.gz: b8035bf632af47521f3e31755f7e08deb172f0e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a07fba3ab6163da94523596947685023de5785114c2b714d8b29071c5de78e1d2cf4c565dabcbdf7be35d5c7950c9a1a4ffc03ee890dca997a496c0324ec298
|
7
|
+
data.tar.gz: 45add62929d21577da019f699e0fe3906f80ec1929c4af5486f7c7c09aeeb8a4bfc7de965c58552f6649f6bbbb54ef185a9c3903330ccd7879f8d62a8ee453a5
|
data/.rubocop.yml
ADDED
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
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.
|
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
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://
|
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
|
2
|
-
require
|
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 :
|
8
|
+
task default: %w(rubocop spec)
|
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
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
|
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.
|
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.
|
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.
|
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
|
-
|
4
|
-
|
5
|
-
@current = 0
|
6
|
-
end
|
7
|
-
|
8
|
-
def next!
|
9
|
-
@current += 1
|
11
|
+
def next!
|
12
|
+
@current += 1
|
10
13
|
|
11
|
-
|
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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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,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
|
-
|
7
|
-
|
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
|
-
|
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
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
40
|
+
pr = Rails::PathResolver.new(tc)
|
21
41
|
|
22
|
-
|
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
|
-
|
41
|
-
|
42
|
-
|
45
|
+
def in_progressive_render?
|
46
|
+
@in_progressive_render
|
47
|
+
end
|
43
48
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
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
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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(
|
8
|
-
self.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")
|
data/lib/progressive_render.rb
CHANGED
@@ -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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
data/progressive_load.gemspec
CHANGED
@@ -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 =
|
7
|
+
spec.name = 'progressive_render'
|
8
8
|
spec.version = ProgressiveRender::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Jeff Johnson']
|
10
|
+
spec.email = ['johnsonjeff@gmail.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description = %
|
14
|
-
|
15
|
-
|
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 =
|
20
|
+
spec.bindir = 'exe'
|
19
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
-
spec.require_paths = [
|
22
|
+
spec.require_paths = ['lib']
|
21
23
|
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
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
|
31
|
-
spec.add_dependency
|
32
|
-
spec.add_dependency
|
33
|
-
spec.add_dependency
|
34
|
-
spec.add_dependency
|
35
|
-
spec.add_dependency
|
36
|
-
spec.add_dependency
|
37
|
-
spec.add_dependency
|
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.
|
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:
|
224
|
-
|
225
|
-
|
226
|
-
|
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
|