pyro 1.0.0.rc1 → 1.0.0.rc2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bbd5afb69830d1640ab6d13d5078558c27311a3b
4
- data.tar.gz: a944401a77fe94e767c5c8636e03cc2188b94bef
3
+ metadata.gz: 3605f85bb1db89f79e9093f4ff9eddd161adf9a8
4
+ data.tar.gz: 7a1fcbfa600aa8236315db0370fef4979d7877d0
5
5
  SHA512:
6
- metadata.gz: c4bd3c62c7502fa6c39c75beb7ca04df27a530f71b7174f3de2b39942f03dacb1b5ae618b226fe785327f1961c18041dba77086dd14fb25e8e8248591e360c6f
7
- data.tar.gz: 3efd9c17314c130e00e106091f56fd4afb683af843e9c9def9a19c234e207c6cea116ac5f27c21ca255a69910741ac51f28f72db241cdd28fa6928572cfd93ac
6
+ metadata.gz: bf23270974d0d3bcc194db597cfc33d267b90d6e30ef743b3e5e0f3bac0663f0eb73e85bafc2b2ee55506b2db9d8ffdbf84c661dcb2959b1416df550b815acc4
7
+ data.tar.gz: f578bf58b1a9af2217ec9c120fea1cb7b3b3e3b8a113f7e0ac8ffe40d086d9d977a963512bbf79635259bdb95c3d9957350cfa84c7eb197b2a72612eef2170c2
data/bin/pyro CHANGED
@@ -3,22 +3,59 @@
3
3
  require 'thor'
4
4
  require 'pyro'
5
5
 
6
+ # Public: CLI commands for Pyro.
7
+ #
8
+ # Examples
9
+ #
10
+ # ~/Projects $ pyro new MyApp
6
11
  class PyroCLI < Thor
7
12
 
13
+ # Public: Create a new Pyro app.
14
+ #
15
+ # name - The name of the new app.
16
+ #
17
+ # Examples
18
+ #
19
+ # ~/Projects $ pyro new MyApp
20
+ #
21
+ # Generates a new app into /MyApp.
8
22
  desc 'new NAME', 'Creats a new app'
9
23
  def new(name)
10
24
  FileUtils.cp_r("#{File.dirname(__FILE__)}/../templates/app", name)
11
25
  end
12
26
 
27
+ # Public: Create a new build of a Pyro app for production.
28
+ #
29
+ # * Production builds use prod_src/prod_dir, skip tests, and are minified.
30
+ #
31
+ # dir - The directory of the app to burn. Defaults to the current directory.
32
+ #
33
+ # Examples
34
+ #
35
+ # ~/Projects/MyApp $ pyro burn
36
+ # ~/Projects $ pyro burn MyApp # Burns the MyApp folder.
37
+ #
38
+ # Generates a production build of the app into /pkg/<timestamp>.
13
39
  desc 'burn DIR', 'Builds an app for production'
14
40
  def burn(dir = '.')
15
41
  Pyro.burn('production', false, dir)
16
42
  end
17
43
 
44
+ # Public: Create a development build in /tmp and runs it on localhost:7976.
45
+ #
46
+ # * /tmp gets rebuilt on each refresh.
47
+ #
48
+ # --fast - Doesn't rebuild /assets.
49
+ # --test - Builds with the test helpers.
50
+ #
51
+ # Examples
52
+ #
53
+ # ~/Projects/MyApp $ pyro serve
54
+ #
55
+ # Runs the development build on localhost:7976.
18
56
  desc 'serve', 'Starts a Pyro app on localhost,
19
57
  --fast skips asset reloading,
20
58
  --test includes tests'
21
-
22
59
  option :fast
23
60
  option :test
24
61
  def serve
@@ -35,6 +72,19 @@ class PyroCLI < Thor
35
72
  PyroServer.run!
36
73
  end
37
74
 
75
+ # Public: Run a production build on localhost:7976.
76
+ #
77
+ # build - The name (timestamp) of the build to run, from /pkg.
78
+ #
79
+ # * If no build is specified, the latest is used.
80
+ # * If no build exists, a new one is generated.
81
+ #
82
+ # Examples
83
+ #
84
+ # ~/Projects/MyApp $ pyro stage
85
+ # ~/Projects/MyApp $ pyro stage <timestamp>
86
+ #
87
+ # Runs the production build on localhost:7976.
38
88
  desc 'stage BUILD', 'Stages a Pyro build on localhost'
