maglove 0.8.1 → 1.0.2
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 +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +157 -0
- data/Gemfile.lock +59 -49
- data/bin/maglove +13 -13
- data/data/maglove/export.haml +11 -0
- data/data/maglove/index.haml +17 -0
- data/data/maglove/maglove.css +62 -0
- data/data/maglove/maglove.haml +18 -0
- data/data/maglove/maglove.js +68 -0
- data/lib/block_resolver.rb +6 -0
- data/lib/ext/thor/option.rb +43 -0
- data/lib/magloft/api.rb +39 -0
- data/lib/magloft/api_caller.rb +67 -0
- data/lib/magloft/remote_collection.rb +50 -0
- data/lib/magloft/remote_resource.rb +124 -0
- data/lib/magloft/transformable.rb +11 -0
- data/lib/magloft/typeloft_block.rb +18 -0
- data/lib/magloft/typeloft_image.rb +18 -0
- data/lib/magloft/typeloft_template.rb +18 -0
- data/lib/magloft/typeloft_theme.rb +41 -0
- data/lib/magloft.rb +3 -0
- data/lib/maglove/application.rb +10 -12
- data/lib/maglove/asset/theme.rb +37 -32
- data/lib/maglove/commands/assets.rb +85 -0
- data/lib/maglove/commands/base.rb +55 -0
- data/lib/maglove/commands/fonts.rb +69 -0
- data/lib/maglove/commands/main.rb +24 -0
- data/lib/maglove/commands/theme.rb +197 -0
- data/lib/maglove/helper/log_helper.rb +3 -18
- data/lib/maglove/middleware/live_reload.rb +97 -0
- data/lib/maglove/phantom_script.rb +9 -10
- data/lib/maglove/server.rb +46 -78
- data/lib/maglove/tilt/coffee_template.rb +7 -6
- data/lib/maglove/tilt/haml_template.rb +4 -4
- data/lib/maglove/tilt/js_template.rb +8 -8
- data/lib/maglove/tilt/less_template.rb +5 -4
- data/lib/maglove/tilt/scss_template.rb +17 -11
- data/lib/maglove/tilt/yaml_template.rb +3 -2
- data/lib/maglove/version.rb +1 -1
- data/lib/maglove/workspace.rb +41 -0
- data/lib/maglove.rb +38 -49
- data/lib/powersnap.rb +24 -0
- data/lib/workspace/workspace_dir/archive.rb +18 -0
- data/lib/workspace/workspace_dir.rb +98 -0
- data/lib/workspace/workspace_file/archive.rb +45 -0
- data/lib/workspace/workspace_file/media.rb +19 -0
- data/lib/workspace/workspace_file/net.rb +18 -0
- data/lib/workspace/workspace_file/parse.rb +21 -0
- data/lib/workspace/workspace_file.rb +99 -0
- data/lib/workspace.rb +11 -0
- data/maglove.gemspec +12 -12
- metadata +100 -86
- data/data/maglove/dump.haml +0 -58
- data/data/maglove/sdk.haml +0 -27
- data/lib/ext/commander/command.rb +0 -32
- data/lib/ext/commander/methods.rb +0 -8
- data/lib/maglove/asset/base_theme.rb +0 -17
- data/lib/maglove/command/compile.rb +0 -44
- data/lib/maglove/command/compress.rb +0 -28
- data/lib/maglove/command/copy.rb +0 -35
- data/lib/maglove/command/core.rb +0 -23
- data/lib/maglove/command/font.rb +0 -80
- data/lib/maglove/command/server.rb +0 -16
- data/lib/maglove/command/sync.rb +0 -17
- data/lib/maglove/command/theme.rb +0 -175
- data/lib/maglove/command/util.rb +0 -45
- data/lib/maglove/helper/asset_helper.rb +0 -24
- data/lib/maglove/helper/command_helper.rb +0 -67
- data/lib/maglove/helper/theme_helper.rb +0 -105
- data/lib/maglove/server/hpub.rb +0 -185
- data/lib/maglove/template/tumblr.rb +0 -81
- data/lib/maglove/tilt/twig_template.rb +0 -49
data/lib/maglove/command/core.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Command
|
3
|
-
class Core
|
4
|
-
include Commander::Methods
|
5
|
-
|
6
|
-
def run
|
7
|
-
|
8
|
-
task :validate, theme: "!" do |args, options|
|
9
|
-
error! "no theme specified" if !options.theme
|
10
|
-
error! "theme #{options.theme} does not exist" if !File.directory?("src/themes/#{options.theme}")
|
11
|
-
debug("theme: #{options.theme}")
|
12
|
-
debug("environment: #{options.production ? 'production' : 'development'}")
|
13
|
-
end
|
14
|
-
|
15
|
-
task :clean, theme: "!" do |args, options|
|
16
|
-
theme_clean(options.theme)
|
17
|
-
debug("▸ cleaned up theme directory")
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/maglove/command/font.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Command
|
3
|
-
class Font
|
4
|
-
include Commander::Methods
|
5
|
-
|
6
|
-
def get_font_styles(font_id, variant, append_dir='')
|
7
|
-
font_name = font_id.gsub('-', ' ').titleize
|
8
|
-
case variant
|
9
|
-
when "regular"
|
10
|
-
"@font-face{font-family:'#{font_name}';src:url('#{append_dir}#{font_id}-#{variant}.ttf');}\n"
|
11
|
-
when "bold"
|
12
|
-
"@font-face{font-family:'#{font_name}';src:url('#{append_dir}#{font_id}-#{variant}.ttf');font-weight:bold;}\n"
|
13
|
-
when "italic"
|
14
|
-
"@font-face{font-family:'#{font_name}';src:url('#{append_dir}#{font_id}-#{variant}.ttf');font-style:italic;}\n"
|
15
|
-
when "bolditalic"
|
16
|
-
"@font-face{font-family:'#{font_name}';src:url('#{append_dir}#{font_id}-#{variant}.ttf');font-weight:bold;font-style:italic;}\n"
|
17
|
-
when "light"
|
18
|
-
"@font-face{font-family:'#{font_name}';src:url('#{append_dir}#{font_id}-#{variant}.ttf');font-weight:300;}\n"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def run
|
23
|
-
|
24
|
-
task :compile, bucket: "cdn.magloft.com", sync: "NO" do |args, options|
|
25
|
-
|
26
|
-
# clean up
|
27
|
-
FileUtils.rm_rf("dist/fonts")
|
28
|
-
FileUtils.mkdir_p("dist/fonts")
|
29
|
-
|
30
|
-
# 1: Build font map
|
31
|
-
debug("▸ building font map")
|
32
|
-
font_map = {}
|
33
|
-
font_files = Dir.glob("src/fonts/*/*.ttf")
|
34
|
-
font_files.each do |font_file|
|
35
|
-
(root_dir, font_dir, font_id, font_filename) = font_file.split("/")
|
36
|
-
font_variant = font_filename.gsub("#{font_id}-", '').gsub(".ttf", '')
|
37
|
-
font_map[font_id] = [] if font_map[font_id].nil?
|
38
|
-
font_map[font_id].push(font_variant)
|
39
|
-
end
|
40
|
-
|
41
|
-
# 2: Generate stylesheets
|
42
|
-
debug("▸ compiling fonts:")
|
43
|
-
FileUtils.touch("dist/fonts/fonts.css")
|
44
|
-
open("dist/fonts/fonts.css", 'wb') do |master_file|
|
45
|
-
font_map.each do |font_id, variants|
|
46
|
-
debug("~▸ compiling font '#{font_id}'")
|
47
|
-
|
48
|
-
# Create font directory
|
49
|
-
FileUtils.mkdir_p("dist/fonts/#{font_id}")
|
50
|
-
|
51
|
-
# Copy fonts
|
52
|
-
variants.each do |variant|
|
53
|
-
FileUtils.copy("src/fonts/#{font_id}/#{font_id}-#{variant}.ttf", "dist/fonts/#{font_id}/#{font_id}-#{variant}.ttf")
|
54
|
-
end
|
55
|
-
|
56
|
-
# Create stylesheet
|
57
|
-
font_style_file = "dist/fonts/#{font_id}/font.css"
|
58
|
-
FileUtils.touch(font_style_file)
|
59
|
-
open(font_style_file, 'wb') do |file|
|
60
|
-
master_file << "/* #{font_id} (#{variants.join(", ")}) */\n"
|
61
|
-
variants.each do |variant|
|
62
|
-
file << get_font_styles(font_id, variant)
|
63
|
-
master_file << get_font_styles(font_id, variant, "#{font_id}/")
|
64
|
-
end
|
65
|
-
master_file << "\n"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
debug("▸ all font styles created")
|
70
|
-
|
71
|
-
if options.sync == "YES"
|
72
|
-
system "gsutil -m rsync -d -r dist/fonts gs://#{options.bucket}/fonts"
|
73
|
-
debug("▸ all fonts synchronized with bucket '#{options.bucket}'")
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Command
|
3
|
-
class Server
|
4
|
-
include Commander::Methods
|
5
|
-
|
6
|
-
def run
|
7
|
-
|
8
|
-
task :run, theme: "!" do |args, options|
|
9
|
-
info("▸ starting server for theme '#{options.theme}'")
|
10
|
-
MagLove::Server.new(options.theme).run!
|
11
|
-
end
|
12
|
-
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
data/lib/maglove/command/sync.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Command
|
3
|
-
class Sync
|
4
|
-
include Commander::Methods
|
5
|
-
|
6
|
-
def run
|
7
|
-
|
8
|
-
task :cdn, theme: "!", bucket: "test-cdn.magloft.com" do |args, options|
|
9
|
-
error! "theme '#{options.theme}' does not exist. Did you run theme:compile yet?" if !options.theme or !File.directory?("dist/themes/#{options.theme}")
|
10
|
-
info("▸ synchronizing #{options.theme} to #{options.bucket}")
|
11
|
-
system "gsutil -m rsync -d -r dist/themes/#{options.theme} gs://#{options.bucket}/themes/#{options.theme}"
|
12
|
-
end
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,175 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Command
|
3
|
-
class Theme
|
4
|
-
include Commander::Methods
|
5
|
-
|
6
|
-
def run
|
7
|
-
|
8
|
-
task :compile, theme: ENV["THEME"], sync: "NO", bucket: "localhost:3002" do |args, options|
|
9
|
-
info("▸ compiling theme #{options.theme}")
|
10
|
-
invoke_tasks(["core:validate", "core:clean", "compile:coffee", "copy:base_images", "copy:images", "compile:css", "compile:yaml", "compile:templates", "copy:thumbs", "compress:theme"], options)
|
11
|
-
|
12
|
-
if options.sync == "YES"
|
13
|
-
error!("▸ SYNC error: please specify a bucket to use (cdn.magloft.com, test-cdn.magloft.com)") if options.bucket == "localhost:3001"
|
14
|
-
invoke_task("sync:cdn", options)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
task :deploy, theme: ENV["THEME"], out: ".", sync: "NO", bucket: "localhost:3002" do |args, options|
|
19
|
-
|
20
|
-
# Compile Theme
|
21
|
-
invoke_task("theme:compile", options)
|
22
|
-
|
23
|
-
# Prepare Deployment Directory
|
24
|
-
output_path = File.expand_path(options.out)
|
25
|
-
error!("Directory '#{output_path}' does not exist!") if !File.directory?(output_path)
|
26
|
-
target_path = File.join(output_path, options.theme)
|
27
|
-
FileUtils.rm_r(target_path) if File.directory?(target_path)
|
28
|
-
FileUtils.mkdir_p(File.join(target_path, "themes"))
|
29
|
-
|
30
|
-
# Copy Assets
|
31
|
-
FileUtils.cp_r(theme_dist_path(nil, options.theme), File.join(target_path, "themes/#{options.theme}"))
|
32
|
-
FileUtils.cp_r(File.join("dist", "fonts"), File.join(target_path, "fonts"))
|
33
|
-
|
34
|
-
# Process Templates
|
35
|
-
templates = theme_config(:templates, options.theme)
|
36
|
-
templates.each do |template|
|
37
|
-
debug "▸ processing template #{template}"
|
38
|
-
|
39
|
-
# Render template
|
40
|
-
variables_yaml = theme_contents("templates/#{template}.yml", options.theme)
|
41
|
-
variables = variables_yaml ? YAML.load(variables_yaml).with_indifferent_access : {}
|
42
|
-
variables[:theme] = options.theme
|
43
|
-
template_file = theme_glob("templates/#{template}.{html,twig,haml}", options.theme).first
|
44
|
-
if !template_file.nil?
|
45
|
-
asset = MagLove::Asset::Theme.new(template_file, options.theme, variables)
|
46
|
-
contents = asset.contents
|
47
|
-
else
|
48
|
-
contents = "<p style='text-align: center; margin-top: 12px;'>ERROR: Template '#{template}' not found!</p>"
|
49
|
-
end
|
50
|
-
|
51
|
-
# Render Static Dump
|
52
|
-
haml_contents = File.read(File.join(Gem.datadir("maglove"), "dump.haml"))
|
53
|
-
html_contents = Hamloft.render(haml_contents, theme: options.theme, contents: contents, templates: templates, template: template)
|
54
|
-
|
55
|
-
# Write to file
|
56
|
-
File.open(File.join(target_path, "#{template}.html"), "w") {|f| f.write(html_contents) }
|
57
|
-
end
|
58
|
-
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
task :"compile-all", sync: "NO", bucket: "localhost:3002" do |args, options|
|
63
|
-
themes = Dir.chdir("src/themes") { Dir.glob("*") }
|
64
|
-
themes.each do |theme|
|
65
|
-
options.theme = theme
|
66
|
-
invoke_task("theme:compile", options)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
task :thumbnails, theme: ENV["THEME"] do |args, options|
|
71
|
-
info("▸ Starting Server")
|
72
|
-
Thread.new do
|
73
|
-
MagLove::Server.new(options.theme, 3000).run!
|
74
|
-
end
|
75
|
-
sleep 1
|
76
|
-
|
77
|
-
info("▸ Generating thumbnails for theme '#{options.theme}'")
|
78
|
-
|
79
|
-
templates = theme_config(:templates, options.theme)
|
80
|
-
templates.each do |template|
|
81
|
-
debug "▸ processing template #{template}"
|
82
|
-
|
83
|
-
variables = {}
|
84
|
-
variables_yaml = theme_contents("templates/#{template}.yml", options.theme)
|
85
|
-
variables = YAML.load(variables_yaml).with_indifferent_access if variables_yaml
|
86
|
-
variables[:theme] = options.theme
|
87
|
-
|
88
|
-
# Render template
|
89
|
-
template_file = theme_glob("templates/#{template}.{html,twig,haml}", options.theme).first
|
90
|
-
if !template_file.nil?
|
91
|
-
asset = MagLove::Asset::Theme.new(template_file, options.theme, variables)
|
92
|
-
contents = asset.contents
|
93
|
-
else
|
94
|
-
contents = "<p style='text-align: center; margin-top: 12px;'>ERROR: Template '#{template}' not found!</p>"
|
95
|
-
end
|
96
|
-
|
97
|
-
# Render thumbnail html
|
98
|
-
haml_contents = File.read(File.join(Gem.datadir("maglove"), "thumbnail.haml"))
|
99
|
-
html = Hamloft.render(haml_contents, theme: options.theme, contents: contents)
|
100
|
-
|
101
|
-
# Create thumbnail image
|
102
|
-
script = PhantomScript.new('thumbnail')
|
103
|
-
html_base64 = Base64.strict_encode64(html)
|
104
|
-
contents = script.run(html_base64, "png", "480", "640", "1")
|
105
|
-
theme_write_contents("thumbs/#{template}.png", contents, options.theme)
|
106
|
-
|
107
|
-
# Optimize thumbnail image
|
108
|
-
info("▸ Optimize image")
|
109
|
-
begin
|
110
|
-
image_optim = ImageOptim.new(pngout: false, svgo: false)
|
111
|
-
image_optim.optimize_image!(theme_path("thumbs/#{template}.png", options.theme))
|
112
|
-
rescue Exception => e
|
113
|
-
error(e.message)
|
114
|
-
error!("Missing image optimization binaries. Install via: gem install image_optim_pack")
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
|
121
|
-
task :init, theme: ENV["THEME"], base_version: "v1" do |args, options|
|
122
|
-
# validate theme
|
123
|
-
error! "no theme specified" if !options.theme
|
124
|
-
error! "theme #{options.theme} already exists" if File.directory?("src/themes/#{options.theme}")
|
125
|
-
debug("theme: #{options.theme}")
|
126
|
-
debug("environment: #{options.production ? 'production' : 'development'}")
|
127
|
-
|
128
|
-
# collect variables
|
129
|
-
base_scaffold_dir = File.join(Gem.datadir("maglove"), "scaffold/base")
|
130
|
-
base_target_dir = "src/base/#{options.base_version}"
|
131
|
-
theme_scaffold_dir = File.join(Gem.datadir("maglove"), "scaffold/theme")
|
132
|
-
theme_target_dir = "src/themes/#{options.theme}"
|
133
|
-
|
134
|
-
# create base repository
|
135
|
-
if !File.directory?(base_target_dir)
|
136
|
-
FileUtils.mkdir_p("src/base")
|
137
|
-
FileUtils.cp_r(base_scaffold_dir, base_target_dir)
|
138
|
-
info("▸ created base theme in '#{base_target_dir}'")
|
139
|
-
end
|
140
|
-
|
141
|
-
# create theme repository
|
142
|
-
FileUtils.mkdir_p("src/themes")
|
143
|
-
FileUtils.cp_r(theme_scaffold_dir, theme_target_dir)
|
144
|
-
|
145
|
-
# create yaml file
|
146
|
-
yaml_contents = {
|
147
|
-
"name" => options.theme.titlecase,
|
148
|
-
"base_version" => options.base_version,
|
149
|
-
"identifier" => options.theme,
|
150
|
-
"description" => "#{options.theme.titlecase} theme created with MagLove",
|
151
|
-
"templates" => ['cover', 'toc', 'article-01']
|
152
|
-
}
|
153
|
-
theme_write_contents("theme.yml", yaml_contents.to_yaml.gsub("---\n", ''), options.theme)
|
154
|
-
info("▸ created #{options.theme} theme in '#{theme_target_dir}'")
|
155
|
-
end
|
156
|
-
|
157
|
-
task :dev, theme: ENV["THEME"] do |args, options|
|
158
|
-
options.production = false
|
159
|
-
invoke_task("theme:compile", options)
|
160
|
-
invoke_task("font:compile", options)
|
161
|
-
options.block = "NO"
|
162
|
-
invoke_task("util:watch", options)
|
163
|
-
|
164
|
-
# browser sync
|
165
|
-
options.files = "dist/themes/#{options.theme}/*.css, dist/themes/#{options.theme}/*.js, dist/themes/#{options.theme}/templates/*.html, dist/themes/#{options.theme}/images/**/*"
|
166
|
-
options.start_path = theme_config(:templates, options.theme).first
|
167
|
-
invoke_task("util:browser_sync", options)
|
168
|
-
|
169
|
-
invoke_task("server:run", options)
|
170
|
-
end
|
171
|
-
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
data/lib/maglove/command/util.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Command
|
3
|
-
class Util
|
4
|
-
include Commander::Methods
|
5
|
-
|
6
|
-
def run
|
7
|
-
|
8
|
-
task :cache_clear, bucket: "cdn.magloft.com" do |args, options|
|
9
|
-
debug("▸ clearing cache for #{options.bucket}.magloft.com")
|
10
|
-
system "gsutil -m setmeta -R -h 'Cache-Control:public, max-age=0, no-transform' gs://#{options.bucket}.magloft.com/themes"
|
11
|
-
end
|
12
|
-
|
13
|
-
task :browser_sync, theme: "!", files: "!", port: "3002", proxy_port: "3001", host: "localhost", start_path: "/", log_level: "silent" do |args, options|
|
14
|
-
debug("▸ starting browser-sync")
|
15
|
-
job = fork do
|
16
|
-
begin
|
17
|
-
system "browser-sync start --proxy #{options.host}:#{options.proxy_port} --port #{options.port} --files '#{options.files}' --startPath '#{options.start_path}' --logLevel #{options.log_level} --no-ui"
|
18
|
-
rescue Exception => e
|
19
|
-
info("▸ shutting down browser sync")
|
20
|
-
end
|
21
|
-
end
|
22
|
-
Process.detach(job)
|
23
|
-
end
|
24
|
-
|
25
|
-
task :watch, theme: "!", block: "NO" do |args, options|
|
26
|
-
info("▸ watching theme #{options.theme}")
|
27
|
-
watch_config({
|
28
|
-
"compile:coffee" => [theme_path("**/*.{coffee,js}", options.theme), theme_base_path("**/*.{coffee,js}", options.theme)],
|
29
|
-
"compile:css" => [theme_path("**/*.{less,scss,css}", options.theme), theme_base_path("**/*.{less,scss,css}", options.theme)],
|
30
|
-
"compile:templates" => [theme_path("**/*.{haml,twig,html}", options.theme)],
|
31
|
-
"copy:base_images" => theme_base_path("images/**/*.{jpg,jpeg,gif,png,svg}", options.theme),
|
32
|
-
"copy:images" => theme_path("images/**/*.{jpg,jpeg,gif,png,svg}", options.theme)
|
33
|
-
}, options)
|
34
|
-
|
35
|
-
if options.block == "YES"
|
36
|
-
while true
|
37
|
-
sleep 100
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Helper
|
3
|
-
module AssetHelper
|
4
|
-
|
5
|
-
def theme_asset(path, theme=nil, locals={})
|
6
|
-
theme ||= ENV["THEME"]
|
7
|
-
if not File.exists?("src/themes/#{theme}/#{path}")
|
8
|
-
error! "file '#{path}' not found for theme '#{theme}'"
|
9
|
-
end
|
10
|
-
MagLove::Asset::Theme.new(path, theme, locals.merge(theme: theme))
|
11
|
-
end
|
12
|
-
|
13
|
-
def base_theme_asset(path, theme=nil, version=nil)
|
14
|
-
theme ||= ENV["THEME"]
|
15
|
-
version ||= theme_config("base_version", theme)
|
16
|
-
if not File.exists?("src/base/#{version}/#{path}")
|
17
|
-
error! "file '#{path}' not found for base-theme '#{version}'"
|
18
|
-
end
|
19
|
-
MagLove::Asset::BaseTheme.new(path, theme, version)
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Helper
|
3
|
-
module CommandHelper
|
4
|
-
|
5
|
-
def task(action, option_config={}, &block)
|
6
|
-
command "#{library}-#{action}" do |c|
|
7
|
-
required_options = []
|
8
|
-
c.syntax = "maglove #{library} #{action}"
|
9
|
-
c.summary = "#{library} #{action} command"
|
10
|
-
option_config.each do |key, value|
|
11
|
-
if value == "!"
|
12
|
-
required_options.push(key)
|
13
|
-
c.option "--#{key} STRING", String, "[required]"
|
14
|
-
else
|
15
|
-
c.option "--#{key} STRING", String, "[default: #{value}]"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
c.task_action do |args, options|
|
19
|
-
Logging.mdc["command"] = "#{library}-#{action}"
|
20
|
-
required_options.each do |required_option|
|
21
|
-
if !options.__hash__[required_option.to_sym]
|
22
|
-
error!("missing required option '#{required_option}'")
|
23
|
-
end
|
24
|
-
end
|
25
|
-
options.default(option_config)
|
26
|
-
block.call(args, options)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def library
|
32
|
-
self.class.name.split("::").last.underscore
|
33
|
-
end
|
34
|
-
|
35
|
-
def invoke_tasks(command_names, *args)
|
36
|
-
command_names.each do |command_name|
|
37
|
-
invoke_task(command_name, *args)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def invoke_task(command_name, *args)
|
42
|
-
command_name = command_name.gsub(":", "-")
|
43
|
-
if args.length == 0
|
44
|
-
command_args = []
|
45
|
-
command_options = Commander::Command::Options.new
|
46
|
-
elsif args.length == 1
|
47
|
-
if args[0].class == Array
|
48
|
-
command_args = args[0]
|
49
|
-
command_options = Commander::Command::Options.new
|
50
|
-
else
|
51
|
-
command_args = []
|
52
|
-
command_options = args[0]
|
53
|
-
end
|
54
|
-
elsif args.length == 2
|
55
|
-
command_args = args[0]
|
56
|
-
command_options = Commander::Command::Options.new
|
57
|
-
else
|
58
|
-
error!("invalid arguments specified for invoke_task '#{command_name}'")
|
59
|
-
end
|
60
|
-
command = Commander::Runner.instance.commands[command_name]
|
61
|
-
error!("cannot invoke command '#{command_name}': command not found") if command.nil?
|
62
|
-
command.invoke(command_args, command_options)
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
@@ -1,105 +0,0 @@
|
|
1
|
-
module MagLove
|
2
|
-
module Helper
|
3
|
-
module ThemeHelper
|
4
|
-
|
5
|
-
@@config = {}
|
6
|
-
|
7
|
-
def theme_clean(theme=nil)
|
8
|
-
FileUtils.rm_rf(theme_dist_path(nil, theme))
|
9
|
-
FileUtils.mkdir_p(theme_dist_path(nil, theme))
|
10
|
-
end
|
11
|
-
|
12
|
-
def theme_config(key=nil, theme)
|
13
|
-
if not @@config[theme]
|
14
|
-
@@config[theme] = YAML.load(theme_contents("theme.yml", theme))
|
15
|
-
end
|
16
|
-
if key.nil?
|
17
|
-
@@config[theme]
|
18
|
-
else
|
19
|
-
@@config[theme][key.to_s]
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def theme_glob(pattern, theme)
|
24
|
-
glob = []
|
25
|
-
Dir.chdir(theme_path(nil, theme)) do
|
26
|
-
glob = Dir.glob(pattern)
|
27
|
-
end
|
28
|
-
glob
|
29
|
-
end
|
30
|
-
|
31
|
-
def theme_path(path=nil, theme)
|
32
|
-
path.nil? ? "src/themes/#{theme}" : "src/themes/#{theme}/#{path}"
|
33
|
-
end
|
34
|
-
|
35
|
-
def theme_dist_path(path=nil, theme)
|
36
|
-
path.nil? ? "dist/themes/#{theme}" : "dist/themes/#{theme}/#{path}"
|
37
|
-
end
|
38
|
-
|
39
|
-
def theme_contents(path, theme)
|
40
|
-
if File.exists?(theme_path(path, theme))
|
41
|
-
File.read(theme_path(path, theme))
|
42
|
-
else
|
43
|
-
nil
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def theme_write_contents(path, contents, theme)
|
48
|
-
File.open(theme_path(path, theme), "w") {|f| f.write(contents) }
|
49
|
-
end
|
50
|
-
|
51
|
-
def theme_dist_contents(path, theme)
|
52
|
-
File.read(theme_dist_path(path, theme))
|
53
|
-
end
|
54
|
-
|
55
|
-
def theme_base_glob(pattern, theme)
|
56
|
-
glob = []
|
57
|
-
Dir.chdir(theme_base_path(nil, theme)) do
|
58
|
-
glob = Dir.glob(pattern)
|
59
|
-
end
|
60
|
-
glob
|
61
|
-
end
|
62
|
-
|
63
|
-
def theme_base_path(path=nil, theme)
|
64
|
-
path.nil? ? "src/base/#{theme_config(:base_version, theme)}" : "src/base/#{theme_config(:base_version, theme)}/#{path}"
|
65
|
-
end
|
66
|
-
|
67
|
-
def theme_dist_glob(pattern, theme)
|
68
|
-
Dir.glob("dist/themes/#{theme}/#{pattern}")
|
69
|
-
end
|
70
|
-
|
71
|
-
def theme_watch(pattern, theme, &block)
|
72
|
-
watch(theme_path(pattern, theme), &block)
|
73
|
-
end
|
74
|
-
|
75
|
-
def theme_base_watch(pattern, theme, &block)
|
76
|
-
watch(theme_base_path(pattern, theme), &block)
|
77
|
-
end
|
78
|
-
|
79
|
-
def watch_config(config, options)
|
80
|
-
config.each do |task, pattern|
|
81
|
-
watch(pattern) do |filename, event|
|
82
|
-
begin
|
83
|
-
invoke_task(task, options.__merge(pattern: filename))
|
84
|
-
rescue Exception => e
|
85
|
-
error(e.message)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def watch(pattern, &block)
|
92
|
-
watcher = FileWatcher.new(pattern)
|
93
|
-
Thread.new(watcher) do |fw|
|
94
|
-
fw.watch do |filename, event|
|
95
|
-
if !File.directory?(filename) and event != :delete
|
96
|
-
info("▸ file changed: #{filename}")
|
97
|
-
block.call(filename, event)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|