machined 1.0.0 → 1.0.1
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.
- data/lib/machined/context.rb +5 -5
- data/lib/machined/environment.rb +65 -63
- data/lib/machined/helpers/asset_tag_helpers.rb +2 -2
- data/lib/machined/helpers/locals_helpers.rb +5 -5
- data/lib/machined/helpers/output_helpers.rb +3 -3
- data/lib/machined/helpers/page_helpers.rb +2 -2
- data/lib/machined/helpers/render_helpers.rb +14 -14
- data/lib/machined/index.rb +3 -3
- data/lib/machined/initializable.rb +7 -7
- data/lib/machined/processors/front_matter_processor.rb +2 -2
- data/lib/machined/processors/layout_processor.rb +11 -11
- data/lib/machined/sprocket.rb +8 -8
- data/lib/machined/static_compiler.rb +9 -9
- data/lib/machined/utils.rb +1 -1
- data/lib/machined/version.rb +1 -1
- data/spec/machined/context_spec.rb +1 -1
- data/spec/machined/environment_spec.rb +67 -52
- data/spec/machined/helpers/asset_tag_helpers_spec.rb +12 -12
- data/spec/machined/helpers/locals_helper_spec.rb +5 -5
- data/spec/machined/helpers/page_helpers_spec.rb +9 -9
- data/spec/machined/helpers/render_helpers_spec.rb +17 -17
- data/spec/machined/initializable_spec.rb +9 -9
- data/spec/machined/processors/front_matter_processor_spec.rb +4 -4
- data/spec/machined/processors/layout_processor_spec.rb +9 -9
- data/spec/machined/sprocket_spec.rb +3 -3
- data/spec/machined/static_compiler_spec.rb +25 -3
- data/spec/machined/utils_spec.rb +3 -3
- data/spec/support/be_fresh_matcher.rb +2 -2
- data/spec/support/helpers.rb +7 -7
- data/spec/support/match_paths_matcher.rb +3 -3
- metadata +3 -3
@@ -15,11 +15,11 @@ module Machined
|
|
15
15
|
path_to_asset source, options
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
# Redefine image_path to work with Sprockets::Helpers.
|
20
20
|
def image_path(source, options = {})
|
21
21
|
asset_path source, { :dir => 'images' }.merge(options)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
25
|
-
end
|
25
|
+
end
|
@@ -9,7 +9,7 @@ module Machined
|
|
9
9
|
def locals
|
10
10
|
@locals ||= ActiveSupport::HashWithIndifferentAccess.new
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
# Adds psuedo local variables from the given hash, where
|
14
14
|
# the key is the name of the variable. This is provided so
|
15
15
|
# processors can add local variables without having access
|
@@ -21,7 +21,7 @@ module Machined
|
|
21
21
|
self.locals.merge! locals
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
# Temporarily changes the locals. The given +temporary_locals+
|
26
26
|
# will be merged into the current locals. After the block is
|
27
27
|
# executed, the locals will be restored to their original state.
|
@@ -31,13 +31,13 @@ module Machined
|
|
31
31
|
ensure
|
32
32
|
@locals = old_locals
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
# Returns true if the given +name+ has been set as a local
|
36
36
|
# variable.
|
37
37
|
def has_local?(name)
|
38
38
|
locals.key? name
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def method_missing(method, *args, &block) # :nodoc:
|
42
42
|
if args.empty? && has_local?(method)
|
43
43
|
locals[method]
|
@@ -45,7 +45,7 @@ module Machined
|
|
45
45
|
super
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
def respond_to?(method) # :nodoc:
|
50
50
|
super or has_local?(method)
|
51
51
|
end
|
@@ -16,9 +16,9 @@ module Machined
|
|
16
16
|
'Tilt::ErubisTemplate' => :erubis,
|
17
17
|
'Slim::Template' => :slim
|
18
18
|
}
|
19
|
-
|
19
|
+
|
20
20
|
protected
|
21
|
-
|
21
|
+
|
22
22
|
# Attempts to return the current engine based on
|
23
23
|
# the processors for this file. This is used by
|
24
24
|
# Padrino's helpers to determine which type of template
|
@@ -33,7 +33,7 @@ module Machined
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
@current_engine
|
38
38
|
end
|
39
39
|
end
|
@@ -12,7 +12,7 @@ module Machined
|
|
12
12
|
machined.config.layout
|
13
13
|
end
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
# Returns the local variable, title, if set. Otherwise
|
17
17
|
# return a titleized version of the filename.
|
18
18
|
def title
|
@@ -22,7 +22,7 @@ module Machined
|
|
22
22
|
File.basename(logical_path).titleize
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
# Returns the URL to this asset, appending the sprocket's URL.
|
27
27
|
# For HTML files, this will return pretty URLs.
|
28
28
|
def url
|
@@ -10,7 +10,7 @@ module Machined
|
|
10
10
|
# <%= render 'ad', :collection => advertisements %>
|
11
11
|
# # is the same as:
|
12
12
|
# <%= render_collection advertisements, 'ad' %>
|
13
|
-
#
|
13
|
+
#
|
14
14
|
def render(partial, options = {})
|
15
15
|
if collection = options.delete(:collection)
|
16
16
|
render_collection collection, partial, options
|
@@ -18,7 +18,7 @@ module Machined
|
|
18
18
|
render_partial partial, options
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
# Renders the given +collection+ of objects with the given
|
23
23
|
# +partial+ template. This follows the same conventions
|
24
24
|
# of Rails' partial rendering, where the individual objects
|
@@ -33,7 +33,7 @@ module Machined
|
|
33
33
|
# template would be fed +ad_counter+.
|
34
34
|
def render_collection(collection, partial, options = {})
|
35
35
|
return if collection.nil? || collection.empty?
|
36
|
-
|
36
|
+
|
37
37
|
template = resolve_partial partial
|
38
38
|
counter = 0
|
39
39
|
collection.inject('') do |output, object|
|
@@ -41,7 +41,7 @@ module Machined
|
|
41
41
|
output << render_partial(template, options.merge(:object => object, :counter => counter))
|
42
42
|
end
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
# Renders a single +partial+. The primary options are:
|
46
46
|
#
|
47
47
|
# * <tt>:locals</tt> - A hash of local variables to use when
|
@@ -83,12 +83,12 @@ module Machined
|
|
83
83
|
def render_partial(partial, options = {})
|
84
84
|
template = resolve_partial partial
|
85
85
|
depend_on template
|
86
|
-
|
86
|
+
|
87
87
|
partial_locals = {}
|
88
|
-
|
88
|
+
|
89
89
|
# Temporarily use a different layout (default to no layout)
|
90
90
|
partial_locals[:layout] = options.delete(:layout) || false
|
91
|
-
|
91
|
+
|
92
92
|
# Add object with the name of the partial
|
93
93
|
# as the local variable name.
|
94
94
|
if object = options.delete(:object)
|
@@ -96,34 +96,34 @@ module Machined
|
|
96
96
|
partial_locals[object_name] = object
|
97
97
|
partial_locals["#{object_name}_counter"] = options.delete :counter
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
# Add locals from leftover options
|
101
101
|
if leftover_locals = options.delete(:locals) || options
|
102
102
|
partial_locals.merge! leftover_locals
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
# Now evaluate the partial
|
106
106
|
with_locals(partial_locals) { return evaluate template }
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
protected
|
110
|
-
|
110
|
+
|
111
111
|
# Attempts to find a view with the given path,
|
112
112
|
# while also looking for a version with a partial-style
|
113
113
|
# name (prefixed with an '_').
|
114
114
|
def resolve_partial(path) # :nodoc:
|
115
115
|
path = Pathname.new path
|
116
116
|
path.absolute? and return path
|
117
|
-
|
117
|
+
|
118
118
|
# First look for the normal path
|
119
119
|
machined.views.resolve(path) { |found| return found }
|
120
|
-
|
120
|
+
|
121
121
|
# Then look for the partial-style version
|
122
122
|
unless path.basename.to_s =~ /^_/
|
123
123
|
partial = path.dirname.join "_#{path.basename}"
|
124
124
|
machined.views.resolve(partial) { |found| return found }
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
raise Sprockets::FileNotFound, "couldn't find file '#{path}'"
|
128
128
|
end
|
129
129
|
end
|
data/lib/machined/index.rb
CHANGED
@@ -8,15 +8,15 @@ module Machined
|
|
8
8
|
# A reference to the Machined environment which
|
9
9
|
# created this instance.
|
10
10
|
attr_reader :machined
|
11
|
-
|
11
|
+
|
12
12
|
# A reference to the configuration.
|
13
13
|
attr_reader :config
|
14
|
-
|
14
|
+
|
15
15
|
#
|
16
16
|
def initialize(environment)
|
17
17
|
@machined = environment.machined
|
18
18
|
@config = environment.config
|
19
|
-
|
19
|
+
|
20
20
|
super
|
21
21
|
end
|
22
22
|
end
|
@@ -12,7 +12,7 @@ module Machined
|
|
12
12
|
# I don't want to `require 'rails'` if I don't have to.
|
13
13
|
module Initializable
|
14
14
|
extend ActiveSupport::Concern
|
15
|
-
|
15
|
+
|
16
16
|
class Initializer < Struct.new(:name, :block)
|
17
17
|
# Run's the initializer's +block+ with the given
|
18
18
|
# +context+ and yields the given +args+
|
@@ -21,14 +21,14 @@ module Machined
|
|
21
21
|
context.instance_exec(*args, &block)
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
module ClassMethods
|
26
26
|
# Returns an array of the initializers for
|
27
27
|
# this class.
|
28
28
|
def initializers
|
29
29
|
@initializers ||= []
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
# Creates a new initializer with the given name.
|
33
33
|
# You can optionally pace initializers before or after
|
34
34
|
# other initializers using the `:before` and `:after`
|
@@ -36,7 +36,7 @@ module Machined
|
|
36
36
|
# of the list.
|
37
37
|
def initializer(name, options = {}, &block)
|
38
38
|
initializer = Initializer.new(name, block)
|
39
|
-
|
39
|
+
|
40
40
|
if after = options[:after]
|
41
41
|
initializers.insert initializer_index(after) + 1, initializer
|
42
42
|
elsif before = options[:before]
|
@@ -45,9 +45,9 @@ module Machined
|
|
45
45
|
initializers << initializer
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
protected
|
50
|
-
|
50
|
+
|
51
51
|
# Returns the index of the initializer with
|
52
52
|
# the given name.
|
53
53
|
def initializer_index(name) # :nodoc:
|
@@ -56,7 +56,7 @@ module Machined
|
|
56
56
|
end or raise "The specified initializer, #{name.inspect}, does not exist"
|
57
57
|
end
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
# Run each initializer with the given args
|
61
61
|
# yielded to each initializer's block.
|
62
62
|
def run_initializers(*args)
|
@@ -5,14 +5,14 @@ module Machined
|
|
5
5
|
class LayoutProcessor < Tilt::Template
|
6
6
|
# A reference to the Sprockets context
|
7
7
|
attr_reader :context
|
8
|
-
|
8
|
+
|
9
9
|
# Path to the layout file
|
10
10
|
attr_reader :layout_path
|
11
|
-
|
11
|
+
|
12
12
|
# See `Tilt::Template#prepare`.
|
13
13
|
def prepare
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
# See `Tilt::Template#evaluate`.
|
17
17
|
def evaluate(context, locals, &block)
|
18
18
|
@context = context
|
@@ -23,21 +23,21 @@ module Machined
|
|
23
23
|
data
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
protected
|
28
|
-
|
28
|
+
|
29
29
|
# A reference to the Views sprocket, where the
|
30
30
|
# layout asset will be.
|
31
31
|
def views
|
32
32
|
context.machined.views
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
# Determine if we should attempt to wrap the
|
36
36
|
# content with a layout.
|
37
37
|
def layout?
|
38
38
|
context.layout != false
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
# Attempt to find the layout file in the Views
|
42
42
|
# sprocket.
|
43
43
|
def resolve_layout
|
@@ -45,14 +45,14 @@ module Machined
|
|
45
45
|
rescue Sprockets::FileNotFound, Sprockets::ContentTypeMismatch
|
46
46
|
nil
|
47
47
|
end
|
48
|
-
|
48
|
+
|
49
49
|
# Recreate `Sprockets::Context#evaluate`, because it doesn't
|
50
50
|
# support yielding. I'm not even sure it's necessary to
|
51
51
|
# support multiple processors for a layout, though.
|
52
52
|
def evaluate_layout
|
53
53
|
processors = views.attributes_for(layout_path).processors
|
54
54
|
result = Sprockets::Utils.read_unicode layout_path
|
55
|
-
|
55
|
+
|
56
56
|
processors.each do |processor|
|
57
57
|
begin
|
58
58
|
template = processor.new(layout_path.to_s) { result }
|
@@ -62,10 +62,10 @@ module Machined
|
|
62
62
|
raise
|
63
63
|
end
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
result
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
70
70
|
end
|
71
|
-
|
71
|
+
|
data/lib/machined/sprocket.rb
CHANGED
@@ -10,14 +10,14 @@ module Machined
|
|
10
10
|
:assets => false,
|
11
11
|
:compile => true
|
12
12
|
}.freeze
|
13
|
-
|
13
|
+
|
14
14
|
# A reference to the Machined environment which
|
15
15
|
# created this instance.
|
16
16
|
attr_reader :machined
|
17
|
-
|
17
|
+
|
18
18
|
# A reference to the configuration.
|
19
19
|
attr_reader :config
|
20
|
-
|
20
|
+
|
21
21
|
# Creates a new Machined sprocket. The API is
|
22
22
|
# a bit different than `Sprockets::Environment` to
|
23
23
|
# allow for per-Sprockets-environment configuration
|
@@ -25,12 +25,12 @@ module Machined
|
|
25
25
|
def initialize(machined, options = {})
|
26
26
|
@machined = machined
|
27
27
|
@config = OpenStruct.new DEFAULT_OPTIONS.dup.merge(options)
|
28
|
-
|
28
|
+
|
29
29
|
super config.root
|
30
|
-
|
30
|
+
|
31
31
|
@context_class = Class.new Context
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
34
|
# Returns true, if this sprocket should be
|
35
35
|
# compiled. Nine times out of ten, you will want
|
36
36
|
# your sprocket compiled, but sometimes - like
|
@@ -39,12 +39,12 @@ module Machined
|
|
39
39
|
def compile?
|
40
40
|
config.compile && config.url
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
# Override to use Machined's Index
|
44
44
|
def index
|
45
45
|
Index.new(self)
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
# Loops through the available Tilt templates
|
49
49
|
# and registers them as processor engines for
|
50
50
|
# Sprockets. By default, Sprockets cherry picks
|
@@ -5,13 +5,13 @@ module Machined
|
|
5
5
|
# A reference to the Machined environment which
|
6
6
|
# created this instance.
|
7
7
|
attr_reader :machined
|
8
|
-
|
8
|
+
|
9
9
|
# Creates a new instance, which will compile
|
10
10
|
# the assets to the given +output_path+.
|
11
11
|
def initialize(machined)
|
12
12
|
@machined = machined
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
# Loop through and compile each available
|
16
16
|
# asset to the appropriate output path.
|
17
17
|
def compile
|
@@ -21,7 +21,7 @@ module Machined
|
|
21
21
|
sprocket.each_logical_path do |logical_path|
|
22
22
|
url = File.join(sprocket.config.url, logical_path)
|
23
23
|
next unless compiled_assets[url].nil? && compile?(url)
|
24
|
-
|
24
|
+
|
25
25
|
if asset = sprocket.find_asset(logical_path)
|
26
26
|
compiled_assets[url] = write_asset(sprocket, asset)
|
27
27
|
end
|
@@ -29,14 +29,14 @@ module Machined
|
|
29
29
|
end
|
30
30
|
compiled_assets
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
# Determines if we should precompile the asset
|
34
34
|
# with the given url. By default, we skip over any
|
35
35
|
# files that begin with '_', like partials.
|
36
36
|
def compile?(url)
|
37
37
|
File.basename(url) !~ /^_/
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
# Writes the asset to its destination, also
|
41
41
|
# writing a gzipped version if necessary.
|
42
42
|
def write_asset(environment, asset)
|
@@ -46,9 +46,9 @@ module Machined
|
|
46
46
|
asset.write_to "#{filename}.gz" if gzip?(filename)
|
47
47
|
asset.digest
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
protected
|
51
|
-
|
51
|
+
|
52
52
|
# Gets the full output path for the given asset.
|
53
53
|
# If it's supposed to include a digest, it will return the
|
54
54
|
# digest_path.
|
@@ -56,13 +56,13 @@ module Machined
|
|
56
56
|
path = digest?(environment, asset) ? asset.digest_path : asset.logical_path
|
57
57
|
File.join(machined.output_path, environment.config.url, path)
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
# Determines if we should use the digest_path for the given
|
61
61
|
# asset.
|
62
62
|
def digest?(environment, asset) # :nodoc:
|
63
63
|
machined.config.digest_assets && environment.config.assets
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
# Determines if we should gzip the asset.
|
67
67
|
def gzip?(filename) # :nodoc:
|
68
68
|
machined.config.gzip_assets && filename =~ /\.(css|js)$/
|