assetify 0.2.2 → 0.3.0
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/Gemfile +2 -3
- data/README.md +56 -4
- data/VERSION +1 -1
- data/assetify.gemspec +3 -2
- data/lib/assetify.rb +9 -2
- data/lib/assetify/asset.rb +11 -4
- data/lib/assetify/dsl.rb +31 -8
- data/lib/assetify/helpers.rb +2 -1
- data/lib/assetify/pkg.rb +22 -6
- data/spec/assetify/dsl_spec.rb +34 -0
- data/spec/assetify/pkg_spec.rb +16 -3
- data/spec/fixtures/complex.tgz +0 -0
- metadata +6 -5
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -24,14 +24,23 @@ This will create a Jsfile if not found.
|
|
24
24
|
Jsfile
|
25
25
|
======
|
26
26
|
|
27
|
-
Just like a Gemfile, but you choose the filetype before:
|
27
|
+
Just like a Gemfile, but you choose the filetype (or extension) before:
|
28
28
|
|
29
29
|
type "name", "url", <"version"> or <:options>
|
30
30
|
|
31
31
|
js "jquery", "http://code.jquery.com/jquery-{VERSION}.min.js", "1.6"
|
32
32
|
js "tipsy", "https://github.com/jaz303/tipsy/.../jquery.tipsy.js"
|
33
33
|
|
34
|
-
|
34
|
+
Stylesheets:
|
35
|
+
|
36
|
+
css "tipsy", "https://github.com/jaz303/tipsy/.../jquery.tipsy.css"
|
37
|
+
|
38
|
+
Any file:
|
39
|
+
|
40
|
+
mp3 "alert", "http://link/to/audio"
|
41
|
+
|
42
|
+
|
43
|
+
Now just run `assetify` to make sure everything is installed/up-to-date.
|
35
44
|
|
36
45
|
|
37
46
|
Groups
|
@@ -47,6 +56,15 @@ in handy:
|
|
47
56
|
|
48
57
|
This will install as "public/javascripts/forms/validator.js"
|
49
58
|
|
59
|
+
You can nest groups too:
|
60
|
+
|
61
|
+
group "forms" do
|
62
|
+
js "validator", "link"
|
63
|
+
group "extra" do
|
64
|
+
js "another", "link"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
50
68
|
|
51
69
|
Pkgs
|
52
70
|
----
|
@@ -54,13 +72,47 @@ Pkgs
|
|
54
72
|
Big projects makes you download tons of files for some .min files and css.
|
55
73
|
|
56
74
|
pkg "fancy", "http://to.tgz.or.zip" do
|
57
|
-
js "cool", "internal/js/cool"
|
58
|
-
css "cool", "internal/css/cool"
|
75
|
+
js "cool", "internal/js/cool.js"
|
76
|
+
css "cool", "internal/css/cool.css"
|
59
77
|
end
|
60
78
|
|
61
79
|
This downloads and 'cherry pick' the files.
|
80
|
+
Files will be written with the namespace "fancy":
|
81
|
+
|
82
|
+
/javascripts/fancy/cool.js
|
83
|
+
|
84
|
+
You can pass :shallow => true to avoid the namespace:
|
85
|
+
|
86
|
+
pkg "fancy", "http://to.tgz.or.zip", :shallow => true do
|
87
|
+
|
88
|
+
Results in:
|
89
|
+
|
90
|
+
/javascript/cool.js
|
91
|
+
|
92
|
+
|
93
|
+
Also, please check out the note about link inside pkgs below.
|
94
|
+
|
95
|
+
|
96
|
+
Dir
|
97
|
+
___
|
98
|
+
|
99
|
+
You can resource a full directory of files, too. Very useful when
|
100
|
+
dealing with pkgs:
|
101
|
+
|
102
|
+
pkg "complexfw", "link" do
|
103
|
+
js "complex.min.js"
|
104
|
+
dir "images/", :to => "images/complexfw"
|
105
|
+
# Another option, treat all as a type:
|
106
|
+
dir "src/", :as => :js
|
107
|
+
end
|
108
|
+
|
109
|
+
All files inside images will be copied to "images/complexfw" and
|
110
|
+
all files in 'src' to 'javascripts' (or whatever else jspath is).
|
62
111
|
|
63
112
|
|
113
|
+
Note: Have in mind that the "link" inside dir/packages *is a regex*
|
114
|
+
that returns the *first match* inside the archive. Check out libarchive
|
115
|
+
or the pkg.rb source for more info.
|
64
116
|
|
65
117
|
Other
|
66
118
|
-----
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/assetify.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{assetify}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Marcos Piccinini"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-06-04}
|
13
13
|
s.default_executable = %q{assetify}
|
14
14
|
s.description = %q{Downloads/updates assets based on a Jsfile. Any framework.}
|
15
15
|
s.email = %q{x@nofxx.com}
|
@@ -40,6 +40,7 @@ Gem::Specification.new do |s|
|
|
40
40
|
"spec/assetify/helpers_spec.rb",
|
41
41
|
"spec/assetify/pkg_spec.rb",
|
42
42
|
"spec/assetify_spec.rb",
|
43
|
+
"spec/fixtures/complex.tgz",
|
43
44
|
"spec/fixtures/fancy.tgz",
|
44
45
|
"spec/spec_helper.rb"
|
45
46
|
]
|
data/lib/assetify.rb
CHANGED
@@ -14,6 +14,7 @@ module Assetify
|
|
14
14
|
:jspath => "public/javascripts",
|
15
15
|
:csspath => "public/stylesheets",
|
16
16
|
:imgpath => "public/images",
|
17
|
+
:vendor => "public/vendor",
|
17
18
|
:newname => true
|
18
19
|
}
|
19
20
|
|
@@ -71,14 +72,20 @@ TXT
|
|
71
72
|
end
|
72
73
|
end
|
73
74
|
|
75
|
+
# Fuzzy find files
|
76
|
+
def find_assets(filter = nil)
|
77
|
+
return @assets unless filter
|
78
|
+
@assets.select { |a| "#{a.name}#{a.pkg}" =~ /#{filter}/ }
|
79
|
+
end
|
80
|
+
|
74
81
|
def work_on params
|
75
82
|
case params.first
|
76
83
|
when /^i/, nil
|
77
84
|
check_param params, "install" if params[0]
|
78
|
-
|
85
|
+
find_assets(params[1]).map(&:install!)
|
79
86
|
when /^u/
|
80
87
|
check_param params, "update"
|
81
|
-
|
88
|
+
find_assets(params[1]).map { |a| a.install! :force }
|
82
89
|
else
|
83
90
|
puts "Dunno how to #{params.join}."
|
84
91
|
end
|
data/lib/assetify/asset.rb
CHANGED
@@ -4,7 +4,8 @@ require 'fileutils'
|
|
4
4
|
module Assetify
|
5
5
|
class Asset
|
6
6
|
include Helpers
|
7
|
-
attr_accessor :type, :name, :url, :ns
|
7
|
+
attr_accessor :type, :name, :url, :ns, :pkg
|
8
|
+
alias :ext :type
|
8
9
|
|
9
10
|
def initialize(type, name, url, ver = nil, params={})
|
10
11
|
raise "NoType" unless type
|
@@ -48,6 +49,11 @@ module Assetify
|
|
48
49
|
v ? "v#{v[0]} " : nil
|
49
50
|
end
|
50
51
|
|
52
|
+
def data
|
53
|
+
# Get data, from a pkg or download directly
|
54
|
+
@data ||= @pkg ? @pkg.get(url, :force).values.first : get_data(url)
|
55
|
+
end
|
56
|
+
|
51
57
|
def install!(force = false)
|
52
58
|
LINE.p "-> #{name}.#{type}"
|
53
59
|
if !force && check?
|
@@ -55,13 +61,14 @@ module Assetify
|
|
55
61
|
return LINE.f "#{print_version}Installed"
|
56
62
|
end
|
57
63
|
begin
|
64
|
+
# Creates a thread to insert dots while downloading
|
58
65
|
points = Thread.new { loop do; LINE.p "."; sleep 1; end }
|
59
|
-
|
60
|
-
write
|
66
|
+
|
67
|
+
write data
|
61
68
|
LINE.f "#{print_version}ok"
|
62
69
|
rescue => e
|
63
70
|
LINE.f :FAIL, :red
|
64
|
-
p "Fail: #{e}"
|
71
|
+
p "Fail: #{e} #{e.backtrace}"
|
65
72
|
ensure
|
66
73
|
points.kill
|
67
74
|
end
|
data/lib/assetify/dsl.rb
CHANGED
@@ -1,26 +1,49 @@
|
|
1
1
|
module Assetify
|
2
2
|
|
3
3
|
class DSL
|
4
|
+
attr_reader :assets
|
4
5
|
|
5
|
-
def
|
6
|
+
def set_namespace(name)
|
7
|
+
@ns = @ns.nil? ? name : "#{@ns}/#{name}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def pkg name, url, opts = {}, &block
|
6
11
|
@pkg = Pkg.new name, url
|
7
|
-
|
8
|
-
|
9
|
-
|
12
|
+
if block_given?
|
13
|
+
set_namespace name unless opts[:shallow]
|
14
|
+
instance_exec &block
|
15
|
+
@ns = @pkg = nil
|
16
|
+
else
|
17
|
+
@pkg.unpack_to_vendor
|
18
|
+
end
|
10
19
|
assets
|
11
20
|
end
|
12
21
|
|
13
22
|
def group name, &block
|
14
|
-
|
15
|
-
instance_exec
|
23
|
+
set_namespace name
|
24
|
+
instance_exec &block
|
16
25
|
@ns = nil
|
17
26
|
assets
|
18
27
|
end
|
19
28
|
|
20
|
-
def
|
21
|
-
|
29
|
+
def dir regex, to
|
30
|
+
to = to[:to]
|
31
|
+
if @pkg
|
32
|
+
@pkg.get(regex).each do |path, data|
|
33
|
+
next if path =~ /\/$/ # dont let dirs get in... ugly
|
34
|
+
ext, *name = path.split(".").reverse
|
35
|
+
name = name.reverse.join(".").split("/").last
|
36
|
+
(@assets ||= []) << Asset.new(ext, name, path, nil, {
|
37
|
+
:pkg => @pkg,
|
38
|
+
:to => to})# h.split(".").last, )
|
39
|
+
end
|
40
|
+
end
|
22
41
|
end
|
23
42
|
|
43
|
+
#
|
44
|
+
# js "foo", "http://foo.com"
|
45
|
+
# js "foo", "http://foo.com", :to => "/other/place"
|
46
|
+
#
|
24
47
|
def method_missing method, name, uri, *params
|
25
48
|
params, ver = params.partition { |param| param.is_a?(Hash) }
|
26
49
|
opts = {:ns => @ns, :pkg => @pkg}
|
data/lib/assetify/helpers.rb
CHANGED
@@ -8,6 +8,7 @@ module Assetify
|
|
8
8
|
# Detects numerical software version from text.
|
9
9
|
#
|
10
10
|
def find_version(txt)
|
11
|
+
return unless txt
|
11
12
|
version = txt.match /(?:(\d+)\.)?(?:(\d+)\.)?(\d+)?\.?(\d+)/
|
12
13
|
# If matches a dot, it`s text. Otherwise make it number.
|
13
14
|
v = version.to_a.reject(&:nil?).map { |d| d =~ /\./ ? d : d.to_i }
|
@@ -40,7 +41,7 @@ module Assetify
|
|
40
41
|
end
|
41
42
|
|
42
43
|
def write(binary)
|
43
|
-
FileUtils.mkdir_p path unless
|
44
|
+
FileUtils.mkdir_p path unless Dir.exists?(path)
|
44
45
|
File.open(fullpath, "w") { |f| f.puts(binary) }
|
45
46
|
end
|
46
47
|
|
data/lib/assetify/pkg.rb
CHANGED
@@ -22,20 +22,36 @@ module Assetify
|
|
22
22
|
File.join(path, @pkgname)
|
23
23
|
end
|
24
24
|
|
25
|
-
def
|
26
|
-
|
27
|
-
data = nil
|
25
|
+
def read_from_pkg(regex = ".*")
|
26
|
+
data = {}
|
28
27
|
Archive.read_open_filename(fullpath) do |ar|
|
29
28
|
while entry = ar.next_header
|
30
|
-
if entry.pathname =~ /#{
|
31
|
-
data
|
32
|
-
|
29
|
+
if entry.pathname =~ /#{regex}/
|
30
|
+
data.merge! entry.pathname => ar.read_data
|
31
|
+
# return data
|
33
32
|
end
|
34
33
|
end
|
35
34
|
end
|
36
35
|
data
|
37
36
|
end
|
38
37
|
|
38
|
+
def get(file, force = false)
|
39
|
+
# Download and write to tmp if force or doensnt exists
|
40
|
+
write(get_data(url)) if force || !File.exists?(File.join(fullpath))
|
41
|
+
# Better way when multiple are found....?
|
42
|
+
read_from_pkg(file)
|
43
|
+
end
|
44
|
+
|
45
|
+
def unpack_to_vendor
|
46
|
+
read_from_pkg.each do |file, data|
|
47
|
+
fname, *dir = file =~ /\/$/ ? [nil, file] : file.split("/").reverse
|
48
|
+
dir = File.join Opt[:vendor], dir.reverse.join("/")
|
49
|
+
FileUtils.mkdir_p dir unless Dir.exists?(dir)
|
50
|
+
next if file =~ /\/$/ # next if data.empty?
|
51
|
+
File.open(Opt[:vendor] + "/#{file}", "w+") { |f| f.puts(data) }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
39
55
|
end
|
40
56
|
|
41
57
|
end
|
data/spec/assetify/dsl_spec.rb
CHANGED
@@ -41,6 +41,12 @@ describe DSL do
|
|
41
41
|
a[1].fullpath.should eql("public/javascripts/rock.js")
|
42
42
|
end
|
43
43
|
|
44
|
+
it "should work with nested namespaces" do
|
45
|
+
a = Assetify::DSL.parse "group 'common' do; group 'nice' do; js 'foo', 'foolink'; end; end"
|
46
|
+
a[0].should be_an Asset
|
47
|
+
a[0].fullpath.should eql("public/javascripts/common/nice/foo.js")
|
48
|
+
end
|
49
|
+
|
44
50
|
end
|
45
51
|
|
46
52
|
describe "Pkg Assets" do
|
@@ -51,13 +57,41 @@ describe DSL do
|
|
51
57
|
a[0].fullpath.should eql("public/javascripts/fancy/foo.js")
|
52
58
|
end
|
53
59
|
|
60
|
+
it "should accept shallow too" do
|
61
|
+
a = Assetify::DSL.parse "pkg 'fancy', 'http://fancy.zip', :shallow => true do; js 'foo', 'foolink'; end"
|
62
|
+
a[0].should be_an Asset
|
63
|
+
a[0].fullpath.should eql("public/javascripts/foo.js")
|
64
|
+
end
|
65
|
+
|
54
66
|
it "should fetch inside archive" do
|
55
67
|
a = Assetify::DSL.parse "pkg 'fancy', 'http://fancy.zip' do; js 'foo', 'foolink'; end"
|
56
68
|
a[0].should be_an Asset
|
57
69
|
a[0].fullpath.should eql("public/javascripts/fancy/foo.js")
|
58
70
|
end
|
59
71
|
|
72
|
+
it "should unpack to vendor if no block given" do
|
73
|
+
Pkg.should_receive(:new).with("fancy", "http://fancy.zip").and_return(mp = mock(Pkg))
|
74
|
+
mp.should_receive :unpack_to_vendor
|
75
|
+
a = Assetify::DSL.parse "pkg 'fancy', 'http://fancy.zip'"
|
76
|
+
end
|
60
77
|
end
|
61
78
|
|
79
|
+
describe "Directories" do
|
80
|
+
|
81
|
+
it "should read from pkg the regex" do
|
82
|
+
Pkg.should_receive(:new).with("fancy", "http://fancy.zip").and_return(mp = mock(Pkg))
|
83
|
+
mp.should_receive(:get).with("images/").and_return([])
|
84
|
+
a = Assetify::DSL.parse "pkg 'fancy', 'http://fancy.zip' do; dir 'images/', :to => 'images/complex/'; end"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should read from pkg the regex" do
|
88
|
+
as = Assetify::DSL.parse "pkg 'complex', 'http://complex.tgz' do; dir 'images/', :to => 'images/complex/'; end"
|
89
|
+
as[0].name.should eql("two")
|
90
|
+
as[0].ext.should eql("png")
|
91
|
+
as[0].fullpath.should eql("png")
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
end
|
62
96
|
|
63
97
|
end
|
data/spec/assetify/pkg_spec.rb
CHANGED
@@ -4,8 +4,10 @@ describe Pkg do
|
|
4
4
|
|
5
5
|
|
6
6
|
before do
|
7
|
-
|
8
|
-
|
7
|
+
[:fancy, :complex].each do |ns|
|
8
|
+
`mkdir /tmp/#{ns}` unless Dir.exists? "/tmp/#{ns}"
|
9
|
+
`cp spec/fixtures/#{ns}.tgz /tmp/#{ns}/`
|
10
|
+
end
|
9
11
|
end
|
10
12
|
|
11
13
|
it "should spawn!" do
|
@@ -21,8 +23,19 @@ describe Pkg do
|
|
21
23
|
|
22
24
|
it "should get file from unpack" do
|
23
25
|
as = Pkg.new "fancy", "/tmp/fancy/fancy.tgz"
|
24
|
-
as.get("fancy/fancy.css").should eql("// Fancy css!\n\n#foo {\n padding: 10px;\n}\n")
|
26
|
+
as.get("fancy/fancy.css").should eql("fancy/fancy.css" => "// Fancy css!\n\n#foo {\n padding: 10px;\n}\n")
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should read all assets within pkg" do
|
30
|
+
as = Pkg.new "complex", "/tmp/complex/complex.tgz"
|
31
|
+
as.read_from_pkg.should be_a Hash #(hash_including "complex/images/3.png"=>"Im a png image..3\n")
|
32
|
+
end
|
25
33
|
|
34
|
+
it "should unpack all to vendor" do
|
35
|
+
as = Pkg.new "complex", "/tmp/complex/complex.tgz"
|
36
|
+
as.unpack_to_vendor #.should be_a Hash #(hash_including "complex/images/3.png"=>"Im a png image..3\n")
|
37
|
+
File.exists?("public/vendor/complex/src/main.js").should be_true
|
38
|
+
`rm -rf public/vendor`
|
26
39
|
end
|
27
40
|
|
28
41
|
end
|
Binary file
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Marcos Piccinini
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-06-04 00:00:00 -03:00
|
18
18
|
default_executable: assetify
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -106,6 +106,7 @@ files:
|
|
106
106
|
- spec/assetify/helpers_spec.rb
|
107
107
|
- spec/assetify/pkg_spec.rb
|
108
108
|
- spec/assetify_spec.rb
|
109
|
+
- spec/fixtures/complex.tgz
|
109
110
|
- spec/fixtures/fancy.tgz
|
110
111
|
- spec/spec_helper.rb
|
111
112
|
has_rdoc: true
|
@@ -122,7 +123,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
123
|
requirements:
|
123
124
|
- - ">="
|
124
125
|
- !ruby/object:Gem::Version
|
125
|
-
hash: -
|
126
|
+
hash: -2700940674252686388
|
126
127
|
segments:
|
127
128
|
- 0
|
128
129
|
version: "0"
|