pyro 0.9.0 → 1.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/bin/pyro +31 -10
- data/lib/pyro.rb +4 -4
- data/lib/pyro/asset.rb +101 -0
- data/lib/pyro/assets.rb +31 -112
- data/lib/pyro/server.rb +10 -5
- data/pyro.gemspec +2 -2
- data/templates/app/index.erb +10 -5
- data/templates/app/lib/app.coffee +0 -2
- data/templates/app/test/example.coffee +15 -0
- data/templates/app/vendor/ember/ember-data.js +6947 -0
- data/templates/app/vendor/ember/ember-data.prod.js +284 -0
- data/templates/app/vendor/ember/{ember-1.0.0-rc.8.js → ember.js} +1302 -1799
- data/templates/app/vendor/ember/ember.prod.js +1260 -1785
- data/templates/app/vendor/qunit/qunit.css +244 -0
- data/templates/app/vendor/qunit/qunit.js +2212 -0
- data/test/test_pyro.rb +7 -7
- metadata +13 -10
- data/templates/app/README.md +0 -0
- data/templates/app/test/test.coffee +0 -1
- data/templates/app/vendor/ember/ember-data-0.13.js +0 -8887
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbd5afb69830d1640ab6d13d5078558c27311a3b
|
4
|
+
data.tar.gz: a944401a77fe94e767c5c8636e03cc2188b94bef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4bd3c62c7502fa6c39c75beb7ca04df27a530f71b7174f3de2b39942f03dacb1b5ae618b226fe785327f1961c18041dba77086dd14fb25e8e8248591e360c6f
|
7
|
+
data.tar.gz: 3efd9c17314c130e00e106091f56fd4afb683af843e9c9def9a19c234e207c6cea116ac5f27c21ca255a69910741ac51f28f72db241cdd28fa6928572cfd93ac
|
data/README.md
CHANGED
@@ -107,7 +107,7 @@ Everything will be built on the first page load, but reloads will only rebuild `
|
|
107
107
|
When you're ready to deploy, the ```pyro build``` command will compile and minify your app into ```/builds/production/<timestamp>```:
|
108
108
|
|
109
109
|
```bash
|
110
|
-
~/MyApp $ pyro
|
110
|
+
~/MyApp $ pyro burn
|
111
111
|
# => MyApp is compiled and minified into ~/MyApp/builds/production/20130816020233/
|
112
112
|
```
|
113
113
|
|
data/bin/pyro
CHANGED
@@ -10,27 +10,48 @@ class PyroCLI < Thor
|
|
10
10
|
FileUtils.cp_r("#{File.dirname(__FILE__)}/../templates/app", name)
|
11
11
|
end
|
12
12
|
|
13
|
-
desc '
|
14
|
-
def
|
15
|
-
Pyro.
|
13
|
+
desc 'burn DIR', 'Builds an app for production'
|
14
|
+
def burn(dir = '.')
|
15
|
+
Pyro.burn('production', false, dir)
|
16
16
|
end
|
17
17
|
|
18
|
-
desc 'serve
|
19
|
-
|
18
|
+
desc 'serve', 'Starts a Pyro app on localhost,
|
19
|
+
--fast skips asset reloading,
|
20
|
+
--test includes tests'
|
21
|
+
|
20
22
|
option :fast
|
21
|
-
|
23
|
+
option :test
|
24
|
+
def serve
|
22
25
|
require 'pyro/server'
|
23
26
|
|
24
|
-
PyroServer.set :src_folder, dir
|
25
|
-
PyroServer.set :public_folder,
|
26
|
-
"#{PyroServer.settings.src_folder}/tmp"
|
27
|
-
|
28
27
|
if options[:fast]
|
29
28
|
PyroServer.set :fast, true
|
30
29
|
else
|
31
30
|
PyroServer.set :fast, false
|
32
31
|
end
|
33
32
|
|
33
|
+
PyroServer.set(:target, 'test') if options[:test]
|
34
|
+
|
35
|
+
PyroServer.run!
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'stage BUILD', 'Stages a Pyro build on localhost'
|
39
|
+
def stage(build_num = false)
|
40
|
+
if build_num
|
41
|
+
build_dir = "./pkg/#{build_num}"
|
42
|
+
else
|
43
|
+
Pyro.burn('production', false) if Dir.glob('./pkg/**').count == 0
|
44
|
+
build_dir = Dir.glob('./pkg/**').last
|
45
|
+
end
|
46
|
+
|
47
|
+
unless Dir.exists? build_dir
|
48
|
+
puts "That build doesn't exist. Try running 'pyro burn' to create a build."
|
49
|
+
exit
|
50
|
+
end
|
51
|
+
|
52
|
+
require 'pyro/server'
|
53
|
+
PyroServer.set :public_folder, build_dir
|
54
|
+
PyroServer.set :staging, true
|
34
55
|
PyroServer.run!
|
35
56
|
end
|
36
57
|
|
data/lib/pyro.rb
CHANGED
@@ -4,17 +4,17 @@ require 'pyro/assets'
|
|
4
4
|
module Pyro
|
5
5
|
include Pyro::Assets
|
6
6
|
|
7
|
-
def self.
|
7
|
+
def self.burn(target = 'production', fast = false, working_dir = '.')
|
8
8
|
@target = target
|
9
9
|
@timestamp = Time.now.strftime "%Y%m%d%H%M%S"
|
10
10
|
@working_dir = working_dir
|
11
11
|
@links = []
|
12
12
|
|
13
13
|
unless File.exists? "#{@working_dir}/index.erb"
|
14
|
-
raise 'Can\'t find an index.erb file to
|
14
|
+
raise 'Can\'t find an index.erb file to burn.'
|
15
15
|
end
|
16
16
|
|
17
|
-
if @target == 'development'
|
17
|
+
if @target == 'development' || @target == 'test'
|
18
18
|
@build_dir = "#{@working_dir}/tmp"
|
19
19
|
else
|
20
20
|
@build_dir = "#{@working_dir}/pkg/#{@timestamp}"
|
@@ -31,7 +31,7 @@ module Pyro
|
|
31
31
|
File.open("#{@build_dir}/index.html", 'w+') do |f|
|
32
32
|
f.write( ERB.new(File.read "#{@working_dir}/index.erb").result(binding) )
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
compress(@build_dir) if @target == 'production'
|
36
36
|
end
|
37
37
|
end
|
data/lib/pyro/asset.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'barber'
|
2
|
+
require 'coffee-script'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'sass'
|
5
|
+
|
6
|
+
module Pyro
|
7
|
+
class Asset
|
8
|
+
attr_accessor :file, :build_dir, :working_dir, :helper_args
|
9
|
+
|
10
|
+
def initialize(args)
|
11
|
+
args.each { |k, v| instance_variable_set("@#{k}", v) }
|
12
|
+
end
|
13
|
+
|
14
|
+
def mtime
|
15
|
+
File.mtime file
|
16
|
+
end
|
17
|
+
|
18
|
+
def basename
|
19
|
+
File.basename file
|
20
|
+
end
|
21
|
+
|
22
|
+
def dirname
|
23
|
+
File.dirname file
|
24
|
+
end
|
25
|
+
|
26
|
+
def extname
|
27
|
+
File.extname file
|
28
|
+
end
|
29
|
+
|
30
|
+
def name
|
31
|
+
basename.sub(extname, '')
|
32
|
+
end
|
33
|
+
|
34
|
+
def timestamp
|
35
|
+
mtime.strftime "%Y%m%d%H%M%S"
|
36
|
+
end
|
37
|
+
|
38
|
+
def relative_dir
|
39
|
+
dirname.sub("#{working_dir}/", '')
|
40
|
+
end
|
41
|
+
|
42
|
+
def relative_file
|
43
|
+
if helper_args[:target]
|
44
|
+
helper_args[:target]
|
45
|
+
else
|
46
|
+
"#{relative_dir}/#{name}#{compiled_ext}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def compiled_ext
|
51
|
+
case extname
|
52
|
+
when '.coffee', '.hbs', '.handlebars'
|
53
|
+
'.js'
|
54
|
+
when '.scss'
|
55
|
+
'.css'
|
56
|
+
else
|
57
|
+
extname
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def contents
|
62
|
+
contents = File.read file
|
63
|
+
case extname
|
64
|
+
when '.coffee'
|
65
|
+
contents = CoffeeScript.compile(contents, bare: true)
|
66
|
+
when '.scss'
|
67
|
+
contents = Sass::Engine.new(contents, { syntax: :scss }).render
|
68
|
+
when '.hbs', '.handlebars'
|
69
|
+
contents = Barber::Ember::FilePrecompiler.call(contents)
|
70
|
+
contents = "Ember.TEMPLATES['#{template_name}'] = #{contents}"
|
71
|
+
end
|
72
|
+
contents
|
73
|
+
end
|
74
|
+
|
75
|
+
def template_name
|
76
|
+
if helper_args[:name]
|
77
|
+
helper_args[:name]
|
78
|
+
elsif helper_args[:src]
|
79
|
+
name
|
80
|
+
elsif helper_args[:dir]
|
81
|
+
file.sub("#{working_dir}/#{helper_args[:dir]}/", '').sub(extname, '')
|
82
|
+
else
|
83
|
+
'name-not-found'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def generate_file
|
88
|
+
FileUtils.mkdir_p "#{build_dir}/#{relative_dir}"
|
89
|
+
File.open("#{build_dir}/#{relative_file}", 'a+') { |f| f.write contents }
|
90
|
+
end
|
91
|
+
|
92
|
+
def generate_link
|
93
|
+
case compiled_ext
|
94
|
+
when '.js'
|
95
|
+
"<script type='text/javascript' src='#{relative_file}?#{timestamp}'></script>\n"
|
96
|
+
when '.css'
|
97
|
+
"<link type='text/css' rel='stylesheet' href='#{relative_file}?#{timestamp}' />\n"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/pyro/assets.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
require 'barber'
|
2
|
-
require 'coffee-script'
|
3
1
|
require 'fileutils'
|
4
2
|
require 'jsmin'
|
5
3
|
require 'sass'
|
4
|
+
require 'pyro/asset'
|
6
5
|
|
7
6
|
module Pyro
|
8
7
|
module Assets
|
@@ -12,131 +11,52 @@ module Pyro
|
|
12
11
|
|
13
12
|
module ClassMethods
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
tags << compile(args.first, file, 'js')
|
19
|
-
end
|
20
|
-
tags
|
21
|
-
end
|
14
|
+
define_method(:script) { |*args| build(args.first, 'js, coffee') }
|
15
|
+
define_method(:stylesheet) { |*args| build(args.first, 'css, scss') }
|
16
|
+
define_method(:template) { |*args| build(args.first, 'hbs, handlebars') }
|
22
17
|
|
23
|
-
def
|
24
|
-
|
25
|
-
find_files(args.first, 'css, scss').each do |file|
|
26
|
-
tags << compile(args.first, file, 'css')
|
27
|
-
end
|
28
|
-
tags
|
18
|
+
def test(*args)
|
19
|
+
build(args.first, 'js, coffee, css, scss') if @target == 'test'
|
29
20
|
end
|
30
21
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
22
|
+
private
|
23
|
+
|
24
|
+
def build(args, src_ext)
|
25
|
+
tags = ''
|
26
|
+
find_assets(args, src_ext).each do |asset|
|
27
|
+
asset.generate_file
|
28
|
+
link = asset.generate_link
|
29
|
+
unless @links.include? link
|
30
|
+
@links << link
|
31
|
+
tags << link
|
32
|
+
end
|
35
33
|
end
|
36
34
|
tags
|
37
35
|
end
|
38
36
|
|
39
|
-
|
40
|
-
|
41
|
-
def find_files(args, extensions)
|
37
|
+
def find_assets(args, exts)
|
42
38
|
if @target == 'production'
|
43
39
|
args[:src] = args[:prod_src] if args[:prod_src]
|
44
40
|
args[:dir] = args[:prod_dir] if args[:prod_dir]
|
45
41
|
end
|
46
|
-
|
47
|
-
files = []
|
48
|
-
if args[:src]
|
49
|
-
files << "#{@working_dir}/#{args[:src]}"
|
50
|
-
elsif args[:dir]
|
51
|
-
Dir.glob("#{@working_dir}/#{args[:dir]}/**/*.{#{extensions}}").each do |f|
|
52
|
-
files << f
|
53
|
-
end
|
54
|
-
end
|
55
|
-
files
|
56
|
-
end
|
57
|
-
|
58
|
-
def parse_path(args, path)
|
59
|
-
p = {}
|
60
|
-
p[:contents] = File.read(path)
|
61
|
-
p[:file_name] = path.split('/').last
|
62
|
-
p[:extension] = path.split('.').last
|
63
|
-
p[:name] = p[:file_name].sub(".#{p[:extension]}", '')
|
64
|
-
p[:path] = path.sub(p[:file_name], '')
|
65
|
-
p[:build_path] = p[:path].sub('./', "#{@build_dir}/")
|
66
|
-
|
67
|
-
if args[:target]
|
68
|
-
target_name = args[:target].split('/').last
|
69
|
-
target_ext = target_name.split('.').last
|
70
|
-
args[:target] = args[:target].sub(".#{target_ext}", '')
|
71
|
-
p[:target_path] = "#{@build_dir}/#{args[:target]}"
|
72
|
-
else
|
73
|
-
p[:target_path] = "#{p[:build_path]}#{p[:name]}"
|
74
|
-
end
|
75
|
-
|
76
|
-
p[:target_link] = p[:target_path].sub(@build_dir, '')
|
77
|
-
p
|
78
|
-
end
|
79
42
|
|
80
|
-
|
81
|
-
if args[:
|
82
|
-
|
83
|
-
|
84
|
-
|
43
|
+
assets = []
|
44
|
+
if args[:src]
|
45
|
+
assets << Asset.new(file: "#{@working_dir}/#{args[:src]}",
|
46
|
+
build_dir: @build_dir,
|
47
|
+
working_dir: @working_dir,
|
48
|
+
helper_args: args)
|
85
49
|
elsif args[:dir]
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
end
|
92
|
-
|
93
|
-
def generate_file(path_attrs, extension, template_name)
|
94
|
-
FileUtils.mkdir_p(path_attrs[:build_path])
|
95
|
-
File.open("#{path_attrs[:target_path]}.#{extension}", 'a+') do |f|
|
96
|
-
if template_name == ''
|
97
|
-
f.write(path_attrs[:contents])
|
98
|
-
else
|
99
|
-
f.write("Ember.TEMPLATES['#{template_name}'] = #{path_attrs[:contents]}")
|
50
|
+
Dir.glob("#{@working_dir}/#{args[:dir]}/**/*.{#{exts}}").each do |file|
|
51
|
+
assets << Asset.new(file: file,
|
52
|
+
build_dir: @build_dir,
|
53
|
+
working_dir: @working_dir,
|
54
|
+
helper_args: args)
|
100
55
|
end
|
101
56
|
end
|
57
|
+
assets
|
102
58
|
end
|
103
59
|
|
104
|
-
def generate_link(path, extension)
|
105
|
-
case extension
|
106
|
-
when 'js'
|
107
|
-
link = "<script src='#{path}.#{extension}?#{@timestamp}' type='text/javascript'></script>"
|
108
|
-
when 'css'
|
109
|
-
link = "<link rel='stylesheet' href='#{path}.#{extension}?#{@timestamp}' type='text/css' />"
|
110
|
-
end
|
111
|
-
|
112
|
-
if @links.include? link
|
113
|
-
''
|
114
|
-
else
|
115
|
-
@links << link
|
116
|
-
link
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def compile(args, file, extension)
|
121
|
-
path_attrs = parse_path(args, file)
|
122
|
-
template_name = ''
|
123
|
-
|
124
|
-
case path_attrs[:extension]
|
125
|
-
when 'coffee'
|
126
|
-
path_attrs[:contents] = CoffeeScript.compile(path_attrs[:contents], bare: true)
|
127
|
-
when 'hbs', 'handlebars'
|
128
|
-
path_attrs[:contents] = Barber::Ember::FilePrecompiler.call(path_attrs[:contents])
|
129
|
-
template_name = parse_name(args, file)
|
130
|
-
when 'scss'
|
131
|
-
path_attrs[:contents] = Sass::Engine.new( path_attrs[:contents],
|
132
|
-
{ style: :expanded,
|
133
|
-
syntax: :scss } ).render
|
134
|
-
end
|
135
|
-
|
136
|
-
generate_file(path_attrs, extension, template_name)
|
137
|
-
generate_link(path_attrs[:target_link], extension)
|
138
|
-
end
|
139
|
-
|
140
60
|
def compress(dir)
|
141
61
|
Dir.glob("#{dir}/**/*.js").each do |file|
|
142
62
|
contents = File.read(file)
|
@@ -144,14 +64,13 @@ module Pyro
|
|
144
64
|
f.write(JSMin.minify(contents).strip)
|
145
65
|
end
|
146
66
|
end
|
147
|
-
|
67
|
+
|
148
68
|
Dir.glob("#{dir}/**/*.css").each do |file|
|
149
69
|
contents = File.read(file)
|
150
70
|
File.open(file, 'w+') do |f|
|
151
71
|
f.write(Sass::Engine.new( contents, { style: :compressed,
|
152
72
|
syntax: :scss } ).render)
|
153
73
|
end
|
154
|
-
|
155
74
|
end
|
156
75
|
end
|
157
76
|
|
data/lib/pyro/server.rb
CHANGED
@@ -5,13 +5,18 @@ require 'erb'
|
|
5
5
|
class PyroServer < Sinatra::Base
|
6
6
|
include Pyro
|
7
7
|
|
8
|
-
set :
|
8
|
+
set :fast_build, false
|
9
|
+
set :port, 7976
|
9
10
|
set :public_folder, './tmp'
|
10
|
-
set :
|
11
|
+
set :staging, false
|
12
|
+
set :target, 'development'
|
11
13
|
|
12
14
|
get '/?' do
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
unless settings.staging
|
16
|
+
Pyro.burn(settings.target, settings.fast_build)
|
17
|
+
settings.fast_build = settings.fast
|
18
|
+
end
|
19
|
+
|
20
|
+
File.read "#{settings.public_folder}/index.html"
|
16
21
|
end
|
17
22
|
end
|
data/pyro.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "pyro"
|
7
|
-
gem.version = "0.
|
7
|
+
gem.version = "1.0.0.rc1"
|
8
8
|
gem.authors = "Jarrod Taylor"
|
9
9
|
gem.email = "jarrodtaylor@icloud.com"
|
10
10
|
gem.homepage = "https://github.com/jarrodtaylor/pyro"
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
|
|
20
20
|
gem.add_dependency 'barber', '~> 0.4.2'
|
21
21
|
gem.add_dependency 'execjs', '~> 1.4.0'
|
22
22
|
gem.add_dependency 'coffee-script', '~> 2.2.0'
|
23
|
-
gem.add_dependency 'ember-source', '~> 1.0.0
|
23
|
+
gem.add_dependency 'ember-source', '~> 1.0.0'
|
24
24
|
gem.add_dependency 'handlebars-source', '~> 1.0.12'
|
25
25
|
gem.add_dependency 'jsmin', '~> 1.0.1'
|
26
26
|
gem.add_dependency 'sass', '~> 3.2.10'
|
data/templates/app/index.erb
CHANGED
@@ -1,23 +1,28 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
2
|
<html>
|
3
3
|
<head>
|
4
|
-
<meta charset="utf-8">
|
5
|
-
<title>Ember Starter Kit</title>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Ember Starter Kit</title>
|
6
6
|
<%= stylesheet src: 'resources/stylesheets/normalize.css' %>
|
7
7
|
<%= stylesheet src: 'resources/stylesheets/style.scss' %>
|
8
|
+
|
9
|
+
<%= test src: 'vendor/qunit/qunit.css' %>
|
8
10
|
</head>
|
9
11
|
<body>
|
10
12
|
<%= script src: 'vendor/jquery/jquery-1.9.1.js',
|
11
13
|
target: 'vendor/concatenated.js' %>
|
12
14
|
<%= script src: 'vendor/handlebars/handlebars-1.0.0.js',
|
13
15
|
target: 'vendor/concatenated.js' %>
|
14
|
-
<%= script src: 'vendor/ember/ember
|
16
|
+
<%= script src: 'vendor/ember/ember.js',
|
15
17
|
prod_src: 'vendor/ember/ember.prod.js',
|
16
18
|
target: 'vendor/concatenated.js' %>
|
17
|
-
<%= script src: 'vendor/ember/ember-data
|
19
|
+
<%= script src: 'vendor/ember/ember-data.js',
|
20
|
+
prod_src: 'vendor/ember/ember-data.prod.js',
|
18
21
|
target: 'vendor/concatenated.js' %>
|
19
|
-
|
22
|
+
|
20
23
|
<%= script src: 'lib/app.coffee' %>
|
21
24
|
<%= template dir: 'lib/templates' %>
|
25
|
+
|
26
|
+
<%= test src: 'test/example.coffee' %>
|
22
27
|
</body>
|
23
28
|
</html>
|