assetify 2.0.1 → 3.0.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.
- checksums.yaml +7 -0
- data/README.md +69 -57
- data/Rakefile +1 -50
- data/bin/assetify +4 -8
- data/lib/assetify.rb +11 -11
- data/lib/assetify/asset.rb +47 -64
- data/lib/assetify/asset/pathfix.rb +17 -19
- data/lib/assetify/asset/pkg.rb +16 -16
- data/lib/assetify/assetfile.rb +11 -10
- data/lib/assetify/cli.rb +47 -15
- data/lib/assetify/cli/colored.rb +20 -22
- data/lib/assetify/cli/term.rb +6 -4
- data/lib/assetify/constants.rb +4 -5
- data/lib/assetify/dsl.rb +35 -35
- data/lib/assetify/extensions/string.rb +6 -8
- data/lib/assetify/gui.rb +4 -4
- data/lib/assetify/gui/server.rb +2 -3
- data/lib/assetify/helpers.rb +15 -17
- data/lib/assetify/version.rb +1 -1
- metadata +110 -126
@@ -1,22 +1,24 @@
|
|
1
1
|
module Assetify
|
2
|
+
#
|
3
|
+
# *Attempt* to fix assets in js/css for #image_url
|
4
|
+
#
|
2
5
|
class Pathfix
|
3
|
-
|
4
|
-
|
5
|
-
@
|
6
|
+
def initialize(chunk, renderer = :erb, ns = nil)
|
7
|
+
@chunk = chunk
|
8
|
+
@renderer = renderer
|
9
|
+
@ns = ns
|
6
10
|
@images = scan_images
|
7
11
|
end
|
8
12
|
|
9
|
-
|
10
|
-
@images
|
11
|
-
end
|
13
|
+
attr_reader :images
|
12
14
|
|
13
15
|
def scan_images
|
14
|
-
@chunk.scan(
|
16
|
+
@chunk.scan(%r{url\(([a-zA-Z0-9/\_\-\.]*\.\w+)\)}xo).flatten
|
15
17
|
end
|
16
18
|
|
17
|
-
def replace
|
19
|
+
def replace(src)
|
18
20
|
fpath = @ns ? "#{@ns}/#{src}" : src
|
19
|
-
if @
|
21
|
+
if @renderer == :erb
|
20
22
|
"url('<%= image_path('#{fpath}') %>')"
|
21
23
|
else
|
22
24
|
"image-url('#{fpath}')"
|
@@ -25,20 +27,16 @@ module Assetify
|
|
25
27
|
|
26
28
|
def fix
|
27
29
|
@images.each do |path|
|
28
|
-
@chunk["url(#{path})"] = replace path.split(
|
30
|
+
@chunk["url(#{path})"] = replace path.split('/').last
|
29
31
|
end
|
30
|
-
@
|
32
|
+
@renderer != :erb ? tmpl_chunk : @chunk
|
31
33
|
end
|
32
34
|
|
33
35
|
def tmpl_chunk
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
@error = e
|
39
|
-
end
|
36
|
+
require 'sass/css'
|
37
|
+
Sass::CSS.new(@chunk).render(@renderer)
|
38
|
+
rescue Sass::SyntaxError => e
|
39
|
+
@error = e
|
40
40
|
end
|
41
|
-
|
42
41
|
end
|
43
|
-
|
44
42
|
end
|
data/lib/assetify/asset/pkg.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
require 'libarchive'
|
2
2
|
|
3
3
|
module Assetify
|
4
|
-
|
4
|
+
#
|
5
|
+
# Some Assets are inside rocks, need tools...
|
6
|
+
#
|
5
7
|
class Pkg
|
6
8
|
include Helpers
|
7
9
|
attr_accessor :name, :url
|
8
10
|
|
9
|
-
PATH =
|
11
|
+
PATH = '/tmp/'.freeze
|
10
12
|
|
11
|
-
def initialize(name, url,
|
13
|
+
def initialize(name, url, _opts = {})
|
12
14
|
@name = name
|
13
|
-
@pkgname = url.split(
|
15
|
+
@pkgname = url.split('/').last
|
14
16
|
@url = url
|
15
17
|
end
|
16
18
|
|
@@ -22,13 +24,13 @@ module Assetify
|
|
22
24
|
File.join(path, @pkgname)
|
23
25
|
end
|
24
26
|
|
25
|
-
def read_from_pkg(regex =
|
27
|
+
def read_from_pkg(regex = '.*')
|
26
28
|
data = {}
|
27
29
|
Archive.read_open_filename(fullpath) do |ar|
|
28
|
-
while entry = ar.next_header
|
30
|
+
while (entry = ar.next_header)
|
29
31
|
if entry.pathname =~ /#{regex}/
|
30
|
-
data
|
31
|
-
|
32
|
+
data[entry.pathname] = ar.read_data
|
33
|
+
# return data
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -37,7 +39,7 @@ module Assetify
|
|
37
39
|
|
38
40
|
def get(file, force = false)
|
39
41
|
# Download and write to tmp if force or doensnt exists
|
40
|
-
write(get_data(url)) if force || !File.
|
42
|
+
write(get_data(url)) if force || !File.exist?(fullpath)
|
41
43
|
# Better way when multiple are found....?
|
42
44
|
read_from_pkg(file)
|
43
45
|
end
|
@@ -47,14 +49,12 @@ module Assetify
|
|
47
49
|
#
|
48
50
|
def unpack_all
|
49
51
|
read_from_pkg.each do |file, data|
|
50
|
-
|
51
|
-
dir = File.join Opt[:vendor], dir.reverse.join(
|
52
|
-
FileUtils.mkdir_p dir unless Dir.
|
53
|
-
next if file =~
|
54
|
-
File.open(Opt[:vendor] + "/#{file}",
|
52
|
+
_fname, *dir = file =~ %r{/$} ? [nil, file] : file.split('/').reverse
|
53
|
+
dir = File.join Opt[:vendor], dir.reverse.join('/')
|
54
|
+
FileUtils.mkdir_p dir unless Dir.exist?(dir)
|
55
|
+
next if file =~ %r{/$} # next if data.empty?
|
56
|
+
File.open(Opt[:vendor] + "/#{file}", 'w+') { |f| f.puts(data) }
|
55
57
|
end
|
56
58
|
end
|
57
|
-
|
58
59
|
end
|
59
|
-
|
60
60
|
end
|
data/lib/assetify/assetfile.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
module Assetify
|
2
|
+
#
|
3
|
+
# The Assetfile!
|
4
|
+
#
|
2
5
|
class Assetfile
|
3
6
|
class << self
|
4
|
-
|
5
|
-
|
6
7
|
#
|
7
8
|
# Assetfile stuff
|
8
9
|
#
|
9
10
|
def missing!
|
10
|
-
print
|
11
|
+
print 'Assetfile not found, create one? [Y/n] '
|
11
12
|
res = $stdin.gets.chomp # dont forget stdin
|
12
13
|
unless res =~ /n|N/
|
13
|
-
File.open(
|
14
|
+
File.open('Assetfile', 'w+') do |f|
|
14
15
|
f.print <<TXT
|
15
16
|
#
|
16
17
|
# #{Dir.pwd.split('/').last.capitalize} Assetfile
|
@@ -25,7 +26,7 @@ end
|
|
25
26
|
|
26
27
|
TXT
|
27
28
|
end
|
28
|
-
puts
|
29
|
+
puts 'Assetfile created!'
|
29
30
|
exit 0
|
30
31
|
end
|
31
32
|
end
|
@@ -35,21 +36,21 @@ TXT
|
|
35
36
|
#
|
36
37
|
#
|
37
38
|
def find
|
38
|
-
missing! unless File.
|
39
|
+
missing! unless File.exist?('Assetfile')
|
39
40
|
end
|
40
41
|
|
41
42
|
def read
|
42
|
-
file = File.open(
|
43
|
-
code = file.
|
43
|
+
file = File.open('Assetfile') # ruby 1.8/1.9 (ugly) fix
|
44
|
+
code = file.each_line.map do |line|
|
44
45
|
# Parse options
|
45
46
|
if line =~ /^\w{2,3}path/
|
46
|
-
key, val = line.split(
|
47
|
+
key, val = line.split(' ')
|
47
48
|
Opt[key.to_sym] = val
|
48
49
|
next
|
49
50
|
end
|
50
51
|
line
|
51
52
|
end.reject(&:nil?)
|
52
|
-
DSL.parse code.join(
|
53
|
+
DSL.parse code.join('')
|
53
54
|
end
|
54
55
|
|
55
56
|
# def write
|
data/lib/assetify/cli.rb
CHANGED
@@ -2,14 +2,13 @@
|
|
2
2
|
# To be refactored...
|
3
3
|
#
|
4
4
|
module Assetify
|
5
|
-
LINE
|
5
|
+
LINE = CLI.new
|
6
6
|
|
7
7
|
class << self
|
8
|
-
|
9
8
|
#
|
10
9
|
# Text Interface
|
11
10
|
#
|
12
|
-
def check_param
|
11
|
+
def check_param(params, string)
|
13
12
|
unless string.include? params[0]
|
14
13
|
puts "Did you mean #{string}?"
|
15
14
|
exit 0
|
@@ -22,6 +21,40 @@ module Assetify
|
|
22
21
|
Asset.filter params
|
23
22
|
end
|
24
23
|
|
24
|
+
def check(assets)
|
25
|
+
assets.each do |a|
|
26
|
+
LINE.p a.header
|
27
|
+
if a.file_exists? # Return if file is on path
|
28
|
+
a.read_data
|
29
|
+
LINE.f "#{a.print_version} Installed"
|
30
|
+
else
|
31
|
+
LINE.f 'Not Found', :red
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def install(assets, force = false)
|
37
|
+
assets.each do |a|
|
38
|
+
LINE.p a.header
|
39
|
+
if !force && a.file_exists? # Return if file is on path
|
40
|
+
a.read_data
|
41
|
+
return LINE.f "#{a.print_version} Installed"
|
42
|
+
end
|
43
|
+
begin
|
44
|
+
# Creates a thread to insert dots while downloading
|
45
|
+
points = Thread.new { loop { ; LINE.p '.'; sleep 1; } }
|
46
|
+
|
47
|
+
a.install! force
|
48
|
+
LINE.f "#{a.print_version} ok"
|
49
|
+
rescue => e
|
50
|
+
LINE.f :FAIL, :red
|
51
|
+
p "Fail: #{e} #{e.backtrace}"
|
52
|
+
ensure
|
53
|
+
points.kill
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
25
58
|
#
|
26
59
|
# CLI Master case/switch!
|
27
60
|
#
|
@@ -34,19 +67,20 @@ module Assetify
|
|
34
67
|
# c -> check
|
35
68
|
# w -> web
|
36
69
|
#
|
37
|
-
def work_on
|
70
|
+
def work_on(params)
|
71
|
+
assets = find_assets(params[1])
|
38
72
|
case params.first
|
39
73
|
when /^i/, nil
|
40
|
-
check_param params,
|
41
|
-
|
74
|
+
check_param params, 'install' if params[0]
|
75
|
+
install assets
|
42
76
|
when /^u/
|
43
|
-
check_param params,
|
44
|
-
|
77
|
+
check_param params, 'update'
|
78
|
+
install assets, :force
|
45
79
|
when /^c/
|
46
|
-
check_param params,
|
47
|
-
|
80
|
+
check_param params, 'check'
|
81
|
+
check assets
|
48
82
|
when /^w/
|
49
|
-
check_param params,
|
83
|
+
check_param params, 'web'
|
50
84
|
GUI.boot!
|
51
85
|
else
|
52
86
|
puts "Dunno how to #{params.join}."
|
@@ -57,7 +91,7 @@ module Assetify
|
|
57
91
|
# Divider bar
|
58
92
|
#
|
59
93
|
def bar
|
60
|
-
puts
|
94
|
+
puts '-' * TSIZE
|
61
95
|
end
|
62
96
|
|
63
97
|
def work!(params)
|
@@ -65,13 +99,11 @@ module Assetify
|
|
65
99
|
Assetfile.find
|
66
100
|
print "Assetify - #{Asset.all.size} assets"
|
67
101
|
print " | #{params[1..-1].join(' . ')}" if params[1]
|
68
|
-
puts
|
102
|
+
puts ' |'
|
69
103
|
bar
|
70
104
|
work_on params
|
71
105
|
bar
|
72
106
|
puts "Done in #{Time.now - start}s"
|
73
107
|
end
|
74
|
-
|
75
108
|
end
|
76
|
-
|
77
109
|
end
|
data/lib/assetify/cli/colored.rb
CHANGED
@@ -2,9 +2,9 @@ require 'Win32/Console/ANSI' if RUBY_PLATFORM =~ /win32/
|
|
2
2
|
|
3
3
|
##
|
4
4
|
# cute.
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# >> "this is red".red
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# >> "this is red with a blue background (read: ugly)".red_on_blue
|
9
9
|
#
|
10
10
|
# >> "this is red with an underline".red.underline
|
@@ -15,53 +15,51 @@ require 'Win32/Console/ANSI' if RUBY_PLATFORM =~ /win32/
|
|
15
15
|
module Colored
|
16
16
|
extend self
|
17
17
|
|
18
|
-
COLORS = {
|
18
|
+
COLORS = {
|
19
19
|
'black' => 30,
|
20
|
-
'red' => 31,
|
21
|
-
'green' => 32,
|
20
|
+
'red' => 31,
|
21
|
+
'green' => 32,
|
22
22
|
'yellow' => 33,
|
23
23
|
'blue' => 34,
|
24
24
|
'magenta' => 35,
|
25
25
|
'cyan' => 36,
|
26
26
|
'white' => 37
|
27
|
-
}
|
27
|
+
}.freeze
|
28
28
|
|
29
29
|
EXTRAS = {
|
30
|
-
'clear' => 0,
|
30
|
+
'clear' => 0,
|
31
31
|
'bold' => 1,
|
32
32
|
'underline' => 4,
|
33
33
|
'reversed' => 7
|
34
|
-
}
|
35
|
-
|
36
|
-
COLORS.each do |color,
|
37
|
-
define_method(color) do
|
38
|
-
colorize(self, :
|
34
|
+
}.freeze
|
35
|
+
|
36
|
+
COLORS.each do |color, _value|
|
37
|
+
define_method(color) do
|
38
|
+
colorize(self, foreground: color)
|
39
39
|
end
|
40
40
|
|
41
41
|
define_method("on_#{color}") do
|
42
|
-
colorize(self, :
|
42
|
+
colorize(self, background: color)
|
43
43
|
end
|
44
44
|
|
45
|
-
COLORS.each do |highlight,
|
45
|
+
COLORS.each do |highlight, _value|
|
46
46
|
next if color == highlight
|
47
47
|
define_method("#{color}_on_#{highlight}") do
|
48
|
-
colorize(self, :
|
48
|
+
colorize(self, foreground: color, background: highlight)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
EXTRAS.each do |extra,
|
53
|
+
EXTRAS.each do |extra, _value|
|
54
54
|
next if extra == 'clear'
|
55
|
-
define_method(extra) do
|
56
|
-
colorize(self, :
|
55
|
+
define_method(extra) do
|
56
|
+
colorize(self, extra: extra)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
define_method(:to_eol) do
|
61
61
|
tmp = sub(/^(\e\[[\[\e0-9;m]+m)/, "\\1\e[2K")
|
62
|
-
if tmp == self
|
63
|
-
return "\e[2K" << self
|
64
|
-
end
|
62
|
+
return "\e[2K" << self if tmp == self
|
65
63
|
tmp
|
66
64
|
end
|
67
65
|
|
@@ -84,7 +82,7 @@ module Colored
|
|
84
82
|
background = color_name.to_s =~ /on_/
|
85
83
|
color_name = color_name.to_s.sub('on_', '')
|
86
84
|
return unless color_name && COLORS[color_name]
|
87
|
-
"\e[#{COLORS[color_name] + (background ? 10 : 0)}m"
|
85
|
+
"\e[#{COLORS[color_name] + (background ? 10 : 0)}m"
|
88
86
|
end
|
89
87
|
end unless Object.const_defined? :Colored
|
90
88
|
|
data/lib/assetify/cli/term.rb
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
module Assetify
|
2
|
-
|
2
|
+
#
|
3
|
+
# Command Line Interface
|
4
|
+
#
|
3
5
|
class CLI
|
4
6
|
def initialize(size = TSIZE)
|
5
7
|
@size = size
|
6
8
|
@chars = 0
|
7
9
|
end
|
8
10
|
|
9
|
-
def p
|
11
|
+
def p(txt)
|
10
12
|
@chars += txt.size
|
11
13
|
print txt
|
12
14
|
end
|
13
15
|
|
14
|
-
def f
|
15
|
-
puts "[#{txt}]".send(color).bold.rjust
|
16
|
+
def f(txt, color = :green)
|
17
|
+
puts "[#{txt}]".send(color).bold.rjust(TSIZE - @chars + 17)
|
16
18
|
@chars = 0
|
17
19
|
end
|
18
20
|
end
|
data/lib/assetify/constants.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
module Assetify
|
2
|
-
|
3
2
|
Opt = {
|
4
|
-
:
|
5
|
-
:
|
3
|
+
vendor: 'public/vendor',
|
4
|
+
newname: true
|
6
5
|
}
|
7
6
|
|
8
7
|
TSIZE = 80
|
9
|
-
ASSETS_PATH =
|
10
|
-
ASSETS = [:javascripts, :stylesheets, :images]
|
8
|
+
ASSETS_PATH = 'vendor/assets'.freeze
|
9
|
+
ASSETS = [:javascripts, :stylesheets, :images].freeze
|
11
10
|
ASSETS.each do |asset|
|
12
11
|
Opt.merge!(asset => "#{ASSETS_PATH}/#{asset}")
|
13
12
|
end
|
data/lib/assetify/dsl.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Assetify
|
2
|
-
|
2
|
+
#
|
3
|
+
# Nice Assetfile reader
|
4
|
+
#
|
3
5
|
class DSL
|
4
6
|
attr_reader :assets
|
5
7
|
|
@@ -9,11 +11,11 @@ module Assetify
|
|
9
11
|
# pkg :foo, "http://to.tgz" do
|
10
12
|
# end
|
11
13
|
#
|
12
|
-
def pkg
|
14
|
+
def pkg(name, url, opts = {}, &block)
|
13
15
|
@pkg = Pkg.new name, url
|
14
16
|
if block_given?
|
15
|
-
|
16
|
-
instance_exec
|
17
|
+
use_namespace(name) unless opts[:shallow]
|
18
|
+
instance_exec(&block)
|
17
19
|
else
|
18
20
|
@pkg.unpack_all
|
19
21
|
end
|
@@ -28,9 +30,9 @@ module Assetify
|
|
28
30
|
# group :foo do
|
29
31
|
# end
|
30
32
|
#
|
31
|
-
def group
|
32
|
-
|
33
|
-
instance_exec
|
33
|
+
def group(name, &block)
|
34
|
+
use_namespace(name)
|
35
|
+
instance_exec(&block)
|
34
36
|
@ns = nil
|
35
37
|
assets
|
36
38
|
ensure
|
@@ -45,14 +47,14 @@ module Assetify
|
|
45
47
|
# dir "images/*jpg"
|
46
48
|
# end
|
47
49
|
#
|
48
|
-
def dir
|
50
|
+
def dir(regex, params = {})
|
49
51
|
to = params[:to]
|
50
52
|
if @pkg
|
51
|
-
@pkg.get(regex).each do |path,
|
52
|
-
next if path =~
|
53
|
-
ext, *name = path.split(
|
54
|
-
name = name.reverse.join(
|
55
|
-
create_asset(ext, name, path, nil,
|
53
|
+
@pkg.get(regex).each do |path, _data|
|
54
|
+
next if path =~ %r{/$} # dont let dirs get in... ugly
|
55
|
+
ext, *name = path.split('.').reverse
|
56
|
+
name = name.reverse.join('.').split('/').last
|
57
|
+
create_asset(ext, name, path, nil, to: to)
|
56
58
|
end
|
57
59
|
end
|
58
60
|
end
|
@@ -62,20 +64,20 @@ module Assetify
|
|
62
64
|
#
|
63
65
|
# a "jquery", "http://...jquery.js"
|
64
66
|
#
|
65
|
-
def a
|
66
|
-
extension = url.split(
|
67
|
+
def a(name, url, *_params)
|
68
|
+
extension = url.split('.').last
|
67
69
|
parse_method extension, name, url
|
68
70
|
end
|
69
|
-
alias
|
71
|
+
alias asset a
|
70
72
|
|
71
73
|
#
|
72
74
|
# Filter/validate DSL to parse
|
73
75
|
#
|
74
|
-
def method_missing
|
75
|
-
|
76
|
-
raise SyntaxError.new "Syntax Error on Assetfile. `#{method} :#{name}`"
|
77
|
-
else
|
76
|
+
def method_missing(method, name = nil, uri = nil, *params)
|
77
|
+
if name && uri
|
78
78
|
parse_method method, name, uri, params
|
79
|
+
else
|
80
|
+
raise SyntaxError, "Syntax Error on Assetfile. `#{method} :#{name}`"
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
@@ -90,6 +92,15 @@ module Assetify
|
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
95
|
+
#
|
96
|
+
# DSL.parse()
|
97
|
+
#
|
98
|
+
def self.parse(chunk)
|
99
|
+
# puts "Assetify - Error Parsing 'Assetfile'."
|
100
|
+
# Instance eval with 2nd, 3rd args to the rescue
|
101
|
+
new.instance_eval(chunk, 'Assetfile', 1)
|
102
|
+
end
|
103
|
+
|
93
104
|
private
|
94
105
|
|
95
106
|
#
|
@@ -98,7 +109,7 @@ module Assetify
|
|
98
109
|
# js "foo", "http://foo.com"
|
99
110
|
# js "foo", "http://foo.com", :to => "/other/place"
|
100
111
|
#
|
101
|
-
def parse_method
|
112
|
+
def parse_method(method, name, uri, params = [])
|
102
113
|
params, ver = params.partition { |param| param.is_a?(Hash) }
|
103
114
|
opts = {}
|
104
115
|
params.each { |hsh| opts.merge! hsh }
|
@@ -110,25 +121,14 @@ module Assetify
|
|
110
121
|
# Helper to create asset with correct options
|
111
122
|
#
|
112
123
|
def create_asset(ext, name, path, ver, opts = {})
|
113
|
-
opts
|
124
|
+
opts[:pkg] = @pkg
|
125
|
+
opts[:ns] = @ns
|
114
126
|
@assets ||= []
|
115
127
|
@assets << Asset.new(ext, name, path, ver, opts)
|
116
128
|
end
|
117
129
|
|
118
|
-
|
119
|
-
def set_namespace name
|
130
|
+
def use_namespace(name)
|
120
131
|
@ns = @ns.nil? ? name : "#{@ns}/#{name}"
|
121
132
|
end
|
122
|
-
|
123
|
-
#
|
124
|
-
# DSL.parse()
|
125
|
-
#
|
126
|
-
def self.parse chunk
|
127
|
-
# puts "Assetify - Error Parsing 'Assetfile'."
|
128
|
-
# Instance eval with 2nd, 3rd args to the rescue
|
129
|
-
new.instance_eval(chunk, "Assetfile", 1)
|
130
|
-
end
|
131
|
-
|
132
133
|
end
|
133
|
-
|
134
134
|
end
|