39
89
  def stage(build_num = false)
40
90
  if build_num
@@ -45,7 +95,7 @@ class PyroCLI < Thor
45
95
  end
46
96
 
47
97
  unless Dir.exists? build_dir
48
- puts "That build doesn't exist. Try running 'pyro burn' to create a build."
98
+ puts "That build doesn't exist. Run 'pyro burn' to create a build."
49
99
  exit
50
100
  end
51
101
 
@@ -57,4 +107,9 @@ class PyroCLI < Thor
57
107
 
58
108
  end
59
109
 
110
+ # Public: Start the PyroCLI.
111
+ #
112
+ # Examples
113
+ #
114
+ # ~ $ pyro
60
115
  PyroCLI.start(ARGV)
@@ -1,9 +1,26 @@
1
1
  require 'fileutils'
2
2
  require 'pyro/assets'
3
3
 
4
+ # Public: Main script for running Pyro.
5
+ #
6
+ # Examples
7
+ #
8
+ # Pyro.burn('development', true)
4
9
  module Pyro
5
10
  include Pyro::Assets
6
11
 
12
+ # Public: Burn a build of an app.
13
+ #
14
+ # target - 'development' or 'production' determines compression
15
+ # and output directory.
16
+ # fast - Boolean to run the server faster (skips rebuilding resources).
17
+ # working_dir - Path to the app.
18
+ #
19
+ # Examples
20
+ #
21
+ # Pyro.burn('development', true)
22
+ #
23
+ # Generates a built app.
7
24
  def self.burn(target = 'production', fast = false, working_dir = '.')
8
25
  @target = target
9
26
  @timestamp = Time.now.strftime "%Y%m%d%H%M%S"
@@ -3,42 +3,95 @@ require 'coffee-script'
3
3
  require 'fileutils'
4
4
  require 'sass'
5
5
 
6
+ # Public: Define an Asset.
7
+ #
8
+ # Examples
9
+ #
10
+ # Asset.new(file: "#{@working_dir}/#{args[:src]}",
11
+ # build_dir: @build_dir,
12
+ # working_dir: @working_dir,
13
+ # helper_args: args)
6
14
  module Pyro
7
15
  class Asset
8
16
  attr_accessor :file, :build_dir, :working_dir, :helper_args
9
17
 
18
+ # Public: Set args to attrs on new().
19
+ #
20
+ # Examples
21
+ #
22
+ # Asset.new(file: "#{@working_dir}/#{args[:src]}",
23
+ # build_dir: @build_dir,
24
+ # working_dir: @working_dir,
25
+ # helper_args: args)
26
+ #
27
+ # Returns an Asset instance.
10
28
  def initialize(args)
11
29
  args.each { |k, v| instance_variable_set("@#{k}", v) }
12
30
  end
13
31
 
32
+ # Public: Map File methods to an Asset.
33
+ #
34
+ # * Maybe Asset should inheret from File?
35
+ #
36
+ # Examples
37
+ #
38
+ # @asset.mtime
39
+ #
40
+ # * See the File class for more info.
14
41
  def mtime
15
42
  File.mtime file
16
43
  end
17
-
18
44
  def basename
19
45
  File.basename file
20
46
  end
21
-
22
47
  def dirname
23
48
  File.dirname file
24
49
  end
25
-
26
50
  def extname
27
51
  File.extname file
28
52
  end
29
53
 
54
+ # Public: Strip the extension from the basename.
55
+ #
56
+ # Examples
57
+ #
58
+ # @asset.name
59
+ #
60
+ # Retunrs a String of the basename without the extension.
61
+ # ('my_file.rb' -> 'myfile')
30
62
  def name
31
63
  basename.sub(extname, '')
32
64
  end
33
65
 
66
+ # Public: Format the mtime as a timestamp String.
67
+ #
68
+ # Examples
69
+ #
70
+ # @asset.timestamp
71
+ #
72
+ # Returns a String.
34
73
  def timestamp
35
74
  mtime.strftime "%Y%m%d%H%M%S"
