cloud_assets 0.0.2 → 0.0.3
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.
- data/README.md +96 -34
- data/lib/cloud_assets.rb +22 -0
- data/lib/cloud_assets/version.rb +1 -1
- metadata +8 -8
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
## cloud_assets
|
2
|
+
|
1
3
|
cloud_assets enables a Rails app to make transparent use of
|
2
4
|
assets on a remote server in an alternative technology.
|
3
5
|
|
4
|
-
Principles and modes of operation
|
5
|
-
---------------------------------
|
6
|
+
## Principles and modes of operation
|
6
7
|
|
7
8
|
You can avoid incorporating static assets in your Rails
|
8
9
|
app directly, if they exist somewhere else on the internet.
|
@@ -20,67 +21,128 @@ remote system, and rewrites URIs in such templates to
|
|
20
21
|
point either to the local Rails system or a CDN, depending
|
21
22
|
on configuration and utility.
|
22
23
|
|
23
|
-
Installation
|
24
|
-
|
24
|
+
## Installation
|
25
|
+
|
26
|
+
Add cloud_assets to your Gemfile and bundle install, then
|
27
|
+
define the necessary configuration in an initializer,
|
28
|
+
e.g. config/initializers/cloud_assets.rb.
|
29
|
+
|
30
|
+
If you don't define the initializer, all the important
|
31
|
+
values will be read from the environment, which is extra
|
32
|
+
handy if you are running on Heroku.
|
33
|
+
|
34
|
+
This initializer will behave the same as no initializer;
|
35
|
+
customize to your taste.
|
25
36
|
|
26
|
-
|
37
|
+
```ruby
|
38
|
+
CloudAssets.setup do |config|
|
27
39
|
|
28
|
-
|
29
|
-
|
40
|
+
# Required: origin URI for remote assets, e.g. http://yourhost.com
|
41
|
+
config.origin = ENV['CLOUD_ASSET_ORIGIN']
|
30
42
|
|
31
|
-
|
32
|
-
|
43
|
+
# If needed: HTTP Basic user for remote assets
|
44
|
+
config.user = ENV['CLOUD_ASSET_USER']
|
33
45
|
|
34
|
-
|
35
|
-
|
36
|
-
is used to rewrite URIs for images and other large static
|
37
|
-
assets to the CDN instead of Rails.
|
46
|
+
# If needed: HTTP Basic user for remote password
|
47
|
+
config.password = ENV['CLOUD_ASSET_PASSWORD']
|
38
48
|
|
39
|
-
|
40
|
-
|
41
|
-
the cloud asset source.
|
49
|
+
# Rewrite URIs to use a CDN
|
50
|
+
config.cdn = ENV['CLOUD_ASSET_CDN']
|
42
51
|
|
43
|
-
|
52
|
+
# Activate verbose logging
|
53
|
+
config.verbose = false
|
44
54
|
|
45
|
-
|
55
|
+
end
|
56
|
+
```
|
46
57
|
|
47
|
-
|
58
|
+
Put a route at the bottom of your routes.rb:
|
48
59
|
|
49
|
-
|
50
|
-
|
60
|
+
```ruby
|
61
|
+
match '*url' => 'cloud_assets#content'
|
62
|
+
```
|
51
63
|
|
52
|
-
|
64
|
+
This will allow cloud_assets to handle anything Rails
|
65
|
+
doesn't recognize.
|
53
66
|
|
54
|
-
|
67
|
+
In application_controller.rb:
|
55
68
|
|
56
|
-
|
69
|
+
```ruby
|
70
|
+
include CloudAssets
|
71
|
+
```
|
57
72
|
|
58
|
-
Additional Configuration
|
59
|
-
------------------------
|
73
|
+
## Additional Configuration
|
60
74
|
|
61
75
|
If you are serving any non-trivial amount of remotely
|
62
76
|
sourced assets out of your Rails system, you'll want a cache.
|
63
|
-
|
77
|
+
FIXME: The cache currently uses dalli only. This should be
|
78
|
+
and can be configured more flexibly in the initializer.
|
64
79
|
|
65
|
-
To enable it, just define $
|
80
|
+
To enable it, just define $dalli_cache somewhere in one of
|
66
81
|
your initializers.
|
67
82
|
|
68
|
-
Usage
|
69
|
-
-----
|
83
|
+
## Usage
|
70
84
|
|
71
85
|
Set a remote layout for an HTML view by defining the URI to
|
72
86
|
the layout on the remote system, e.g.
|
73
87
|
|
74
|
-
|
88
|
+
```ruby
|
89
|
+
set_remote_layout '/templates/foo.html'
|
90
|
+
```
|
75
91
|
|
76
92
|
You can inject additional content into the elements of that
|
77
93
|
template, or override the interior of its elements, using CSS
|
78
94
|
selectors:
|
79
95
|
|
80
|
-
|
81
|
-
|
96
|
+
```ruby
|
97
|
+
inject_into_remote_layout '#notice' => flash[:notice]
|
98
|
+
override_remote_layout 'body' => yield
|
99
|
+
replace_remote_layout '#unwanted_stuff' => 'wanted stuff'
|
100
|
+
remove_remote_layout '.unwanted_classes'
|
101
|
+
```
|
82
102
|
|
83
103
|
Finally, obtain and show the result (complete with rewrites
|
84
104
|
of CDN URLs and so on) with:
|
85
105
|
|
86
|
-
|
106
|
+
```ruby
|
107
|
+
apply_remote_layout
|
108
|
+
```
|
109
|
+
|
110
|
+
So a complete application layout would look something like this (Haml):
|
111
|
+
|
112
|
+
```
|
113
|
+
- set_default_remote_layout '/about/'
|
114
|
+
- inject_into_remote_layout 'head' => (render :partial => 'layouts/headers')
|
115
|
+
- unless yield.empty?
|
116
|
+
- override_remote_layout '#content' => yield
|
117
|
+
!= apply_remote_layout
|
118
|
+
```
|
119
|
+
|
120
|
+
This loads the HTML of the remote "about" page, rewrites references to
|
121
|
+
localhost or the CDN as appropriate, injects Rails headers form the
|
122
|
+
headers partial into the HTML head element, and replaces the interior
|
123
|
+
of the element whose id is "content" -- say it's a div -- with the
|
124
|
+
yield of the Rails view that uses this layout.
|
125
|
+
|
126
|
+
## Fixups
|
127
|
+
|
128
|
+
The remote site likely was not designed to have its HTML repurposed and
|
129
|
+
rewritten on other sites. Sites following best practices *should* not
|
130
|
+
need any manual fixups. However, any number of hacks might produce HTML
|
131
|
+
that cloud_assets does not know how to rewrite. You have an opportunity
|
132
|
+
to fix these by adding a monkey-patch to your initializer:
|
133
|
+
|
134
|
+
```ruby
|
135
|
+
module CloudAssets
|
136
|
+
def self.fixup_html(html)
|
137
|
+
html.gsub 'something bad', 'something good'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
```
|
141
|
+
|
142
|
+
This method is applied immediately before the HTML is delivered to the
|
143
|
+
browser; you can do anything here that you like, but it should be
|
144
|
+
regarded as a hack. If the uncorrectable code is standards-compliant
|
145
|
+
and best practice, it would be good to submit a pull request so
|
146
|
+
cloud_assets can handle it. If not, it would be ideal to fix the
|
147
|
+
remote asset source -- e.g. remove hard-coded references or eliminate
|
148
|
+
unwarranted assumptions.
|
data/lib/cloud_assets.rb
CHANGED
@@ -153,6 +153,17 @@ module CloudAssets
|
|
153
153
|
@overrides.merge! hash
|
154
154
|
end
|
155
155
|
|
156
|
+
def replace_remote_layout(hash)
|
157
|
+
if @replacements.nil?
|
158
|
+
@replacements = {}
|
159
|
+
end
|
160
|
+
@replacements.merge! hash
|
161
|
+
end
|
162
|
+
|
163
|
+
def remove_remote_layout(selector)
|
164
|
+
replace_remote_layout(selector => '')
|
165
|
+
end
|
166
|
+
|
156
167
|
def set_remote_layout(layout)
|
157
168
|
@remote_layout = layout
|
158
169
|
end
|
@@ -177,6 +188,15 @@ module CloudAssets
|
|
177
188
|
else
|
178
189
|
doc = optimized_html_for @remote_layout
|
179
190
|
end
|
191
|
+
unless @replacements.nil?
|
192
|
+
@replacements.each do |key, value|
|
193
|
+
begin
|
194
|
+
doc.at_css(key).replace(value)
|
195
|
+
rescue
|
196
|
+
puts "Failed to replace template element: #{key}"
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
180
200
|
unless @overrides.nil?
|
181
201
|
@overrides.each do |key, value|
|
182
202
|
begin
|
@@ -213,6 +233,8 @@ module CloudAssets
|
|
213
233
|
include ControllerMethods
|
214
234
|
helper_method :inject_into_remote_layout
|
215
235
|
helper_method :override_remote_layout
|
236
|
+
helper_method :replace_remote_layout
|
237
|
+
helper_method :remove_remote_layout
|
216
238
|
helper_method :set_remote_layout
|
217
239
|
helper_method :set_default_remote_layout
|
218
240
|
helper_method :apply_remote_layout
|
data/lib/cloud_assets/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloud_assets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: typhoeus
|
16
|
-
requirement: &
|
16
|
+
requirement: &70170673604560 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70170673604560
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &70170673603960 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70170673603960
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: dalli
|
38
|
-
requirement: &
|
38
|
+
requirement: &70170673602980 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70170673602980
|
47
47
|
description: ! "\n This gem is in use in some production sites to provide\n backing
|
48
48
|
for a Rails app using content from WordPress and\n PostLaunch (a Java based CMS),
|
49
49
|
and has specific\n dependencies on Typhoeus, Nokogiri, and dalli, favorites\n
|