torba 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +10 -0
- data/{Readme.md → README.md} +63 -8
- data/lib/torba/css_url_to_erb_asset_path.rb +1 -1
- data/lib/torba/import_list.rb +12 -1
- data/lib/torba/manifest.rb +38 -0
- data/lib/torba/package.rb +21 -4
- data/lib/torba/rails.rb +1 -0
- data/lib/torba/remote_sources/get_file.rb +24 -0
- data/lib/torba/remote_sources/npm.rb +28 -0
- data/lib/torba/remote_sources/targz.rb +37 -0
- data/lib/torba/remote_sources/zip.rb +4 -15
- data/lib/torba.rb +10 -0
- data/test/acceptance_test.rb +51 -7
- data/test/import_list_test.rb +6 -0
- data/test/manifest_test.rb +47 -0
- data/test/package/import_list_test.rb +11 -11
- data/test/package/logical_paths_test.rb +28 -0
- data/test/remote_sources/get_file_test.rb +12 -0
- data/test/remote_sources/npm_test.rb +34 -0
- data/test/remote_sources/targz_test.rb +29 -0
- data/test/remote_sources/zip_test.rb +0 -7
- data/torba.gemspec +1 -1
- metadata +14 -5
- data/test/Torbafile +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04e11c81ece9ca358a44330fd7ef22317bba7d3c
|
4
|
+
data.tar.gz: 47cabbe91908c788a9b552459770e2faa3f52a4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2dddf5b66d3ea94ab020fa14be5d2c04f88df1c88c6bcade53ce9d7821661b3120d235acde322030aa7d59bd1c111969cc8c581578ed4b4ead1eb4476f25ea7
|
7
|
+
data.tar.gz: 08b7d6437572ac60111128b88ca5db4de13291eac917daf5d0361633024996dfe93209e48a8be143fd2519fad3f41f3e1db358426df9024e6e766a8f59ecf490
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
## Unreleased
|
2
2
|
|
3
|
+
## Version 0.3.0
|
4
|
+
|
5
|
+
### Enhancements
|
6
|
+
|
7
|
+
* Rails setup automatically populates `Rails.application.config.assets.precompile`
|
8
|
+
If libraries added via Torba have image/font content, you can remove it from
|
9
|
+
that list, no need for manual manipulation
|
10
|
+
* Support .tar.gz remote sources
|
11
|
+
* Support npm packages
|
12
|
+
|
3
13
|
## Version 0.2.1
|
4
14
|
|
5
15
|
### Bug fixes
|
data/{Readme.md → README.md}
RENAMED
@@ -13,11 +13,11 @@ of a JS/CSS library and puts it under Sprockets' [load path][sprockets-load-path
|
|
13
13
|
|
14
14
|
## Status
|
15
15
|
|
16
|
-
|
16
|
+
Production ready.
|
17
17
|
|
18
18
|
## Documentation
|
19
19
|
|
20
|
-
http://rubydoc.info/
|
20
|
+
[Released version](http://rubydoc.info/gems/torba/0.3.0)
|
21
21
|
|
22
22
|
## Why
|
23
23
|
|
@@ -44,6 +44,8 @@ Problems with the Bower:
|
|
44
44
|
|
45
45
|
* curl
|
46
46
|
* unzip
|
47
|
+
* gzip
|
48
|
+
* tar
|
47
49
|
|
48
50
|
## Design limitations
|
49
51
|
|
@@ -87,6 +89,8 @@ it config/application.rb
|
|
87
89
|
3. Add "require" [Sprockets directives][sprockets-directives] to your "application.js"
|
88
90
|
and/or "@import" [Sass directives][sass-import] to "application.css".
|
89
91
|
|
92
|
+
4. Non JS/CSS assets are automatically added to precompile list, nothing to do here.
|
93
|
+
|
90
94
|
If any changes made to the Torbafile, run `bundle exec torba pack` again.
|
91
95
|
|
92
96
|
### Torbafile
|
@@ -94,7 +98,8 @@ If any changes made to the Torbafile, run `bundle exec torba pack` again.
|
|
94
98
|
Torbafile is an assets specification. It is a plain text file that contains one or more
|
95
99
|
sections, each of them describes one remote source of assets.
|
96
100
|
|
97
|
-
Currently only zip archives
|
101
|
+
Currently only zip, tar.gz archives, [Github releases][github-releases] and
|
102
|
+
[npm packages][npm] are supported.
|
98
103
|
|
99
104
|
#### Zip archive package
|
100
105
|
|
@@ -112,6 +117,20 @@ where "name" is an arbitrary name for the package, more on "import" below. For e
|
|
112
117
|
zip "scroll_magic", url: "https://github.com/janpaepke/ScrollMagic/archive/v2.0.0.zip"
|
113
118
|
```
|
114
119
|
|
120
|
+
#### Tar.gz archive package
|
121
|
+
|
122
|
+
The syntax is same as for a zip package:
|
123
|
+
|
124
|
+
```
|
125
|
+
targz "name", url: "..." [, import: %w(...)]
|
126
|
+
```
|
127
|
+
|
128
|
+
for example,
|
129
|
+
|
130
|
+
```
|
131
|
+
targz "scroll_magic", url: "https://github.com/janpaepke/ScrollMagic/archive/v2.0.0.tar.gz"
|
132
|
+
```
|
133
|
+
|
115
134
|
#### Github release package
|
116
135
|
|
117
136
|
This is a more readable version/shortcut for "https://github.com/.../archive/..." URLs.
|
@@ -135,6 +154,29 @@ You can omit the name, it will be equal to the repository name:
|
|
135
154
|
gh_release source: "janpaepke/ScrollMagic", tag: "v.2.0.0" # "ScrollMagic" is assumed
|
136
155
|
```
|
137
156
|
|
157
|
+
#### npm package
|
158
|
+
|
159
|
+
Allows to download packages from npm registry.
|
160
|
+
|
161
|
+
The syntax is:
|
162
|
+
|
163
|
+
```
|
164
|
+
npm "name", package: "...", version: "..." [, import: %w(...)]
|
165
|
+
```
|
166
|
+
|
167
|
+
where "package" is the package name as published on npm registry and "version" is its version,
|
168
|
+
more on "import" below. For example,
|
169
|
+
|
170
|
+
```
|
171
|
+
npm "coffee", package: "coffee-script", version: "1.9.2"
|
172
|
+
```
|
173
|
+
|
174
|
+
You can omit the name, it will be equal to the package name:
|
175
|
+
|
176
|
+
```
|
177
|
+
npm package: "coffee-script", version: "1.9.2"
|
178
|
+
```
|
179
|
+
|
138
180
|
### "Packing the torba" process
|
139
181
|
|
140
182
|
When you run `torba pack` the following happens:
|
@@ -158,7 +200,7 @@ duplication:
|
|
158
200
|
//= require 'underscore/underscore'
|
159
201
|
```
|
160
202
|
|
161
|
-
Hint: use "require_directory" if you strongly against such duplication:
|
203
|
+
Hint: use "require_directory" if you're strongly against such duplication:
|
162
204
|
|
163
205
|
```javascript
|
164
206
|
//= require_directory 'underscore'
|
@@ -187,7 +229,7 @@ gh_release "lightslider", source: "sachinchoolur/lightslider", tag: "1.1.2", imp
|
|
187
229
|
```
|
188
230
|
|
189
231
|
Such files will be copied directly to the package root (i.e. file tree becomes flatten), thus you
|
190
|
-
can omit
|
232
|
+
can omit unnecessary paths:
|
191
233
|
|
192
234
|
```css
|
193
235
|
@import 'lightslider/lightslider';
|
@@ -204,14 +246,27 @@ gh_release "lightslider", source: "sachinchoolur/lightslider", tag: "1.1.2", imp
|
|
204
246
|
|
205
247
|
In addition to this "path/" is treated as a shortcut for "path/**/*" glob pattern.
|
206
248
|
|
249
|
+
Be careful to **import only that you really need**. Everything that is non JS or CSS asset is
|
250
|
+
going to be precompiled by Sprockets and accessible publicly. See [Rails ticket][rails-ticket-vendoring]
|
251
|
+
that explains this problem (and why Rails >= 4 precompiles only application.js/css in vendor by
|
252
|
+
default), except that Torba does have a way to specify exact list of files to import.
|
253
|
+
|
254
|
+
## Deployment
|
255
|
+
|
256
|
+
1. Specify `TORBA_HOME_PATH` env variable pointing to a persistent directory writable by your
|
257
|
+
deploy user. For Capistrano it should be `shared/`.
|
258
|
+
2. Add `bundle exec torba pack` to your deployment script right after `bundle install`. It's safe
|
259
|
+
and fairly cheap to run it unconditionally on each deployment.
|
207
260
|
|
208
261
|
[bower]: http://bower.io/
|
209
|
-
[sprockets]: https://github.com/
|
210
|
-
[sprockets-load-path]: https://github.com/
|
262
|
+
[sprockets]: https://github.com/rails/sprockets/
|
263
|
+
[sprockets-load-path]: https://github.com/rails/sprockets#the-load-path
|
211
264
|
[torba-pronounce]: http://upload.wikimedia.org/wikipedia/commons/2/28/Uk-%D1%82%D0%BE%D1%80%D0%B1%D0%B0.ogg
|
212
265
|
[github-releases]: https://help.github.com/articles/about-releases/
|
213
|
-
[sprockets-directives]: https://github.com/
|
266
|
+
[sprockets-directives]: https://github.com/rails/sprockets#the-directive-processor
|
214
267
|
[sass-import]: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#import
|
215
268
|
[rails-assets]: https://rails-assets.org/
|
216
269
|
[bower-rails]: https://github.com/rharriso/bower-rails
|
217
270
|
[semver]: http://semver.org/
|
271
|
+
[rails-ticket-vendoring]: https://github.com/rails/rails/pull/7968
|
272
|
+
[npm]: https://npmjs.com
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Torba
|
2
2
|
# Parses content of CSS file and converts its image assets paths into Sprockets'
|
3
|
-
# {https://github.com/
|
3
|
+
# {https://github.com/rails/sprockets#logical-paths logical paths}.
|
4
4
|
class CssUrlToErbAssetPath
|
5
5
|
URL_RE =
|
6
6
|
/
|
data/lib/torba/import_list.rb
CHANGED
@@ -5,10 +5,14 @@ module Torba
|
|
5
5
|
|
6
6
|
# Represents a list of assets to be imported from a remote source.
|
7
7
|
class ImportList
|
8
|
-
class Asset < Struct.new(:absolute_path, :
|
8
|
+
class Asset < Struct.new(:absolute_path, :logical_path)
|
9
9
|
def css?
|
10
10
|
absolute_path.end_with?(".css")
|
11
11
|
end
|
12
|
+
|
13
|
+
def js?
|
14
|
+
absolute_path.end_with?(".js")
|
15
|
+
end
|
12
16
|
end
|
13
17
|
|
14
18
|
# @return [Array<Asset>] full list of assets to be imported.
|
@@ -34,5 +38,12 @@ module Torba
|
|
34
38
|
def non_css_assets
|
35
39
|
assets.find_all { |asset| !asset.css? }
|
36
40
|
end
|
41
|
+
|
42
|
+
# @return [Array<Asset>] list of assets to be imported except javascripts and
|
43
|
+
# stylesheets.
|
44
|
+
# @since 0.3.0
|
45
|
+
def non_js_css_assets
|
46
|
+
assets.find_all { |asset| !(asset.js? || asset.css?) }
|
47
|
+
end
|
37
48
|
end
|
38
49
|
end
|
data/lib/torba/manifest.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "torba/package"
|
2
2
|
require "torba/remote_sources/zip"
|
3
3
|
require "torba/remote_sources/github_release"
|
4
|
+
require "torba/remote_sources/targz"
|
5
|
+
require "torba/remote_sources/npm"
|
4
6
|
|
5
7
|
module Torba
|
6
8
|
# Represents Torbafile.
|
@@ -50,6 +52,29 @@ module Torba
|
|
50
52
|
packages << Package.new(name, remote_source, options)
|
51
53
|
end
|
52
54
|
|
55
|
+
# Adds {Package} with {RemoteSources::Targz} to {#packages}
|
56
|
+
# @since 0.3.0
|
57
|
+
def targz(name, options = {})
|
58
|
+
url = options.fetch(:url)
|
59
|
+
remote_source = RemoteSources::Targz.new(url)
|
60
|
+
packages << Package.new(name, remote_source, options)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Adds {Package} with {RemoteSources::Npm} to {#packages}
|
64
|
+
# @since 0.3.0
|
65
|
+
def npm(name = nil, options = {})
|
66
|
+
if name.is_a?(Hash)
|
67
|
+
options, name = name, nil
|
68
|
+
end
|
69
|
+
|
70
|
+
package_name = options.fetch(:package)
|
71
|
+
version = options.fetch(:version)
|
72
|
+
remote_source = RemoteSources::Npm.new(package_name, version)
|
73
|
+
|
74
|
+
name ||= remote_source.package
|
75
|
+
packages << Package.new(name, remote_source, options)
|
76
|
+
end
|
77
|
+
|
53
78
|
# Builds all {#packages}
|
54
79
|
# @return [void]
|
55
80
|
def pack
|
@@ -62,6 +87,19 @@ module Torba
|
|
62
87
|
packages.map(&:load_path)
|
63
88
|
end
|
64
89
|
|
90
|
+
# @return [Array<String>] logical paths that packages contain except JS ans CSS.
|
91
|
+
# It should be appended to the Sprockets' precompile list. Packages' JS and CSS
|
92
|
+
# are meant to be included into application.js/.css and not to be compiled
|
93
|
+
# alone (you can add them by hand though).
|
94
|
+
# @note Avoid importing everything from a package as it'll be precompiled and accessible
|
95
|
+
# publicly.
|
96
|
+
# @see Package#import_paths
|
97
|
+
# @see Package#non_js_css_logical_paths
|
98
|
+
# @since 0.3.0
|
99
|
+
def non_js_css_logical_paths
|
100
|
+
packages.flat_map(&:non_js_css_logical_paths)
|
101
|
+
end
|
102
|
+
|
65
103
|
# Verifies all {#packages}
|
66
104
|
# @return [void]
|
67
105
|
def verify
|
data/lib/torba/package.rb
CHANGED
@@ -37,6 +37,9 @@ module Torba
|
|
37
37
|
# ["build/*.js", "**/*.css"]
|
38
38
|
# @example Any file within directory (including subdirectories)
|
39
39
|
# ["build/"] # same as ["build/**/*"]
|
40
|
+
# @note Put in this list only files that are absolutely necessary to you as
|
41
|
+
# {Manifest#non_js_css_logical_paths} depends on it.
|
42
|
+
# @see #build
|
40
43
|
attr_reader :import_paths
|
41
44
|
|
42
45
|
# @param name [String] see {#name}
|
@@ -92,6 +95,20 @@ module Torba
|
|
92
95
|
@load_path ||= File.join(Torba.home_path, folder_name)
|
93
96
|
end
|
94
97
|
|
98
|
+
# @return [Array<String>] {https://github.com/rails/sprockets#logical-paths logical paths} that
|
99
|
+
# the package contains.
|
100
|
+
# @since 0.3.0
|
101
|
+
def logical_paths
|
102
|
+
import_list.assets.map(&:logical_path)
|
103
|
+
end
|
104
|
+
|
105
|
+
# @return [Array<String>] {https://github.com/rails/sprockets#logical-paths logical paths} that the
|
106
|
+
# package contains except JS ans CSS.
|
107
|
+
# @since 0.3.0
|
108
|
+
def non_js_css_logical_paths
|
109
|
+
import_list.non_js_css_assets.map(&:logical_path)
|
110
|
+
end
|
111
|
+
|
95
112
|
# @return [ImportList]
|
96
113
|
def import_list
|
97
114
|
@import_list ||= build_import_list
|
@@ -126,7 +143,7 @@ module Torba
|
|
126
143
|
relative_path.sub(path_wo_glob_metacharacters, "")
|
127
144
|
end
|
128
145
|
|
129
|
-
ImportList::Asset.new(absolute_path, subpath)
|
146
|
+
ImportList::Asset.new(absolute_path, with_namespace(subpath))
|
130
147
|
end
|
131
148
|
|
132
149
|
if assets.empty?
|
@@ -145,10 +162,10 @@ module Torba
|
|
145
162
|
|
146
163
|
new_content = CssUrlToErbAssetPath.call(content, asset.absolute_path) do |image_file_path|
|
147
164
|
image_asset = import_list.find_by_absolute_path(image_file_path)
|
148
|
-
|
165
|
+
image_asset.logical_path
|
149
166
|
end
|
150
167
|
|
151
|
-
new_absolute_path = File.join(load_path,
|
168
|
+
new_absolute_path = File.join(load_path, asset.logical_path + ".erb")
|
152
169
|
ensure_directory(new_absolute_path)
|
153
170
|
File.write(new_absolute_path, new_content)
|
154
171
|
end
|
@@ -156,7 +173,7 @@ module Torba
|
|
156
173
|
|
157
174
|
def process_other_assets
|
158
175
|
import_list.non_css_assets.each do |asset|
|
159
|
-
new_absolute_path = File.join(load_path,
|
176
|
+
new_absolute_path = File.join(load_path, asset.logical_path)
|
160
177
|
ensure_directory(new_absolute_path)
|
161
178
|
FileUtils.cp(asset.absolute_path, new_absolute_path)
|
162
179
|
end
|
data/lib/torba/rails.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "tempfile"
|
2
|
+
|
3
|
+
module Torba
|
4
|
+
module RemoteSources
|
5
|
+
# File downloading abstraction
|
6
|
+
# @since 0.3.0
|
7
|
+
class GetFile
|
8
|
+
# @param url [String] to be downloaded.
|
9
|
+
# @return [Tempfile] temporarily stored content of the URL.
|
10
|
+
# @raise [Errors::ShellCommandFailed] if failed to fetch the URL
|
11
|
+
def self.process(url)
|
12
|
+
tempfile = Tempfile.new("torba")
|
13
|
+
tempfile.close
|
14
|
+
|
15
|
+
Torba.ui.info "downloading '#{url}'"
|
16
|
+
|
17
|
+
command = "curl -Lf -o #{tempfile.path} #{url}"
|
18
|
+
system(command) || raise(Errors::ShellCommandFailed.new(command))
|
19
|
+
|
20
|
+
tempfile
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "torba/remote_sources/targz"
|
2
|
+
|
3
|
+
module Torba
|
4
|
+
module RemoteSources
|
5
|
+
# Represents {https://npmjs.com npm package}.
|
6
|
+
# @since 0.3.0
|
7
|
+
class Npm < Targz
|
8
|
+
# @return [String] package name.
|
9
|
+
# @example
|
10
|
+
# "coffee-script"
|
11
|
+
attr_reader :package
|
12
|
+
|
13
|
+
# @return [String] package version.
|
14
|
+
# @example
|
15
|
+
# "1.8.3"
|
16
|
+
attr_reader :version
|
17
|
+
|
18
|
+
# @param package see {#package}
|
19
|
+
# @param version see {#version}
|
20
|
+
def initialize(package, version)
|
21
|
+
@package = package
|
22
|
+
@version = version
|
23
|
+
super("https://registry.npmjs.org/#{package}/-/#{package}-#{version}.tgz")
|
24
|
+
@digest = "#{package}-#{Torba.digest(url)}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
require "torba/remote_sources/common"
|
4
|
+
require "torba/remote_sources/get_file"
|
5
|
+
|
6
|
+
module Torba
|
7
|
+
module RemoteSources
|
8
|
+
# Represents remote tar.gz archive.
|
9
|
+
# @since 0.3.0
|
10
|
+
class Targz
|
11
|
+
include Common
|
12
|
+
|
13
|
+
attr_reader :url, :digest
|
14
|
+
|
15
|
+
def initialize(url)
|
16
|
+
@url = url
|
17
|
+
@digest = "#{File.basename(url).sub(/\.(tgz|tar\.gz)$/, '')}-#{Torba.digest(url)}"
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def ensure_cached
|
23
|
+
unless Dir.exist?(cache_path)
|
24
|
+
FileUtils.mkdir_p(cache_path)
|
25
|
+
|
26
|
+
tempfile = GetFile.process(url)
|
27
|
+
|
28
|
+
command = "gzip -qcd #{tempfile.path} | tar -mxpf - --strip-components=1 -C #{cache_path}"
|
29
|
+
system(command) || raise(Errors::ShellCommandFailed.new(command))
|
30
|
+
end
|
31
|
+
rescue
|
32
|
+
FileUtils.rm_rf(cache_path)
|
33
|
+
raise
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,13 +1,9 @@
|
|
1
|
-
require "tempfile"
|
2
1
|
require "fileutils"
|
3
2
|
|
4
3
|
require "torba/remote_sources/common"
|
4
|
+
require "torba/remote_sources/get_file"
|
5
5
|
|
6
6
|
module Torba
|
7
|
-
module Errors
|
8
|
-
ShellCommandFailed = Class.new(StandardError)
|
9
|
-
end
|
10
|
-
|
11
7
|
module RemoteSources
|
12
8
|
# Represents remote zip archive.
|
13
9
|
class Zip
|
@@ -26,17 +22,10 @@ module Torba
|
|
26
22
|
unless Dir.exist?(cache_path)
|
27
23
|
FileUtils.mkdir_p(cache_path)
|
28
24
|
|
29
|
-
tempfile =
|
30
|
-
tempfile.close
|
31
|
-
|
32
|
-
Torba.ui.info "downloading '#{url}'"
|
25
|
+
tempfile = GetFile.process(url)
|
33
26
|
|
34
|
-
|
35
|
-
|
36
|
-
"unzip -oqq -d #{cache_path} #{tempfile.path}",
|
37
|
-
].each do |command|
|
38
|
-
system(command) || raise(Errors::ShellCommandFailed.new(command))
|
39
|
-
end
|
27
|
+
command = "unzip -oqq -d #{cache_path} #{tempfile.path}"
|
28
|
+
system(command) || raise(Errors::ShellCommandFailed.new(command))
|
40
29
|
|
41
30
|
get_rid_of_top_level_directory
|
42
31
|
end
|
data/lib/torba.rb
CHANGED
@@ -5,6 +5,10 @@ require "torba/manifest"
|
|
5
5
|
|
6
6
|
# @since 0.1.0
|
7
7
|
module Torba
|
8
|
+
module Errors
|
9
|
+
ShellCommandFailed = Class.new(StandardError)
|
10
|
+
end
|
11
|
+
|
8
12
|
# @return [String] root path to prepared asset packages. By default it's ".torba" within
|
9
13
|
# your OS home directory (i.e. packages are shared between projects).
|
10
14
|
# @note use "TORBA_HOME_PATH" env variable to override default value
|
@@ -46,6 +50,12 @@ module Torba
|
|
46
50
|
manifest.load_path
|
47
51
|
end
|
48
52
|
|
53
|
+
# @see Manifest#non_js_css_logical_paths
|
54
|
+
# @since 0.3.0
|
55
|
+
def self.non_js_css_logical_paths
|
56
|
+
manifest.non_js_css_logical_paths
|
57
|
+
end
|
58
|
+
|
49
59
|
# @see Manifest#verify
|
50
60
|
def self.verify
|
51
61
|
manifest.verify
|
data/test/acceptance_test.rb
CHANGED
@@ -6,38 +6,82 @@ module Torba
|
|
6
6
|
@manifest ||= Manifest.build("test/Torbafile")
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
9
|
+
def find_path(file_path)
|
10
10
|
manifest.load_path.map{ |lp| File.join(lp, file_path) }.find{ |full_path| File.exists?(full_path) }
|
11
11
|
end
|
12
12
|
|
13
13
|
def assert_exists(file_path)
|
14
|
-
assert
|
14
|
+
assert find_path(file_path), "'#{file_path}' should exist"
|
15
15
|
end
|
16
16
|
|
17
17
|
def refute_exists(file_path)
|
18
|
-
refute
|
18
|
+
refute find_path(file_path), "'#{file_path}' should not exist"
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
File.read(
|
21
|
+
def read_path(file_path)
|
22
|
+
File.read(find_path(file_path))
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
25
|
+
def pack_torbafile(content)
|
26
|
+
File.write("test/Torbafile", content)
|
26
27
|
manifest.pack
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_zip
|
31
|
+
pack_torbafile <<-TORBA
|
32
|
+
zip "trumbowyg-from-zip",
|
33
|
+
url: "https://github.com/torba-rb/Trumbowyg/archive/1.1.6.zip",
|
34
|
+
import: ["dist/trumbowyg.js"]
|
35
|
+
TORBA
|
27
36
|
|
28
37
|
assert_exists "trumbowyg-from-zip/trumbowyg.js"
|
29
38
|
refute_exists "trumbowyg-from-zip/trumbowyg.css.erb"
|
30
39
|
refute_exists "trumbowyg-from-zip/icons.png"
|
31
40
|
refute_exists "trumbowyg-from-zip/icons-2x.png"
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_gh_release
|
44
|
+
pack_torbafile <<-TORBA
|
45
|
+
gh_release "trumbowyg", source: "torba-rb/Trumbowyg", tag: "1.1.7", import: %w[
|
46
|
+
dist/trumbowyg.js
|
47
|
+
dist/ui/*.css
|
48
|
+
dist/ui/images/
|
49
|
+
]
|
50
|
+
TORBA
|
32
51
|
|
33
52
|
assert_exists "trumbowyg/trumbowyg.js"
|
34
53
|
assert_exists "trumbowyg/trumbowyg.css.erb"
|
35
54
|
assert_exists "trumbowyg/icons.png"
|
36
55
|
assert_exists "trumbowyg/icons-2x.png"
|
37
56
|
|
38
|
-
css =
|
57
|
+
css = read_path "trumbowyg/trumbowyg.css.erb"
|
39
58
|
assert_includes css, "background: transparent url('<%= asset_path('trumbowyg/icons.png') %>') no-repeat;"
|
40
59
|
assert_includes css, "background-image: url('<%= asset_path('trumbowyg/icons-2x.png') %>')"
|
41
60
|
end
|
61
|
+
|
62
|
+
def test_targz
|
63
|
+
pack_torbafile <<-TORBA
|
64
|
+
targz "trumbowyg-from-tar",
|
65
|
+
url: "https://github.com/torba-rb/Trumbowyg/archive/1.1.7.tar.gz",
|
66
|
+
import: ["dist/ui/"]
|
67
|
+
TORBA
|
68
|
+
|
69
|
+
refute_exists "trumbowyg-from-tar/trumbowyg.js"
|
70
|
+
assert_exists "trumbowyg-from-tar/trumbowyg.css.erb"
|
71
|
+
assert_exists "trumbowyg-from-tar/images/icons.png"
|
72
|
+
assert_exists "trumbowyg-from-tar/images/icons-2x.png"
|
73
|
+
|
74
|
+
css = read_path "trumbowyg-from-tar/trumbowyg.css.erb"
|
75
|
+
assert_includes css, "background: transparent url('<%= asset_path('trumbowyg-from-tar/images/icons.png') %>') no-repeat;"
|
76
|
+
assert_includes css, "background-image: url('<%= asset_path('trumbowyg-from-tar/images/icons-2x.png') %>')"
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_npm
|
80
|
+
pack_torbafile <<-TORBA
|
81
|
+
npm "lo_dash", package: "lodash", version: "0.1.0", import: ["lodash.js"]
|
82
|
+
TORBA
|
83
|
+
|
84
|
+
assert_exists "lo_dash/lodash.js"
|
85
|
+
end
|
42
86
|
end
|
43
87
|
end
|
data/test/import_list_test.rb
CHANGED
@@ -35,5 +35,11 @@ module Torba
|
|
35
35
|
list = ImportList.new([js_asset, css_asset])
|
36
36
|
assert [js_asset], list.non_css_assets
|
37
37
|
end
|
38
|
+
|
39
|
+
def test_non_js_css_assets
|
40
|
+
img_asset = ImportList::Asset.new("/dir/image.png", "image.png")
|
41
|
+
list = ImportList.new([js_asset, css_asset, img_asset])
|
42
|
+
assert [img_asset], list.non_js_css_assets
|
43
|
+
end
|
38
44
|
end
|
39
45
|
end
|
data/test/manifest_test.rb
CHANGED
@@ -23,6 +23,15 @@ module Torba
|
|
23
23
|
assert_equal "http://angularjs.com/angularjs.zip", remote.url
|
24
24
|
end
|
25
25
|
|
26
|
+
def test_targz
|
27
|
+
manifest.targz "angular", url: "http://angularjs.com/angularjs.targz"
|
28
|
+
|
29
|
+
assert_equal 1, manifest.packages.size
|
30
|
+
assert_equal "angular", package.name
|
31
|
+
assert_instance_of RemoteSources::Targz, remote
|
32
|
+
assert_equal "http://angularjs.com/angularjs.targz", remote.url
|
33
|
+
end
|
34
|
+
|
26
35
|
def test_zip_wo_url
|
27
36
|
assert_raises(KeyError) do
|
28
37
|
manifest.zip "angular"
|
@@ -55,5 +64,43 @@ module Torba
|
|
55
64
|
manifest.gh_release "underscore", source: "jashkenas/underscore"
|
56
65
|
end
|
57
66
|
end
|
67
|
+
|
68
|
+
def test_npm
|
69
|
+
manifest.npm "coffee", package: "coffee-script", version: "1.8.3"
|
70
|
+
|
71
|
+
assert_equal 1, manifest.packages.size
|
72
|
+
assert_equal "coffee", package.name
|
73
|
+
assert_instance_of RemoteSources::Npm, remote
|
74
|
+
assert_equal "coffee-script", remote.package
|
75
|
+
assert_equal "1.8.3", remote.version
|
76
|
+
end
|
77
|
+
|
78
|
+
def test_npm_implicit_name
|
79
|
+
manifest.npm package: "coffee-script", version: "1.8.3"
|
80
|
+
assert_equal "coffee-script", package.name
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_npm_wo_package
|
84
|
+
assert_raises(KeyError) do
|
85
|
+
manifest.npm version: "1.8.3"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_npm_wo_version
|
90
|
+
assert_raises(KeyError) do
|
91
|
+
manifest.npm package: "underscore"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_non_js_css_logical_paths
|
96
|
+
manifest.zip "angular", url: "http://angularjs.com/angularjs.zip"
|
97
|
+
manifest.zip "backbone", url: "http://backbonejs.com/backbonejs.zip"
|
98
|
+
|
99
|
+
manifest.packages[0].stub :non_js_css_logical_paths, ["angular.png"] do
|
100
|
+
manifest.packages[1].stub :non_js_css_logical_paths, ["backbone.png"] do
|
101
|
+
assert_equal %w[angular.png backbone.png], manifest.non_js_css_logical_paths
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
58
105
|
end
|
59
106
|
end
|
@@ -20,7 +20,7 @@ module Torba
|
|
20
20
|
list = Package.new("package", remote_source, import: ["hello.js"]).import_list
|
21
21
|
assert_equal 1, list.assets.size
|
22
22
|
item = list.assets.first
|
23
|
-
assert_equal "hello.js", item.
|
23
|
+
assert_equal "package/hello.js", item.logical_path
|
24
24
|
assert_equal File.join(source_dir, "hello.js"), item.absolute_path
|
25
25
|
end
|
26
26
|
|
@@ -30,7 +30,7 @@ module Torba
|
|
30
30
|
list = Package.new("package", remote_source, import: ["build/hello.js"]).import_list
|
31
31
|
assert_equal 1, list.assets.size
|
32
32
|
item = list.assets.first
|
33
|
-
assert_equal "hello.js", item.
|
33
|
+
assert_equal "package/hello.js", item.logical_path
|
34
34
|
assert_equal File.join(source_dir, "build/hello.js"), item.absolute_path
|
35
35
|
|
36
36
|
touch("build/standalone/hello.js")
|
@@ -38,7 +38,7 @@ module Torba
|
|
38
38
|
list = Package.new("package", remote_source, import: ["build/standalone/hello.js"]).import_list
|
39
39
|
assert_equal 1, list.assets.size
|
40
40
|
item = list.assets.first
|
41
|
-
assert_equal "hello.js", item.
|
41
|
+
assert_equal "package/hello.js", item.logical_path
|
42
42
|
assert_equal File.join(source_dir, "build/standalone/hello.js"), item.absolute_path
|
43
43
|
end
|
44
44
|
|
@@ -48,14 +48,14 @@ module Torba
|
|
48
48
|
list = Package.new("package", remote_source, import: ["build/"]).import_list
|
49
49
|
assert_equal 1, list.assets.size
|
50
50
|
item = list.assets.first
|
51
|
-
assert_equal "standalone/hello.js", item.
|
51
|
+
assert_equal "package/standalone/hello.js", item.logical_path
|
52
52
|
assert_equal File.join(source_dir, "build/standalone/hello.js"), item.absolute_path
|
53
53
|
|
54
54
|
|
55
55
|
list = Package.new("package", remote_source, import: ["build/standalone/"]).import_list
|
56
56
|
assert_equal 1, list.assets.size
|
57
57
|
item = list.assets.first
|
58
|
-
assert_equal "hello.js", item.
|
58
|
+
assert_equal "package/hello.js", item.logical_path
|
59
59
|
assert_equal File.join(source_dir, "build/standalone/hello.js"), item.absolute_path
|
60
60
|
end
|
61
61
|
|
@@ -67,11 +67,11 @@ module Torba
|
|
67
67
|
assert_equal 2, list.assets.size
|
68
68
|
|
69
69
|
first_item = list.assets[0]
|
70
|
-
assert_equal "images/first.png", first_item.
|
70
|
+
assert_equal "package/images/first.png", first_item.logical_path
|
71
71
|
assert_equal File.join(source_dir, "build/images/first.png"), first_item.absolute_path
|
72
72
|
|
73
73
|
second_item = list.assets[1]
|
74
|
-
assert_equal "images/second.png", second_item.
|
74
|
+
assert_equal "package/images/second.png", second_item.logical_path
|
75
75
|
assert_equal File.join(source_dir, "build/images/second.png"), second_item.absolute_path
|
76
76
|
end
|
77
77
|
|
@@ -83,11 +83,11 @@ module Torba
|
|
83
83
|
assert_equal 2, list.assets.size
|
84
84
|
|
85
85
|
first_item = list.assets[0]
|
86
|
-
assert_equal "one.jpg", first_item.
|
86
|
+
assert_equal "package/one.jpg", first_item.logical_path
|
87
87
|
assert_equal File.join(source_dir, "images/one.jpg"), first_item.absolute_path
|
88
88
|
|
89
89
|
second_item = list.assets[1]
|
90
|
-
assert_equal "script.js", second_item.
|
90
|
+
assert_equal "package/script.js", second_item.logical_path
|
91
91
|
assert_equal File.join(source_dir, "js/script.js"), second_item.absolute_path
|
92
92
|
end
|
93
93
|
|
@@ -98,13 +98,13 @@ module Torba
|
|
98
98
|
list = Package.new("package", remote_source, import: ["**/*.{js,coffee}"]).import_list
|
99
99
|
assert_equal 1, list.assets.size
|
100
100
|
item = list.assets.first
|
101
|
-
assert_equal "js/hello.js", item.
|
101
|
+
assert_equal "package/js/hello.js", item.logical_path
|
102
102
|
assert_equal File.join(source_dir, "js/hello.js"), item.absolute_path
|
103
103
|
|
104
104
|
list = Package.new("package", remote_source, import: ["build/**/*.css"]).import_list
|
105
105
|
assert_equal 1, list.assets.size
|
106
106
|
item = list.assets.first
|
107
|
-
assert_equal "css/bye.css", item.
|
107
|
+
assert_equal "package/css/bye.css", item.logical_path
|
108
108
|
assert_equal File.join(source_dir, "build/css/bye.css"), item.absolute_path
|
109
109
|
end
|
110
110
|
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Torba
|
4
|
+
class PackageLogicalPathsTest < Minitest::Test
|
5
|
+
def import_list
|
6
|
+
js_asset = ImportList::Asset.new("/dir/script.js", "script.js")
|
7
|
+
css_asset = ImportList::Asset.new("/dir/stylesheet.css", "stylesheet.css")
|
8
|
+
img_asset = ImportList::Asset.new("/dir/image.svg", "image.svg")
|
9
|
+
ImportList.new([js_asset, css_asset, img_asset])
|
10
|
+
end
|
11
|
+
|
12
|
+
def package
|
13
|
+
@package ||= Package.new("hello", nil)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_logical_paths
|
17
|
+
package.stub :import_list, import_list do
|
18
|
+
assert_equal %w[script.js stylesheet.css image.svg], package.logical_paths
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_non_js_css_logical_paths
|
23
|
+
package.stub :import_list, import_list do
|
24
|
+
assert_equal %w[image.svg], package.non_js_css_logical_paths
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Torba
|
4
|
+
class GetFileTest < Minitest::Test
|
5
|
+
def test_404
|
6
|
+
exception = assert_raises(Errors::ShellCommandFailed) do
|
7
|
+
RemoteSources::GetFile.process("http://jquery.com/jquery.zip")
|
8
|
+
end
|
9
|
+
assert_includes exception.message, "curl"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Torba
|
4
|
+
class NpmTest < Minitest::Test
|
5
|
+
def remote
|
6
|
+
RemoteSources::Npm.new("coffee-script", "2.0.0")
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_package
|
10
|
+
assert_equal "coffee-script", remote.package
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_tag
|
14
|
+
assert_equal "2.0.0", remote.version
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_url
|
18
|
+
assert_equal "https://registry.npmjs.org/coffee-script/-/coffee-script-2.0.0.tgz", remote.url
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_unique_digest
|
22
|
+
remote = RemoteSources::Npm.new("coffee-script", "2.0.0")
|
23
|
+
same_remote = RemoteSources::Npm.new("coffee-script", "2.0.0")
|
24
|
+
assert_equal remote.digest, same_remote.digest
|
25
|
+
|
26
|
+
another_remote = RemoteSources::Npm.new("coffee-script", "2.0.1")
|
27
|
+
refute_equal remote.digest, another_remote.digest
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_digest_contains_repository_name
|
31
|
+
assert_match /^coffee-script-/, remote.digest
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
module Torba
|
4
|
+
class TargzTest < Minitest::Test
|
5
|
+
def test_url
|
6
|
+
remote = RemoteSources::Targz.new("http://jquery.com/jquery.tar.gz")
|
7
|
+
assert_equal "http://jquery.com/jquery.tar.gz", remote.url
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_unique_digest
|
11
|
+
remote = RemoteSources::Targz.new("http://jquery.com/jquery.tar.gz")
|
12
|
+
same_remote = RemoteSources::Targz.new("http://jquery.com/jquery.tar.gz")
|
13
|
+
|
14
|
+
assert_equal remote.digest, same_remote.digest
|
15
|
+
|
16
|
+
another_remote = RemoteSources::Targz.new("http://zeptojs.com/jquery.tar.gz")
|
17
|
+
|
18
|
+
refute_equal remote.digest, another_remote.digest
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_digest_contains_filename
|
22
|
+
remote = RemoteSources::Targz.new("http://jquery.com/jquery.tar.gz")
|
23
|
+
assert_match /^jquery-/, remote.digest
|
24
|
+
|
25
|
+
remote = RemoteSources::Targz.new("http://jquery.com/jquery.tgz")
|
26
|
+
assert_match /^jquery-/, remote.digest
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -22,12 +22,5 @@ module Torba
|
|
22
22
|
remote = RemoteSources::Zip.new("http://jquery.com/jquery.zip")
|
23
23
|
assert_match /^jquery-/, remote.digest
|
24
24
|
end
|
25
|
-
|
26
|
-
def test_404
|
27
|
-
exception = assert_raises(Errors::ShellCommandFailed) do
|
28
|
-
RemoteSources::Zip.new("http://jquery.com/jquery.zip")["*"]
|
29
|
-
end
|
30
|
-
assert_includes exception.message, "curl"
|
31
|
-
end
|
32
25
|
end
|
33
26
|
end
|
data/torba.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: torba
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrii Malyshko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -81,8 +81,8 @@ files:
|
|
81
81
|
- CONTRIBUTING.md
|
82
82
|
- Gemfile
|
83
83
|
- LICENSE.txt
|
84
|
+
- README.md
|
84
85
|
- Rakefile
|
85
|
-
- Readme.md
|
86
86
|
- bin/torba
|
87
87
|
- lib/torba.rb
|
88
88
|
- lib/torba/cli.rb
|
@@ -92,18 +92,24 @@ files:
|
|
92
92
|
- lib/torba/package.rb
|
93
93
|
- lib/torba/rails.rb
|
94
94
|
- lib/torba/remote_sources/common.rb
|
95
|
+
- lib/torba/remote_sources/get_file.rb
|
95
96
|
- lib/torba/remote_sources/github_release.rb
|
97
|
+
- lib/torba/remote_sources/npm.rb
|
98
|
+
- lib/torba/remote_sources/targz.rb
|
96
99
|
- lib/torba/remote_sources/zip.rb
|
97
100
|
- lib/torba/ui.rb
|
98
101
|
- lib/torba/verify.rb
|
99
|
-
- test/Torbafile
|
100
102
|
- test/acceptance_test.rb
|
101
103
|
- test/css_url_to_erb_asset_path_test.rb
|
102
104
|
- test/import_list_test.rb
|
103
105
|
- test/manifest_test.rb
|
104
106
|
- test/package/import_list_test.rb
|
107
|
+
- test/package/logical_paths_test.rb
|
105
108
|
- test/remote_sources/common_test.rb
|
109
|
+
- test/remote_sources/get_file_test.rb
|
106
110
|
- test/remote_sources/github_release_test.rb
|
111
|
+
- test/remote_sources/npm_test.rb
|
112
|
+
- test/remote_sources/targz_test.rb
|
107
113
|
- test/remote_sources/zip_test.rb
|
108
114
|
- test/test_helper.rb
|
109
115
|
- torba.gemspec
|
@@ -132,14 +138,17 @@ signing_key:
|
|
132
138
|
specification_version: 4
|
133
139
|
summary: Bundler for Sprockets
|
134
140
|
test_files:
|
135
|
-
- test/Torbafile
|
136
141
|
- test/acceptance_test.rb
|
137
142
|
- test/css_url_to_erb_asset_path_test.rb
|
138
143
|
- test/import_list_test.rb
|
139
144
|
- test/manifest_test.rb
|
140
145
|
- test/package/import_list_test.rb
|
146
|
+
- test/package/logical_paths_test.rb
|
141
147
|
- test/remote_sources/common_test.rb
|
148
|
+
- test/remote_sources/get_file_test.rb
|
142
149
|
- test/remote_sources/github_release_test.rb
|
150
|
+
- test/remote_sources/npm_test.rb
|
151
|
+
- test/remote_sources/targz_test.rb
|
143
152
|
- test/remote_sources/zip_test.rb
|
144
153
|
- test/test_helper.rb
|
145
154
|
has_rdoc:
|
data/test/Torbafile
DELETED