tp_common 0.4.2 → 0.4.3.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/gemfiles/rails_4.gemfile.lock +3 -3
- data/gemfiles/rails_5.gemfile.lock +3 -3
- data/gemfiles/rails_latest.gemfile.lock +3 -3
- data/lib/tp_common.rb +1 -0
- data/lib/tp_common/asset_loaders/errors.rb +8 -0
- data/lib/tp_common/asset_loaders/package_path_providers/development.rb +38 -0
- data/lib/tp_common/asset_loaders/package_path_providers/production.rb +15 -0
- data/lib/tp_common/asset_loaders/remote_assets_loader.rb +115 -0
- data/lib/tp_common/version.rb +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 025ffd9b6a300dba51d4e8edbae4a778d300835fa674ec52bcbca3a819d072c9
|
4
|
+
data.tar.gz: 651838404deaf1632f71078813c04b5e0f4486946471be743b9dfdf277669009
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0c929022ae62ef0e961548e79572e64fe1e9a6c01161b14b262e6316e1919b9f24653bb18cf4a10f2461f74ea1ad9550270833306909216afcf6c76ee170039
|
7
|
+
data.tar.gz: 752c51e003424ab2ca708bd617fd39c1d57987e19d71733e63046e54e5dc3a3cb3b3b56401da7e68602f3cc2d9369534310bd895ed7bfbf81779c18d5d19263c
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
tp_common (0.4.
|
4
|
+
tp_common (0.4.3.pre1)
|
5
5
|
activesupport (>= 4.2.0, <= 5.2.1)
|
6
6
|
aws-sdk-s3 (~> 1.19)
|
7
7
|
fog-aws (~> 2.0)
|
@@ -51,8 +51,8 @@ GEM
|
|
51
51
|
thor (>= 0.14.0)
|
52
52
|
arel (6.0.4)
|
53
53
|
aws-eventstream (1.0.1)
|
54
|
-
aws-partitions (1.
|
55
|
-
aws-sdk-core (3.46.
|
54
|
+
aws-partitions (1.140.0)
|
55
|
+
aws-sdk-core (3.46.2)
|
56
56
|
aws-eventstream (~> 1.0)
|
57
57
|
aws-partitions (~> 1.0)
|
58
58
|
aws-sigv4 (~> 1.0)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
tp_common (0.4.
|
4
|
+
tp_common (0.4.3.pre1)
|
5
5
|
activesupport (>= 4.2.0, <= 5.2.1)
|
6
6
|
aws-sdk-s3 (~> 1.19)
|
7
7
|
fog-aws (~> 2.0)
|
@@ -54,8 +54,8 @@ GEM
|
|
54
54
|
thor (>= 0.14.0)
|
55
55
|
arel (7.1.4)
|
56
56
|
aws-eventstream (1.0.1)
|
57
|
-
aws-partitions (1.
|
58
|
-
aws-sdk-core (3.46.
|
57
|
+
aws-partitions (1.140.0)
|
58
|
+
aws-sdk-core (3.46.2)
|
59
59
|
aws-eventstream (~> 1.0)
|
60
60
|
aws-partitions (~> 1.0)
|
61
61
|
aws-sigv4 (~> 1.0)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
tp_common (0.4.
|
4
|
+
tp_common (0.4.3.pre1)
|
5
5
|
activesupport (>= 4.2.0, <= 5.2.1)
|
6
6
|
aws-sdk-s3 (~> 1.19)
|
7
7
|
fog-aws (~> 2.0)
|
@@ -58,8 +58,8 @@ GEM
|
|
58
58
|
thor (>= 0.14.0)
|
59
59
|
arel (9.0.0)
|
60
60
|
aws-eventstream (1.0.1)
|
61
|
-
aws-partitions (1.
|
62
|
-
aws-sdk-core (3.46.
|
61
|
+
aws-partitions (1.140.0)
|
62
|
+
aws-sdk-core (3.46.2)
|
63
63
|
aws-eventstream (~> 1.0)
|
64
64
|
aws-partitions (~> 1.0)
|
65
65
|
aws-sigv4 (~> 1.0)
|
data/lib/tp_common.rb
CHANGED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module TpCommon
|
4
|
+
module AssetLoaders
|
5
|
+
module PackagePathProviders
|
6
|
+
class Development < Production
|
7
|
+
DEVELOPMENT_CDN = 'http://localhost:3001'
|
8
|
+
|
9
|
+
def asset_url(package_name, version, asset)
|
10
|
+
@development ||= head("#{DEVELOPMENT_CDN}/_ping")
|
11
|
+
if @development
|
12
|
+
return "#{cdn(package_name, version)}/#{asset}"
|
13
|
+
end
|
14
|
+
|
15
|
+
super(package_name, version, asset)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def head(url_string)
|
21
|
+
url = URI.parse(url_string)
|
22
|
+
req = Net::HTTP.new(url.host, url.port)
|
23
|
+
req.use_ssl = (url.scheme == 'https')
|
24
|
+
|
25
|
+
path = url.path unless url.path.nil?
|
26
|
+
|
27
|
+
res = begin
|
28
|
+
req.request_head(path || '/')
|
29
|
+
rescue StandardError
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
res.is_a?(Net::HTTPSuccess) || res.is_a?(Net::HTTPRedirection)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module TpCommon
|
2
|
+
module AssetLoaders
|
3
|
+
module PackagePathProviders
|
4
|
+
class Production
|
5
|
+
def initialize(default_cdn)
|
6
|
+
@default_cdn = default_cdn
|
7
|
+
end
|
8
|
+
|
9
|
+
def asset_url(package_name, version, asset)
|
10
|
+
"#{cdn(package_name, version)}/#{asset.to_s.split('.').insert(-2, 'min').join('.')}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'tp_common/asset_loaders/errors'
|
2
|
+
require 'tp_common/asset_loaders/package_path_providers/production'
|
3
|
+
TpCommon::AssetLoaders::ProviderClass = if defined?(Rails) && (Rails.env.development? || Rails.env.test?)
|
4
|
+
require 'tp_common/asset_loaders/package_path_providers/development'
|
5
|
+
TpCommon::AssetLoaders::PackagePathProviders::Development
|
6
|
+
else
|
7
|
+
TpCommon::AssetLoaders::PackagePathProviders::Production
|
8
|
+
end
|
9
|
+
|
10
|
+
module TpCommon
|
11
|
+
module AssetLoaders
|
12
|
+
# This class supports switching between development env and production env in loading assets
|
13
|
+
# Follow TINYpulse development convention.
|
14
|
+
# - Use minified assets on cdn for production
|
15
|
+
# - On development, prefer development spa on local, if not, fallback to production behaviors
|
16
|
+
#
|
17
|
+
# To config:
|
18
|
+
# ```
|
19
|
+
# TpCommon::AssetLoaders::RemoteAssetsLoader.configure do |config|
|
20
|
+
# config.cdn = 'https://other.hotter.cdn'
|
21
|
+
# end
|
22
|
+
# # Load a package. This is required.
|
23
|
+
# TpCommon::AssetLoaders::RemoteAssetsLoader.load(:'any-spa', 'v1.0.0')
|
24
|
+
# ```
|
25
|
+
#
|
26
|
+
# Use in template:
|
27
|
+
# ```
|
28
|
+
# <%= javascript_include_tag TpCommon::AssetLoaders::RemoteAssetsLoader[:'any-spa']['main.js'] %>
|
29
|
+
# ```
|
30
|
+
class RemoteAssetsLoader
|
31
|
+
DEFAULT_CDN = 'https://cdn.tinypulse.com/spa'
|
32
|
+
LoaderConfiguration = Struct.new(:cdn, :package_path_provider)
|
33
|
+
|
34
|
+
class << self
|
35
|
+
# Configure RemoteAssetsLoader, for now, only :cdn is supported
|
36
|
+
# ```
|
37
|
+
# TpCommon::AssetLoaders::RemoteAssetsLoader.configure do |config|
|
38
|
+
# config.cdn = 'https://other.hotter.cdn'
|
39
|
+
# end
|
40
|
+
# ```
|
41
|
+
def configure
|
42
|
+
yield(config)
|
43
|
+
|
44
|
+
config.package_path_provider = TpCommon::AssetLoaders::ProviderClass.new(config.cdn)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Load a package (SPA) with specific version to use.
|
48
|
+
# ```
|
49
|
+
# TpCommon::AssetLoaders::RemoteAssetsLoader.load(:'tinypulse-spa-1', 'v1.0.0')
|
50
|
+
# ```
|
51
|
+
#
|
52
|
+
# To prioritize version from env variable, we dont provide this magic here
|
53
|
+
# So declare it explicitly when load:
|
54
|
+
# ```
|
55
|
+
# TpCommon::AssetLoaders::RemoteAssetsLoader.load(:'tinypulse-spa-1', ENV['SPA_VERSION_TINYPULSE_SPA_1_HOT_CHANGE'] || 'v1.0.0')
|
56
|
+
# ```
|
57
|
+
def load(package_name, version)
|
58
|
+
package_name = package_name.to_sym
|
59
|
+
packages[package_name] = new(package_name, version)
|
60
|
+
packages
|
61
|
+
end
|
62
|
+
|
63
|
+
# Get package:
|
64
|
+
# ```
|
65
|
+
# TpCommon::AssetLoaders::RemoteAssetsLoader[:'tinypulse-spa-1'][:'main.js'] # 'https://some.cdn/spa/tinypulse-spa-1/v1.0.0/main.js'
|
66
|
+
# ```
|
67
|
+
# Raise `PackageIsNotLoaded` exception if package is not found.
|
68
|
+
#
|
69
|
+
# - In Rails development environment, Asset loader will try to ping and access assets at localhost:3001
|
70
|
+
# Which assets are served without minified, so file name is keep the same.
|
71
|
+
# - In other environments, assets are minified and served through cdn
|
72
|
+
# File name will be append `.min` before extension. i.e. 'main.min.js'
|
73
|
+
#
|
74
|
+
def [](package_name)
|
75
|
+
packages[package_name].tap do |package|
|
76
|
+
raise TpCommon::AssetLoaders::Errors::PackageIsNotLoaded.new("Package #{package_name} is not loaded yet.") if package.nil?
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def asset_url(package_name, version, asset)
|
81
|
+
config.package_path_provider.asset_url(package_name, version, asset)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def new_config
|
87
|
+
LoaderConfiguration.new(DEFAULT_CDN, nil)
|
88
|
+
end
|
89
|
+
|
90
|
+
def config
|
91
|
+
@config ||= new_config
|
92
|
+
end
|
93
|
+
|
94
|
+
def packages
|
95
|
+
@packages ||= {}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def initialize(package_name, version)
|
100
|
+
@package_name = package_name
|
101
|
+
@version = version
|
102
|
+
|
103
|
+
@cached_assets = Hash.new { |hash, key| hash[key] = RemoteAssetsLoader.asset_url(@package_name, @version, key.to_s) }
|
104
|
+
end
|
105
|
+
|
106
|
+
def [](asset_name)
|
107
|
+
# TODO: [AV] Do performance test and cache the string in system level
|
108
|
+
# NOTE: [AV] It's secure to check this asset url exists by Net::HTTP then try more than 1 cdn.
|
109
|
+
# but DONT DO IT. Using unavailable spa version/cdn is a SERIOUS problem need to solve, not auto-recovery
|
110
|
+
# beside, this url will be called every page hit, so any milisecond are counted.
|
111
|
+
@cached_assets[asset_name]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
data/lib/tp_common/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tp_common
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3.pre1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TINYpulse Devops
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-02-
|
11
|
+
date: 2019-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -212,6 +212,10 @@ files:
|
|
212
212
|
- lib/tp_common.rb
|
213
213
|
- lib/tp_common/app_config.rb
|
214
214
|
- lib/tp_common/app_config/environment.rb
|
215
|
+
- lib/tp_common/asset_loaders/errors.rb
|
216
|
+
- lib/tp_common/asset_loaders/package_path_providers/development.rb
|
217
|
+
- lib/tp_common/asset_loaders/package_path_providers/production.rb
|
218
|
+
- lib/tp_common/asset_loaders/remote_assets_loader.rb
|
215
219
|
- lib/tp_common/assets_loader.rb
|
216
220
|
- lib/tp_common/file_storage.rb
|
217
221
|
- lib/tp_common/file_storage/base.rb
|
@@ -247,9 +251,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
247
251
|
version: '0'
|
248
252
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
249
253
|
requirements:
|
250
|
-
- - "
|
254
|
+
- - ">"
|
251
255
|
- !ruby/object:Gem::Version
|
252
|
-
version:
|
256
|
+
version: 1.3.1
|
253
257
|
requirements: []
|
254
258
|
rubygems_version: 3.0.2
|
255
259
|
signing_key:
|