usmu 0.3.0-java → 0.3.1-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/CHANGELOG.md +10 -0
- data/README.md +1 -1
- data/lib/usmu.rb +1 -0
- data/lib/usmu/configuration.rb +27 -6
- data/lib/usmu/plugin.rb +27 -14
- data/lib/usmu/plugin/core.rb +32 -9
- data/lib/usmu/plugin/core_hooks.rb +14 -0
- data/lib/usmu/site_generator.rb +19 -11
- data/lib/usmu/template/helpers.rb +15 -3
- data/lib/usmu/template/include.rb +3 -1
- data/lib/usmu/template/layout.rb +4 -1
- data/lib/usmu/ui/console.rb +21 -10
- data/lib/usmu/version.rb +1 -1
- data/test/spec/configuration_spec.rb +15 -0
- data/usmu-jruby.gemspec +1 -0
- metadata +16 -2
- data/cucumber.yml +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a888701c3dbd80a413ffd6561ee7055eab9af8bf
|
4
|
+
data.tar.gz: e86a3100c2b95c4f095597c12b302eee60e61352
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52339956d3289da81568b93b97895108dfb08fbde2bbc1a53fdc55a1b93b62a7d76827095ebbc5cdcaf8ef9c7eb275b975c05e2eab9301dbc36289abe72ad0ee
|
7
|
+
data.tar.gz: bfee2b4b896e7d1dd990beb33eb0c76c9e80647f29e4cb6cbc9afee036a6aff166b7a1ce3f57e83d4c304a0086fec0c9cad2b294fd29fb9423ca776170be8279
|
data/.yardopts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
--private --protected --
|
1
|
+
--private --protected --default-return void -m markdown -M redcarpet -- lib/**/*.rb - README.md CHANGELOG.md
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Usmu Change Log
|
2
2
|
|
3
|
+
## 0.3.1
|
4
|
+
|
5
|
+
Matthew Scharley <matt.scharley@gmail.com>
|
6
|
+
|
7
|
+
* Add gemnasium badge (9449a8e605a3176a5e43d289cf7c0da9f38aa5ea)
|
8
|
+
* Add a bunch of documentation (c1eca0f79f7beecaf945237a425f8963846e83a3)
|
9
|
+
* Fix a few issues from cane (bae78ee394af4fc86d71d8754434a8c6f04100e7)
|
10
|
+
* Small fixups for the build scripts (d14b0b2822c704103896f7b462640709704f04b7)
|
11
|
+
* Allow Configuration to be indexed with a full path safely (110965b9058970ba82ee36bf4bc491e110996ad4)
|
12
|
+
|
3
13
|
## 0.3.0
|
4
14
|
|
5
15
|
Matthew Scharley <matt.scharley@gmail.com>
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# usmu [![Build Status](https://travis-ci.org/usmu/usmu.svg?branch=master)](https://travis-ci.org/usmu/usmu)
|
1
|
+
# usmu [![Build Status](https://travis-ci.org/usmu/usmu.svg?branch=master)](https://travis-ci.org/usmu/usmu) [![Dependency Status](https://gemnasium.com/usmu/usmu.svg)](https://gemnasium.com/usmu/usmu)
|
2
2
|
|
3
3
|
**Source:** [https://github.com/usmu/usmu](https://github.com/usmu/usmu)
|
4
4
|
**Author:** Matthew Scharley
|
data/lib/usmu.rb
CHANGED
data/lib/usmu/configuration.rb
CHANGED
@@ -76,11 +76,33 @@ module Usmu
|
|
76
76
|
# working directory to the configuration file and other factors. The accessor functions such as `#source_path`
|
77
77
|
# should be preferred for most usages.
|
78
78
|
#
|
79
|
-
# @param [String, Symbol]
|
80
|
-
#
|
81
|
-
#
|
82
|
-
|
83
|
-
|
79
|
+
# @param [String, Symbol] indices
|
80
|
+
# A list of indices to use to find the value to return. Can also include an options hash with the
|
81
|
+
# following options:
|
82
|
+
#
|
83
|
+
# * `:default`: Sets the default value if the value can't be found.
|
84
|
+
#
|
85
|
+
# @return [Array, Hash, String, Symbol]
|
86
|
+
# Returns a value from the hash loaded from YAML. The type of value will ultimately depend on the configuration
|
87
|
+
# file and the indices provided.
|
88
|
+
def [](*indices)
|
89
|
+
if indices[-1].class.name == 'Hash'
|
90
|
+
opts = indices.pop
|
91
|
+
else
|
92
|
+
opts = {}
|
93
|
+
end
|
94
|
+
|
95
|
+
value = @config
|
96
|
+
while indices.length > 0
|
97
|
+
i = indices.shift
|
98
|
+
if value.key? i
|
99
|
+
value = value[i]
|
100
|
+
else
|
101
|
+
return opts[:default]
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
value
|
84
106
|
end
|
85
107
|
|
86
108
|
private
|
@@ -123,7 +145,6 @@ module Usmu
|
|
123
145
|
# Helper function to search a directory recursively and return a list of files that are renderable.
|
124
146
|
#
|
125
147
|
# @param [String] directory the directory to search
|
126
|
-
# @param [Boolean] layout is this directory a layouts_path
|
127
148
|
# @return [Array<Usmu::Layout>, Array<Usmu::StaticFile>] Either an array of Layouts or StaticFiles in the directory
|
128
149
|
def get_files(directory)
|
129
150
|
Dir["#{directory}/**/{*,.??*}"].
|
data/lib/usmu/plugin.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
|
2
2
|
module Usmu
|
3
|
+
# Singletonish class to load plugins and act as an interface to them. Shouldn't be created directly.
|
4
|
+
# @see Usmu.plugins
|
3
5
|
class Plugin
|
6
|
+
# Constructor for the plugin interface.
|
4
7
|
def initialize
|
5
8
|
@log = Logging.logger['Usmu::Plugin']
|
6
9
|
end
|
@@ -9,24 +12,12 @@ module Usmu
|
|
9
12
|
# with the string 'usmu-' will be recognised as a plugin. This will load the gem according to the RubyGems
|
10
13
|
# recommendations for naming schemes. A gem named `usmu-s3_uploader` will be loaded by requiring the path
|
11
14
|
# `'usmu/s3_uploader'` and then then the class `Usmu::S3Uploader` will be instantiated as the plugins interface.
|
12
|
-
#
|
13
|
-
# @return [void]
|
14
15
|
def load_plugins
|
15
|
-
loaded = []
|
16
|
+
@loaded = []
|
16
17
|
@log.debug('Loading plugins')
|
17
18
|
@log.debug('Loaded Usmu::Plugin::Core')
|
18
19
|
plugins.push Usmu::Plugin::Core.new
|
19
|
-
Gem::Specification.find_all { |s| s.name =~ /^usmu-/ }.each
|
20
|
-
load_path = spec.name.gsub('-', '/')
|
21
|
-
require load_path
|
22
|
-
|
23
|
-
unless loaded.include? load_path
|
24
|
-
loaded << load_path
|
25
|
-
klass = load_path.split('/').map {|s| s.split('_').map(&:capitalize).join }.join('::')
|
26
|
-
@log.debug("Loading plugin #{klass} from '#{load_path}'")
|
27
|
-
plugins.push plugin_get(klass)
|
28
|
-
end
|
29
|
-
end
|
20
|
+
Gem::Specification.find_all { |s| s.name =~ /^usmu-/ }.each &method(:load_gem)
|
30
21
|
@log.debug("Loaded: #{plugins.inspect}")
|
31
22
|
end
|
32
23
|
|
@@ -38,9 +29,11 @@ module Usmu
|
|
38
29
|
|
39
30
|
# Call all plugins and collate any data returned. nil can be returned explicitly to say this plugin has nothing to
|
40
31
|
# return.
|
32
|
+
#
|
41
33
|
# @param [Symbol] method The name of the method to call. This should be namespaced somehow. For example, a plugin
|
42
34
|
# called `usmu-s3` could use the method namespace `s3` and have a hook called `:s3_upload`
|
43
35
|
# @param [Array] args The arguments to pass through to plugins. Can be empty.
|
36
|
+
# @return [Array] An array of non-nil values returned from plugins
|
44
37
|
def invoke(method, *args)
|
45
38
|
@log.debug("Invoking plugin API #{method}")
|
46
39
|
plugins.map do |p|
|
@@ -55,11 +48,31 @@ module Usmu
|
|
55
48
|
|
56
49
|
private
|
57
50
|
|
51
|
+
# Helper function to load and instantiate plugin classes
|
52
|
+
#
|
53
|
+
# @param [String] klass The name of the class to load
|
54
|
+
# @return [Object] A plugin object
|
58
55
|
def plugin_get(klass)
|
59
56
|
object.const_get(klass).new
|
60
57
|
rescue NameError
|
61
58
|
# Ruby 1.9.3, dowp
|
62
59
|
klass.split('::').reduce(Object) {|memo, o| memo.const_get o }.new
|
63
60
|
end
|
61
|
+
|
62
|
+
# Helper function to load a plugin from a gem specification
|
63
|
+
#
|
64
|
+
# @param [Gem::Specification] spec
|
65
|
+
def load_gem(spec)
|
66
|
+
load_path = spec.name.gsub('-', '/')
|
67
|
+
require load_path
|
68
|
+
|
69
|
+
unless @loaded.include? load_path
|
70
|
+
@loaded << load_path
|
71
|
+
klass = load_path.split('/').map {|s| s.split('_').map(&:capitalize).join }.join('::')
|
72
|
+
@log.debug("Loading plugin #{klass} from '#{load_path}'")
|
73
|
+
plugins.push plugin_get(klass)
|
74
|
+
end
|
75
|
+
nil
|
76
|
+
end
|
64
77
|
end
|
65
78
|
end
|
data/lib/usmu/plugin/core.rb
CHANGED
@@ -2,11 +2,18 @@ require 'fileutils'
|
|
2
2
|
|
3
3
|
module Usmu
|
4
4
|
class Plugin
|
5
|
+
# Usmu Core's plugin. We dog-food several plugin integration points.
|
5
6
|
class Core
|
7
|
+
# Basic constructor.
|
6
8
|
def initialize
|
7
9
|
@log = Logging.logger[self]
|
8
10
|
end
|
9
11
|
|
12
|
+
# We add two commands: `generate` and `init [path]`.
|
13
|
+
#
|
14
|
+
# @see #command_generate
|
15
|
+
# @see #command_init
|
16
|
+
# @see Usmu::Plugin::CoreHooks#commands
|
10
17
|
def commands(ui, c)
|
11
18
|
@log.debug('Adding core console commands...')
|
12
19
|
@ui = ui
|
@@ -23,12 +30,19 @@ module Usmu
|
|
23
30
|
end
|
24
31
|
end
|
25
32
|
|
26
|
-
#
|
33
|
+
# Command to generate a website.
|
34
|
+
#
|
35
|
+
# @param [Array<String>] args arguments passed by the user.
|
36
|
+
# @param [Hash] options options parsed by Commander
|
27
37
|
def command_generate(args, options)
|
28
38
|
@site_generator = Usmu::SiteGenerator.new(@ui.configuration)
|
29
39
|
@site_generator.generate
|
30
40
|
end
|
31
41
|
|
42
|
+
# Command to initialise a new website.
|
43
|
+
#
|
44
|
+
# @param [Array<String>] args arguments passed by the user.
|
45
|
+
# @param [Hash] options options parsed by Commander
|
32
46
|
def command_init(args, options)
|
33
47
|
@log.info("Usmu v#{Usmu::VERSION}")
|
34
48
|
@log.info('')
|
@@ -42,14 +56,23 @@ module Usmu
|
|
42
56
|
from = File.realpath(File.join(File.dirname(__FILE__), '../../../share/init-site'))
|
43
57
|
|
44
58
|
@log.info("Copying #{from} -> #{path}")
|
45
|
-
Dir["#{from}/**/{*,.??*}"].each
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
59
|
+
Dir["#{from}/**/{*,.??*}"].each {|f| init_copy_file(from, path, f) }
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# Helper to copy a file.
|
65
|
+
#
|
66
|
+
# @param [String] from
|
67
|
+
# @param [String] to
|
68
|
+
# @param [String] file
|
69
|
+
def init_copy_file(from, to, file)
|
70
|
+
output_name = file[(from.length + 1)..file.length]
|
71
|
+
@log.success "Creating #{output_name}..."
|
72
|
+
unless File.directory? file
|
73
|
+
output_path = "#{to}/#{output_name}"
|
74
|
+
FileUtils.mkdir_p File.dirname(output_path) unless File.directory? File.dirname(output_path)
|
75
|
+
FileUtils.copy(file, output_path)
|
53
76
|
end
|
54
77
|
end
|
55
78
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module Usmu
|
3
|
+
class Plugin
|
4
|
+
# This class describes all the hooks available from Usmu Core.
|
5
|
+
# @api hooks
|
6
|
+
class CoreHooks
|
7
|
+
# Hook to allow adding commands to the console UI.
|
8
|
+
#
|
9
|
+
# @param [Usmu::Ui::Console] ui The UI instance for this session.
|
10
|
+
# @param [Commander::Runner] c The Commander instance to add commands to.
|
11
|
+
def commands(ui, c); end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/usmu/site_generator.rb
CHANGED
@@ -58,20 +58,28 @@ module Usmu
|
|
58
58
|
@log.info("Destination: #{@configuration.destination_path}")
|
59
59
|
@log.info('')
|
60
60
|
|
61
|
-
renderables.each
|
62
|
-
|
63
|
-
|
64
|
-
file = File.join(@configuration.destination_path, page.output_filename)
|
65
|
-
directory = File.dirname(file)
|
61
|
+
renderables.each &method(:generate_page)
|
62
|
+
nil
|
63
|
+
end
|
66
64
|
|
67
|
-
|
68
|
-
FileUtils.mkdir_p(directory)
|
69
|
-
end
|
65
|
+
private
|
70
66
|
|
71
|
-
|
72
|
-
|
67
|
+
# Helper function to generate a page
|
68
|
+
#
|
69
|
+
# @param [Usmu::Template::Page] page
|
70
|
+
def generate_page(page)
|
71
|
+
output_filename = page.output_filename
|
72
|
+
@log.success("creating #{output_filename}...")
|
73
|
+
@log.debug("Rendering #{output_filename} from #{page.name}")
|
74
|
+
file = File.join(@configuration.destination_path, output_filename)
|
75
|
+
directory = File.dirname(file)
|
76
|
+
|
77
|
+
unless File.directory?(directory)
|
78
|
+
FileUtils.mkdir_p(directory)
|
73
79
|
end
|
74
|
-
|
80
|
+
|
81
|
+
File.write file, page.render
|
82
|
+
FileUtils.touch file, :mtime => File.stat(page.input_path).mtime
|
75
83
|
end
|
76
84
|
end
|
77
85
|
end
|
@@ -1,14 +1,26 @@
|
|
1
|
-
# We really should include this, but it causes an include loop and Include has a strict dependency on Layout due to
|
2
|
-
# the inheritance structure. Oh well. Perhaps I'll think of something later.
|
3
|
-
#require 'usmu/template/include'
|
4
1
|
|
5
2
|
module Usmu
|
3
|
+
# This module is a namespace for all the different types of templates in use by Usmu. It has no functionality
|
4
|
+
# attached to it directly.
|
6
5
|
module Template
|
6
|
+
# Helper functions that get imported into the local scope of templates
|
7
7
|
class Helpers
|
8
|
+
# Create a new Helpers instance. These are created on demand as needed by templates, there is not a singleton
|
9
|
+
# instance.
|
8
10
|
def initialize(configuration)
|
9
11
|
@configuration = configuration
|
10
12
|
end
|
11
13
|
|
14
|
+
# Finds and renders a named include.
|
15
|
+
#
|
16
|
+
# @param [String] name
|
17
|
+
# The name of the include file. Should not include file extension.
|
18
|
+
# @param [Hash] args
|
19
|
+
# The named arguments to provide to the include file. These are incorporated as additional
|
20
|
+
# metadata available to the include file.
|
21
|
+
# @return [String] The rendered file.
|
22
|
+
#
|
23
|
+
# @api template_helpers
|
12
24
|
def include(name, args = {})
|
13
25
|
inc = Usmu::Template::Include.find_include(@configuration, name)
|
14
26
|
inc.arguments = args
|
@@ -7,6 +7,8 @@ module Usmu
|
|
7
7
|
|
8
8
|
private
|
9
9
|
|
10
|
+
# Preserved version of the layout metadata logic
|
11
|
+
# @see Usmu::Template::Layout#metadata
|
10
12
|
alias :layout_metadata :metadata
|
11
13
|
|
12
14
|
public
|
@@ -79,7 +81,7 @@ module Usmu
|
|
79
81
|
arguments.each do |i, value|
|
80
82
|
args[i.class.name == 'String' ? i : i.to_s] = value
|
81
83
|
end
|
82
|
-
|
84
|
+
|
83
85
|
{'site' => @configuration}.deep_merge!(metadata).deep_merge!(args).deep_merge!(variables)
|
84
86
|
end
|
85
87
|
end
|
data/lib/usmu/template/layout.rb
CHANGED
@@ -142,7 +142,10 @@ module Usmu
|
|
142
142
|
@layout_history = @layout_history || {}
|
143
143
|
@layout_history[configuration] = @layout_history[configuration] || {}
|
144
144
|
if @layout_history[configuration][name]
|
145
|
-
Logging.logger[self].debug(
|
145
|
+
Logging.logger[self].debug(
|
146
|
+
'Layout loop detected. Current loaded layouts: ' +
|
147
|
+
@layout_history[configuration].inspect
|
148
|
+
)
|
146
149
|
return nil
|
147
150
|
else
|
148
151
|
Logging.logger[self].debug("Loading layout '#{name}'")
|
data/lib/usmu/ui/console.rb
CHANGED
@@ -17,18 +17,10 @@ module Usmu
|
|
17
17
|
@configuration || load_configuration('usmu.yml')
|
18
18
|
end
|
19
19
|
|
20
|
+
# @param [Array<String>] args Command line arguments, ie. ARGV.
|
20
21
|
def initialize(args)
|
21
22
|
@log = Logging.logger[self]
|
22
|
-
@commander =
|
23
|
-
|
24
|
-
@commander.program :version, Usmu::VERSION
|
25
|
-
@commander.program :description, 'Static site generator powered by Tilt'
|
26
|
-
@commander.program :int_message, 'Interrupt received, closing...'
|
27
|
-
|
28
|
-
@commander.global_option('-v', '--verbose') { Usmu.verbose_logging }
|
29
|
-
@commander.global_option('-q', '--quiet') { Usmu.quiet_logging }
|
30
|
-
@commander.global_option('--log STRING', String) {|log| Usmu.add_file_logger(log) }
|
31
|
-
@commander.global_option('--config STRING', String, &method(:load_configuration))
|
23
|
+
@commander = initialize_commander(args)
|
32
24
|
|
33
25
|
Usmu.plugins.load_plugins
|
34
26
|
Usmu.plugins.invoke :commands, self, @commander
|
@@ -54,6 +46,25 @@ module Usmu
|
|
54
46
|
end
|
55
47
|
@configuration
|
56
48
|
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# Helper function to setup a Commander runner
|
53
|
+
# @return [Commander::Runner]
|
54
|
+
def initialize_commander(args)
|
55
|
+
commander = Commander::Runner.new args
|
56
|
+
|
57
|
+
commander.program :version, Usmu::VERSION
|
58
|
+
commander.program :description, 'Static site generator powered by Tilt'
|
59
|
+
commander.program :int_message, 'Interrupt received, closing...'
|
60
|
+
|
61
|
+
commander.global_option('-v', '--verbose') { Usmu.verbose_logging }
|
62
|
+
commander.global_option('-q', '--quiet') { Usmu.quiet_logging }
|
63
|
+
commander.global_option('--log STRING', String) {|log| Usmu.add_file_logger(log) }
|
64
|
+
commander.global_option('--config STRING', String, &method(:load_configuration))
|
65
|
+
|
66
|
+
commander
|
67
|
+
end
|
57
68
|
end
|
58
69
|
end
|
59
70
|
end
|
data/lib/usmu/version.rb
CHANGED
@@ -158,4 +158,19 @@ RSpec.describe Usmu::Configuration do
|
|
158
158
|
expect(@configuration.source_files).to eq(%w(index.md test/foo.md))
|
159
159
|
end
|
160
160
|
end
|
161
|
+
|
162
|
+
it 'should allow indexing the configuration file' do
|
163
|
+
configuration = Usmu::Configuration.from_hash({test: 'foo'})
|
164
|
+
expect(configuration[:test]).to eq('foo')
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'should allow indexing the configuration file with a default value' do
|
168
|
+
configuration = Usmu::Configuration.from_hash({test: 'foo'})
|
169
|
+
expect(configuration[:bar, default: 'baz']).to eq('baz')
|
170
|
+
end
|
171
|
+
|
172
|
+
it 'should allow indexing the configuration file using a path of indices' do
|
173
|
+
configuration = Usmu::Configuration.from_hash({test: {bar: 'foo'}})
|
174
|
+
expect(configuration[:test, :bar]).to eq('foo')
|
175
|
+
end
|
161
176
|
end
|
data/usmu-jruby.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: usmu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Matthew Scharley
|
@@ -220,6 +220,20 @@ dependencies:
|
|
220
220
|
- - "~>"
|
221
221
|
- !ruby/object:Gem::Version
|
222
222
|
version: '1.2'
|
223
|
+
- !ruby/object:Gem::Dependency
|
224
|
+
name: sass
|
225
|
+
requirement: !ruby/object:Gem::Requirement
|
226
|
+
requirements:
|
227
|
+
- - "~>"
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '3.4'
|
230
|
+
type: :development
|
231
|
+
prerelease: false
|
232
|
+
version_requirements: !ruby/object:Gem::Requirement
|
233
|
+
requirements:
|
234
|
+
- - "~>"
|
235
|
+
- !ruby/object:Gem::Version
|
236
|
+
version: '3.4'
|
223
237
|
description: |2
|
224
238
|
Usmu is a static site generator built in Ruby that leverages the Tilt API to support many different template
|
225
239
|
engines. It supports local generation but is designed to be used with the web-based editor.
|
@@ -245,11 +259,11 @@ files:
|
|
245
259
|
- README.md
|
246
260
|
- Rakefile
|
247
261
|
- bin/usmu
|
248
|
-
- cucumber.yml
|
249
262
|
- lib/usmu.rb
|
250
263
|
- lib/usmu/configuration.rb
|
251
264
|
- lib/usmu/plugin.rb
|
252
265
|
- lib/usmu/plugin/core.rb
|
266
|
+
- lib/usmu/plugin/core_hooks.rb
|
253
267
|
- lib/usmu/site_generator.rb
|
254
268
|
- lib/usmu/template/helpers.rb
|
255
269
|
- lib/usmu/template/include.rb
|
data/cucumber.yml
DELETED