pyro 0.9.0 → 1.0.0.rc1
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/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>
|