36
75
  end
37
76
 
77
+ # Public: Find the relative target path of an Asset.
78
+ #
79
+ # Examples
80
+ #
81
+ # @asset.relative_dir
82
+ #
83
+ # Returns a path as a String.
38
84
  def relative_dir
39
85
  dirname.sub("#{working_dir}/", '')
40
86
  end
41
87
 
88
+ # Public: Find the relative target file path of an Asset.
89
+ #
90
+ # Examples
91
+ #
92
+ # @asset.relative_file
93
+ #
94
+ # Returns a filepath as a String.
42
95
  def relative_file
43
96
  if helper_args[:target]
44
97
  helper_args[:target]
@@ -47,6 +100,13 @@ module Pyro
47
100
  end
48
101
  end
49
102
 
103
+ # Public: Determine the target extension of an Asset.
104
+ #
105
+ # Examples
106
+ #
107
+ # @asset.compiled_ext
108
+ #
109
+ # Returns a String.
50
110
  def compiled_ext
51
111
  case extname
52
112
  when '.coffee', '.hbs', '.handlebars'
@@ -58,6 +118,13 @@ module Pyro
58
118
  end
59
119
  end
60
120
 
121
+ # Public: Compile the contents of an Asset.
122
+ #
123
+ # Examples
124
+ #
125
+ # @asset.contents
126
+ #
127
+ # Returns the compiled contents.
61
128
  def contents
62
129
  contents = File.read file
63
130
  case extname
@@ -72,6 +139,15 @@ module Pyro
72
139
  contents
73
140
  end
74
141
 
142
+ # Public: Find the name to use for a Handlebars template.
143
+ #
144
+ # * Use the name: arg in the template() helper to override the default.
145
+ #
146
+ # Examples
147
+ #
148
+ # @asset.template_name
149
+ #
150
+ # Returns the relative template path and filename unless told otherwise.
75
151
  def template_name
76
152
  if helper_args[:name]
77
153
  helper_args[:name]
@@ -84,11 +160,25 @@ module Pyro
84
160
  end
85
161
  end
86
162
 
163
+ # Public: Generate a compiled Asset.
164
+ #
165
+ # Examples
166
+ #
167
+ # @asset.generate_file
168
+ #
169
+ # Generates a compiled Asset file into a target file.
87
170
  def generate_file
88
171
  FileUtils.mkdir_p "#{build_dir}/#{relative_dir}"
89
172
  File.open("#{build_dir}/#{relative_file}", 'a+') { |f| f.write contents }
90
173
  end
91
174
 
175
+ # Public: Generate link to a generated Asset.
176
+ #
177
+ # Examples
178
+ #
179
+ # @asset.generate_link
180
+ #
181
+ # Retunrs a <script> or <link> tag.
92
182
  def generate_link
93
183
  case compiled_ext
94
184
  when '.js'
@@ -3,6 +3,11 @@ require 'jsmin'
3
3
  require 'sass'
4
4
  require 'pyro/asset'
5
5
 
6
+ # Public: Manage Assets.
7
+ #
8
+ # Examples
9
+ #
10
+ # Pyro::Assets.compress('./tmp/public')
6
11
  module Pyro
7
12
  module Assets
8
13
  def self.included(base)
@@ -11,16 +16,45 @@ module Pyro
11
16
 
12
17
  module ClassMethods
13
18
 
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') }
17
-
19
+ # Public: Helpers for index.erb.
20
+ #
21
+ # src - Path to source file.
22
+ # dir - Path to directory of source files.
23
+ # prod_src - Path to production version of source file.
24
+ # prod_dir - Path to directory of production versions of source files.
25
+ # target - Path to output file (defaults to build path + source path).
26
+ # name - String to name a Handlebars template.
27
+ #
28
+ # Examples
29
+ #
30
+ # <%= script src: '/lib/app.coffee' %>
31
+ #
32
+ # Returns an asset tag (<script> or <link>).
33
+ def script(*args)
34
+ build(args.first, 'js, coffee')
35
+ end
36
+ def stylesheet(*args)
37
+ build(args.first, 'css, scss')
38
+ end
39
+ def template(*args)
40
+ build(args.first, 'hbs, handlebars')
41
+ end
18
42
  def test(*args)
