sprockets_cdn 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d3cd18569d6cbdc48a6423aaf8e0cb7e1f1daa5a
4
+ data.tar.gz: 811aa641e2b97f5bb0950478b56fe8fa49f45378
5
+ SHA512:
6
+ metadata.gz: c9c3aca72c0eafeb3c28fd72a975e4eea1d96222253f31c40b6a4ded009c8fa85d25b2da5a96e35e8392c875a04b43496ff0da86edbffbf0d0cea5193371278d
7
+ data.tar.gz: ca536c7e80ea3fa390d3f76a18656a190fa2042a9ba393d44261c52800b0c9e228e66f1092f3535f0e9ccbfb65f48653e48c73811690816de452a58eaad02559
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 arnkorty
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # SprocketsCdn
2
+
3
+ ** A Sprockets CDN extendsion gem, upload assets to upyun/qiniu. **
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'sprockets_cdn'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install sprockets_cdn
20
+
21
+ ## Usage
22
+ ```ruby
23
+ # config/initializes/sprockets_cdn.rb
24
+ SprocketsCDN.config do |config|
25
+ config.bucket = "bucket name"
26
+ config.asset_host = "asset host"
27
+ ## for qiniu
28
+ config.adapter = 'qiniu'
29
+ config.access_key = "xxxx"
30
+ config.secret_key = "xxxx"
31
+ ## for upyun
32
+ config.adapter = 'upyun'
33
+ config.access_key = "as username"
34
+ config.secret_key = "as password"
35
+ end
36
+ ```
37
+ then
38
+ ```bash
39
+ ## run compile assets,it will upload to cdn after compile
40
+ RAILS_ENV=production bundle exec rake assets:precompile
41
+ ```
42
+
43
+ ## Contributing
44
+
45
+ Bug reports and pull requests are welcome on GitHub at https://github.com/arnkorty/sprockets_cdn. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
46
+
47
+
48
+ ## License
49
+
50
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'base64'
3
+ module SprocketsCDN
4
+ module Adapters
5
+ class Base
6
+ attr_accessor :access_key, :secret_key
7
+ def initialize opt
8
+ @access_key = opt[:access_key]
9
+ @secret_key = opt[:secret_key]
10
+ @asset_host = opt[:asset_host]
11
+ @bucket = opt[:bucket]
12
+ end
13
+
14
+ def get_key full_path, base_dir
15
+ if defined? Rails
16
+ asset_root = Rails.root.join('public').to_s
17
+ asset_root = base_dir unless base_dir.include?(asset_root)
18
+ full_path.sub(asset_root, '')
19
+ else
20
+ full_path.sub(base_dir, '')
21
+ end
22
+ end
23
+
24
+ def urlsafe_base64_encode content
25
+ Base64.encode64(content).strip.gsub('+', '-').gsub('/','_').gsub(/\r?\n/, '')
26
+ end
27
+
28
+ def generate_remote_url path
29
+ URI.join(@asset_host, path)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,50 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'hmac-sha1'
3
+ require 'restclient'
4
+ require 'base64'
5
+ require 'json'
6
+ require 'sprockets_cdn/adapters/base'
7
+ module SprocketsCDN
8
+ module Adapters
9
+ class Qiniu < Base
10
+
11
+ def uploading file, opt
12
+ put_policy = generate_put_policy file, opt
13
+ uptoken = uptoken(put_policy)
14
+ post_data = {
15
+ file: File.new(file, 'rb'),
16
+ multipart: true,
17
+ key: put_policy[:saveKey],
18
+ token: uptoken
19
+ }
20
+
21
+ res = RestClient.post "http://up.qiniu.com/", post_data
22
+ target = JSON.parse(res)['key']
23
+ # URI.join(@asset_host, target).to_s
24
+ generate_remote_url target
25
+ end
26
+
27
+ def generate_put_policy file, opt
28
+ opt[:saveKey] = get_key file, opt[:dir] #file.sub(opt[:dir].to_s, '')
29
+ opt[:scope] = @bucket
30
+ opt[:deadline] = Time.now.to_i + 3600
31
+ opt
32
+ end
33
+
34
+ def get_key file, dir
35
+ path = super file, dir
36
+ path = path[1..-1] if path =~ /^\//
37
+ path
38
+ end
39
+
40
+ def uptoken put_policy
41
+ encoded_put_policy = urlsafe_base64_encode put_policy.to_json
42
+
43
+ sign = HMAC::SHA1.new(@secret_key).update(encoded_put_policy).digest
44
+ encoded_sign = urlsafe_base64_encode sign
45
+
46
+ uptoken = "#{@access_key}:#{encoded_sign}:#{encoded_put_policy}"
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,59 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'restclient'
3
+ require 'digest/md5'
4
+ require 'sprockets_cdn/adapters/base'
5
+ module SprocketsCDN
6
+ module Adapters
7
+ class Upyun < Base
8
+ attr_accessor :username, :password
9
+ def initialize opt
10
+ super
11
+ @username = opt[:username] || @access_key
12
+ @password = md5(opt[:password] || @secret_key)
13
+ end
14
+
15
+ def uploading file, opt
16
+ headers = {mkdir: true}
17
+
18
+ key = get_key file, opt[:dir]
19
+ body = File.new(file, 'rb')
20
+ post_data = {
21
+ body: body
22
+ }
23
+ date = Time.now.utc.strftime('%a, %d %b %Y %H:%M:%S GMT')
24
+
25
+ sign = sign(:put, date, fullpath(key), body.size)
26
+ headers[:Date] = date
27
+ headers[:Authorization] = sign
28
+ res = RestClient.put post_url(key), body, headers
29
+ if res.code == 200
30
+ URI.join(@asset_host, key).to_s
31
+ end
32
+ # target = JSON.parse(res)['key']
33
+ # URI.join(@asset_host, target).to_s
34
+ generate_remote_url key
35
+ end
36
+
37
+ def post_url key
38
+ "http://v0.api.upyun.com/#{@bucket}/" + key #).to_s
39
+ end
40
+
41
+ def base_url
42
+ "http://v0.api.upyun.com"
43
+ end
44
+
45
+ def fullpath key
46
+ File.join("/#{@bucket}", key).to_s
47
+ end
48
+
49
+ def md5 content
50
+ Digest::MD5.hexdigest content
51
+ end
52
+
53
+ def sign(method, date, path, length)
54
+ sign = "#{method.to_s.upcase}&#{path}&#{date}&#{length}&#{@password}"
55
+ "UpYun #{@username}:#{md5(sign)}"
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,22 @@
1
+ require 'sprockets_cdn/configuration'
2
+ require "active_support/core_ext/string/inflections"
3
+ module SprocketsCDN
4
+ class AssetsUpload
5
+ class << self
6
+ def setup assets, dir, logger
7
+ return unless SprocketsCDN::Configuration.checked?
8
+ require "sprockets_cdn/adapters/#{SprocketsCDN::Configuration.config.adapter}"
9
+ kclass = SprocketsCDN::Adapters.const_get SprocketsCDN::Configuration.config.adapter.classify
10
+ client = kclass.new SprocketsCDN::Configuration.config
11
+ remote_data = {}
12
+ assets.each do |key, asset|
13
+ target = File.join(dir, asset)
14
+ remote_target = client.uploading target, dir: dir
15
+ logger.info "Uploaded to #{remote_target}"
16
+ remote_data[key] = remote_target
17
+ end
18
+ remote_data
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ require 'active_support/configurable'
2
+ module SprocketsCDN
3
+ class Configuration < ::ActiveSupport::Configurable::Configuration
4
+ # attr_accessor :adapter, :bucket, :access_key, :secret_key, :asset_host
5
+ def self.checked?
6
+ config.adapter && config.bucket && config.access_key && config.secret_key && config.asset_host
7
+ end
8
+ def self.config
9
+ @@config ||= ActiveSupport::Configurable::Configuration.new
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'sprockets/manifest'
2
+ require 'sprockets_cdn/assets_upload'
3
+ Sprockets::Manifest.class_eval do
4
+ attr_accessor :remote_data
5
+ def compile_with_cdn(*args)
6
+ old_result = compile_without_cdn *args
7
+ @remote_data = SprocketsCDN::AssetsUpload.setup assets, dir, logger
8
+ old_result
9
+ end
10
+ alias_method :compile_without_cdn, :compile
11
+ alias_method :compile, :compile_with_cdn
12
+ end
@@ -0,0 +1,3 @@
1
+ module SprocketsCdn
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,15 @@
1
+ require "sprockets_cdn/version"
2
+ require "sprockets_cdn/manifest_ext"
3
+ require "sprockets_cdn/configuration"
4
+ module SprocketsCDN
5
+ def self.config &block
6
+ yield SprocketsCDN::Configuration.config
7
+ if defined? Rails
8
+ ActionController::Base.asset_host =
9
+ Rails.application.config.action_controller.asset_host ||=
10
+ SprocketsCDN::Configuration.config.asset_host
11
+ end
12
+ raise "config isn't setting" unless SprocketsCDN::Configuration.checked?
13
+ end
14
+ # Your code goes here...
15
+ end
metadata ADDED
@@ -0,0 +1,348 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sprockets_cdn
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - arnkorty
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sprockets
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-hmac
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rest-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.10'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.10'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '10.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: babel-transpiler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.6'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: closure-compiler
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.1'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.1'
139
+ - !ruby/object:Gem::Dependency
140
+ name: coffee-script-source
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.6'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.6'
153
+ - !ruby/object:Gem::Dependency
154
+ name: coffee-script
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '2.2'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '2.2'
167
+ - !ruby/object:Gem::Dependency
168
+ name: eco
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: ejs
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '1.0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '1.0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: execjs
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '2.0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '2.0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: minitest
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '5.0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '5.0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: nokogiri
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '1.3'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '1.3'
237
+ - !ruby/object:Gem::Dependency
238
+ name: rack-test
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: '0.6'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: '0.6'
251
+ - !ruby/object:Gem::Dependency
252
+ name: sass
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: '3.1'
258
+ type: :development
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: '3.1'
265
+ - !ruby/object:Gem::Dependency
266
+ name: uglifier
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: '2.3'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: '2.3'
279
+ - !ruby/object:Gem::Dependency
280
+ name: yui-compressor
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '0.12'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: '0.12'
293
+ - !ruby/object:Gem::Dependency
294
+ name: pry
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ type: :development
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - ">="
305
+ - !ruby/object:Gem::Version
306
+ version: '0'
307
+ description: a cdn assets for sprockets, upload assets to upyun/qiniu
308
+ email:
309
+ - arnkorty.fu@gmail.com
310
+ executables: []
311
+ extensions: []
312
+ extra_rdoc_files: []
313
+ files:
314
+ - LICENSE.txt
315
+ - README.md
316
+ - lib/sprockets_cdn.rb
317
+ - lib/sprockets_cdn/adapters/base.rb
318
+ - lib/sprockets_cdn/adapters/qiniu.rb
319
+ - lib/sprockets_cdn/adapters/upyun.rb
320
+ - lib/sprockets_cdn/assets_upload.rb
321
+ - lib/sprockets_cdn/configuration.rb
322
+ - lib/sprockets_cdn/manifest_ext.rb
323
+ - lib/sprockets_cdn/version.rb
324
+ homepage: https://github.com/arnkorty/sprockets_cdn
325
+ licenses:
326
+ - MIT
327
+ metadata: {}
328
+ post_install_message:
329
+ rdoc_options: []
330
+ require_paths:
331
+ - lib
332
+ required_ruby_version: !ruby/object:Gem::Requirement
333
+ requirements:
334
+ - - ">="
335
+ - !ruby/object:Gem::Version
336
+ version: '0'
337
+ required_rubygems_version: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - ">="
340
+ - !ruby/object:Gem::Version
341
+ version: '0'
342
+ requirements: []
343
+ rubyforge_project:
344
+ rubygems_version: 2.4.8
345
+ signing_key:
346
+ specification_version: 4
347
+ summary: a cdn assets for sprockets
348
+ test_files: []