19
43
  build(args.first, 'js, coffee, css, scss') if @target == 'test'
20
44
  end
21
45
 
22
46
  private
23
47
 
48
+ # Private: Find and compile assets.
49
+ #
50
+ # args - Args.first from the helpers.
51
+ # src_ext - The source file extensions filter by.
52
+ #
53
+ # Examples
54
+ #
55
+ # build(args.first, 'css, scss')
56
+ #
57
+ # Returns an asset tag (<script> or <link>).
24
58
  def build(args, src_ext)
25
59
  tags = ''
26
60
  find_assets(args, src_ext).each do |asset|
@@ -34,6 +68,16 @@ module Pyro
34
68
  tags
35
69
  end
36
70
 
71
+ # Private: Find assets.
72
+ #
73
+ # args - Args from build().
74
+ # exts - The source file extensions filter by.
75
+ #
76
+ # Examples
77
+ #
78
+ # find_assets(args, src_ext)
79
+ #
80
+ # Returns an Array of Asset instances.
37
81
  def find_assets(args, exts)
38
82
  if @target == 'production'
39
83
  args[:src] = args[:prod_src] if args[:prod_src]
@@ -47,8 +91,8 @@ module Pyro
47
91
  working_dir: @working_dir,
48
92
  helper_args: args)
49
93
  elsif args[:dir]
50
- Dir.glob("#{@working_dir}/#{args[:dir]}/**/*.{#{exts}}").each do |file|
51
- assets << Asset.new(file: file,
94
+ Dir.glob("#{@working_dir}/#{args[:dir]}/**/*.{#{exts}}").each do |f|
95
+ assets << Asset.new(file: f,
52
96
  build_dir: @build_dir,
53
97
  working_dir: @working_dir,
54
98
  helper_args: args)
@@ -57,6 +101,15 @@ module Pyro
57
101
  assets
58
102
  end
59
103
 
104
+ # Private: Compress all assets in a directory.
105
+ #
106
+ # dir - Path of directory to compress.
107
+ #
108
+ # Examples
109
+ #
110
+ # Pyro::Assets.compress('./tmp/lib')
111
+ #
112
+ # Asset files are overwritten with their own compressed contents.
60
113
  def compress(dir)
61
114
  Dir.glob("#{dir}/**/*.js").each do |file|
62
115
  contents = File.read(file)
@@ -2,15 +2,21 @@ require 'pyro'
2
2
  require 'sinatra/base'
3
3
  require 'erb'
4
4
 
5
+ # Public: Run a Pyro app on a Sinatra server.
6
+ #
7
+ # Examples
8
+ #
9
+ # ~/MyApp $ pyro serve
5
10
  class PyroServer < Sinatra::Base
6
11
  include Pyro
7
12
 
8
- set :fast_build, false
13
+ set :fast_build, false # true to skip reloading resources.
9
14
  set :port, 7976
10
- set :public_folder, './tmp'
11
- set :staging, false
12
- set :target, 'development'
15
+ set :public_folder, './tmp' # Override for staging builds.
16
+ set :staging, false # true to skip hot-rebuilding.
17
+ set :target, 'development' # 'test' to use test helpers.
13
18
 
19
+ # Public: Burn an app and response with the built index.html.
14
20
  get '/?' do
15
21
  unless settings.staging
16
22
  Pyro.burn(settings.target, settings.fast_build)
@@ -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 = "1.0.0.rc1"
7
+ gem.version = "1.0.0.rc2"
8
8
  gem.authors = "Jarrod Taylor"
9
9
  gem.email = "jarrodtaylor@icloud.com"
10
10
  gem.homepage = "https://github.com/jarrodtaylor/pyro"
@@ -6,6 +6,7 @@
6
6
  <%= stylesheet src: 'resources/stylesheets/normalize.css' %>
7
7
  <%= stylesheet src: 'resources/stylesheets/style.scss' %>
8
8
 
9
+ <%= test src: 'vendor/qunit/qunit.js' %>
9
10
  <%= test src: 'vendor/qunit/qunit.css' %>
10
11
  </head>
11
12
  <body>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pyro
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc1
4
+ version: 1.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jarrod Taylor
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-03 00:00:00.000000000 Z
11
+ date: 2013-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: barber