usmu 0.4.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -0
  3. data/Guardfile +1 -1
  4. data/Rakefile +1 -0
  5. data/lib/usmu.rb +2 -0
  6. data/lib/usmu/collections.rb +50 -0
  7. data/lib/usmu/configuration.rb +10 -35
  8. data/lib/usmu/helpers/indexer.rb +54 -0
  9. data/lib/usmu/plugin/core.rb +1 -2
  10. data/lib/usmu/site_generator.rb +8 -0
  11. data/lib/usmu/template/helpers.rb +27 -1
  12. data/lib/usmu/template/layout.rb +2 -8
  13. data/lib/usmu/template/page.rb +40 -0
  14. data/lib/usmu/template/static_file.rb +18 -0
  15. data/lib/usmu/ui/console.rb +0 -4
  16. data/lib/usmu/ui/rack_server.rb +2 -1
  17. data/lib/usmu/version.rb +1 -1
  18. data/share/init-site/source/index.meta.yml +2 -0
  19. data/share/init-site/usmu.yml +1 -1
  20. data/spec/{configuration_spec.rb → usmu/configuration_spec.rb} +0 -0
  21. data/spec/{deployment → usmu/deployment}/directory_diff_spec.rb +0 -0
  22. data/spec/{metadata_service_spec.rb → usmu/metadata_service_spec.rb} +0 -0
  23. data/spec/{plugin → usmu/plugin}/core_spec.rb +0 -0
  24. data/spec/{plugin_spec.rb → usmu/plugin_spec.rb} +0 -0
  25. data/spec/{site_generator_spec.rb → usmu/site_generator_spec.rb} +3 -3
  26. data/spec/{template → usmu/template}/layout_spec.rb +0 -0
  27. data/spec/{template → usmu/template}/page_spec.rb +0 -0
  28. data/spec/{template → usmu/template}/static_file_spec.rb +0 -0
  29. data/spec/{ui → usmu/ui}/console_spec.rb +0 -0
  30. data/test-site/content/archive.slim +13 -0
  31. data/test-site/content/posts/meta.yml +4 -0
  32. data/test-site/content/posts/second-post.md +3 -0
  33. data/test-site/content/posts/second-post.meta.yml +3 -0
  34. data/test-site/content/posts/test-post.md +2 -2
  35. data/test-site/content/posts/test-post.meta.yml +3 -0
  36. data/test-site/expected-site/2015/01/second-post.html +29 -0
  37. data/test-site/expected-site/2015/01/test-post.html +29 -0
  38. data/test-site/expected-site/archive.html +37 -0
  39. data/test-site/layouts/post.meta.yml +2 -0
  40. data/test-site/layouts/post.slim +10 -0
  41. metadata +45 -24
  42. data/test-site/expected-site/posts/test-post.html +0 -18
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 461146e9c2898d92826965dbb6fcc57c54e9e2d4
4
- data.tar.gz: 95c4b21ba16f9a240449c9e17a0aeb28985390cf
3
+ metadata.gz: 64d4047c5c82c4c4854d5842938e233ee36cdf20
4
+ data.tar.gz: e7ce74410b8b2f7a4f0445dc1fc9564340344504
5
5
  SHA512:
6
- metadata.gz: ca0fb7ae477db1637b1d98c7060ec4a1a5d9dd177b557423f96f52b8ec4e4c4a5b55630aa602b700cf01e0bb985380bcf60c899ab8fa90a6d35085a47b00a679
7
- data.tar.gz: a71ee92f2fb6c51be007df21de215819430a7a2987ccad1388460d394273e8e7808a5c6f89f883df480fa2e55338c8805665734f0d2c9f8982d6405648e97201
6
+ metadata.gz: 1c2e2b38dc4bd4943d07d618ccc10ac8b338a5135f9d32ece9f0b8e4e8076fa7f02a606bf8e80101bc80f271c728236be7ce4b8df30dbd37b9d403553ec65d1a
7
+ data.tar.gz: 7ab64019c566d4411ad8f4beac28384e5580841dde0c9a2900908aff82f2d4579ec6a6435bad155331f352121846bf289f5edccc5084e61a1687e553ee84169a
@@ -1,5 +1,16 @@
1
1
  # Usmu Change Log
2
2
 
3
+ ## 1.0.0
4
+
5
+ Matthew Scharley <matt.scharley@gmail.com>
6
+
7
+ * Minor refactor of /spec (d353c8a1f8914dc9fb554770479092cfc1e526bc)
8
+ * Small update to the init site (d86e9a205a3a2f1cc76dec7e66f0540edc9e13c1)
9
+ * [#29] Generalise Configuration#[] into Helpers::Indexer and add to Layout (474b5d778f841595602a4ec7913a646ff5e90106)
10
+ * [#27] Add permalinks (ce190c0d33e84bf38b26cc134fe96bb9a3bb3f22)
11
+ * [#19] Basic functional collection support for paging (de2fa4194fe9db955e09a302a1b87816557e8f3e)
12
+ * [#19] Add enumeration of collections (e6923cf10426e62bc5f35c3649303a1ae65466fd)
13
+
3
14
  ## 0.4.0
4
15
 
5
16
  Matthew Scharley <matt.scharley@gmail.com>
data/Guardfile CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  guard :rspec, cmd: 'rspec', spec_paths: ['spec'] do
5
5
  watch(%r{^spec/.+_spec\.rb$})
6
- watch(%r{^lib/usmu/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
6
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
7
7
  watch(%r{^spec/support}) { 'spec' }
8
8
  watch('spec/spec_helper.rb') { 'spec' }
9
9
 
data/Rakefile CHANGED
@@ -49,6 +49,7 @@ task :ci => [:clean, :spec]
49
49
  desc 'Clean up after tests'
50
50
  task :clean do
51
51
  [
52
+ 'doc',
52
53
  'tmp',
53
54
  'test-site/site',
54
55
  current_gems,
@@ -86,6 +86,7 @@ end
86
86
 
87
87
  %W{
88
88
  usmu/version
89
+ usmu/collections
89
90
  usmu/configuration
90
91
  usmu/metadata_service
91
92
  usmu/site_generator
@@ -96,4 +97,5 @@ end
96
97
  usmu/template/layout
97
98
  usmu/template/page
98
99
  usmu/template/static_file
100
+ usmu/helpers/indexer
99
101
  }.each { |f| require f }
@@ -0,0 +1,50 @@
1
+
2
+ module Usmu
3
+ class Collections
4
+ # @param [Usmu::SiteGenerator] generator
5
+ def initialize(generator)
6
+ @generator = generator
7
+ refresh
8
+ end
9
+
10
+ def [](index)
11
+ unless @collections[index]
12
+ files = @generator.renderables.select {|r| r['collection'] == index }.sort_by &:date
13
+ @collections[index] = Collection.new(files)
14
+ end
15
+
16
+ @collections[index]
17
+ end
18
+
19
+ def refresh
20
+ @collections = {}
21
+ end
22
+
23
+ class Collection
24
+ # @param [Array<Usmu::Template::Page>] pages
25
+ def initialize(pages)
26
+ @pages = pages
27
+ end
28
+
29
+ def pages
30
+ @pages.dup
31
+ end
32
+
33
+ def each(&block)
34
+ pages.each &block
35
+ end
36
+
37
+ def previous_from(file)
38
+ i = @pages.index file
39
+ return unless i
40
+ @pages[(i - 1) % @pages.length]
41
+ end
42
+
43
+ def next_from(file)
44
+ i = @pages.index file
45
+ return unless i
46
+ @pages[(i + 1) % @pages.length]
47
+ end
48
+ end
49
+ end
50
+ end
@@ -1,12 +1,17 @@
1
1
  require 'yaml'
2
2
  require 'usmu/metadata_service'
3
+ require 'usmu/helpers/indexer'
3
4
 
4
5
  module Usmu
5
6
  # This class is used to represent a configuration file. This file should be a YAML file and called `usmu.yml`
6
7
  # by default.
7
8
  class Configuration
9
+ include Usmu::Helpers::Indexer
10
+
8
11
  @log = Logging.logger[self]
9
12
 
13
+ indexer :@config
14
+
10
15
  # @!attribute [r] config_file
11
16
  # @return [String] the name of the file used to load the configuration.
12
17
  attr_reader :config_file
@@ -84,41 +89,6 @@ module Usmu
84
89
  @includes_metadata ||= MetadataService.new(includes_path)
85
90
  end
86
91
 
87
- # An index accessor to directly access the configuration file. It should be noted that `['source']` and
88
- # `#source_path` and other similar pairs will have different values. `['source']` is the raw value from the
89
- # configuration file while the latter is a path on the system, potentially altered by the path from the current
90
- # working directory to the configuration file and other factors. The accessor functions such as `#source_path`
91
- # should be preferred for most usages.
92
- #
93
- # @param [String, Symbol] indices
94
- # A list of indices to use to find the value to return. Can also include an options hash with the
95
- # following options:
96
- #
97
- # * `:default`: Sets the default value if the value can't be found.
98
- #
99
- # @return [Array, Hash, String, Symbol]
100
- # Returns a value from the hash loaded from YAML. The type of value will ultimately depend on the configuration
101
- # file and the indices provided.
102
- def [](*indices)
103
- if indices.last.instance_of? Hash
104
- opts = indices.pop
105
- else
106
- opts = {}
107
- end
108
-
109
- value = @config
110
- while indices.length > 0
111
- i = indices.shift
112
- if value.key? i
113
- value = value[i]
114
- else
115
- return opts[:default]
116
- end
117
- end
118
-
119
- value
120
- end
121
-
122
92
  # Returns an array of exclusions
123
93
  #
124
94
  # @return [Array]
@@ -126,6 +96,11 @@ module Usmu
126
96
  self['exclude'] || []
127
97
  end
128
98
 
99
+ # @return [Usmu::SiteGenerator]
100
+ def generator
101
+ @generator ||= SiteGenerator.new(self)
102
+ end
103
+
129
104
  private
130
105
 
131
106
  attr_reader :log
@@ -0,0 +1,54 @@
1
+
2
+ module Usmu
3
+ module Helpers
4
+ module Indexer
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+ def indexer(variable)
11
+ # An index accessor to directly access the configuration file. It should be noted that `['source']` and
12
+ # `#source_path` and other similar pairs will have different values. `['source']` is the raw value from the
13
+ # configuration file while the latter is a path on the system, potentially altered by the path from the current
14
+ # working directory to the configuration file and other factors. The accessor functions such as `#source_path`
15
+ # should be preferred for most usages.
16
+ #
17
+ # @param [String, Symbol] indices
18
+ # A list of indices to use to find the value to return. Can also include an options hash with the
19
+ # following options:
20
+ #
21
+ # * `:default`: Sets the default value if the value can't be found.
22
+ #
23
+ # @return [Array, Hash, String, Symbol]
24
+ # Returns a value from the hash loaded from YAML. The type of value will ultimately depend on the configuration
25
+ # file and the indices provided.
26
+ define_method(:[]) do |*indices|
27
+ if indices.last.instance_of? Hash
28
+ opts = indices.pop
29
+ else
30
+ opts = {}
31
+ end
32
+
33
+ value = variable.to_s[0] == '@' ? instance_variable_get(variable) : send(variable)
34
+ while indices.length > 0
35
+ i = indices.shift
36
+ if value.key? i
37
+ value = value[i]
38
+ else
39
+ return opts[:default]
40
+ end
41
+ end
42
+
43
+ value
44
+ end
45
+
46
+ define_method(:key?) do |index|
47
+ value = variable.to_s[0] == '@' ? instance_variable_get(variable) : send(variable)
48
+ value.key? index
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -41,8 +41,7 @@ module Usmu
41
41
  # @param [Array<String>] args arguments passed by the user.
42
42
  # @param [Hash] options options parsed by Commander
43
43
  def command_generate(args, options)
44
- @site_generator = Usmu::SiteGenerator.new(@ui.configuration)
45
- @site_generator.generate
44
+ @ui.configuration.generator.generate
46
45
  end
47
46
 
48
47
  # Command to initialise a new website.
@@ -63,6 +63,14 @@ module Usmu
63
63
  nil
64
64
  end
65
65
 
66
+ def collections
67
+ @collections ||= Collections.new(self)
68
+ end
69
+
70
+ def refresh
71
+ collections.refresh
72
+ end
73
+
66
74
  private
67
75
 
68
76
  # Helper function to generate a page
@@ -7,8 +7,9 @@ module Usmu
7
7
  class Helpers
8
8
  # Create a new Helpers instance. These are created on demand as needed by templates, there is not a singleton
9
9
  # instance.
10
- def initialize(configuration)
10
+ def initialize(configuration, layout)
11
11
  @configuration = configuration
12
+ @layout = layout
12
13
  end
13
14
 
14
15
  # Finds and renders a named include.
@@ -26,6 +27,31 @@ module Usmu
26
27
  inc.arguments = args
27
28
  inc.render
28
29
  end
30
+
31
+ def url(path)
32
+ path = if path.is_a? String
33
+ path
34
+ elsif path.respond_to? :output_filename
35
+ path.output_filename
36
+ else
37
+ path.to_s
38
+ end
39
+ @configuration['base path', default: '/'] + path
40
+ end
41
+
42
+ def previous_page
43
+ collection = @layout['page', 'collection', default: @layout['collection', default: '']]
44
+ @configuration.generator.collections[collection].previous_from(@layout)
45
+ end
46
+
47
+ def next_page
48
+ collection = @layout['page', 'collection', default: @layout['collection', default: '']]
49
+ @configuration.generator.collections[collection].next_from(@layout['page', default: @layout])
50
+ end
51
+
52
+ def collection(name)
53
+ @configuration.generator.collections[name]
54
+ end
29
55
  end
30
56
  end
31
57
  end
@@ -2,6 +2,7 @@ require 'tilt'
2
2
  require 'deep_merge'
3
3
  require 'usmu/template/helpers'
4
4
  require 'usmu/template/static_file'
5
+ require 'usmu/helpers/indexer'
5
6
 
6
7
  module Usmu
7
8
  module Template
@@ -60,13 +61,6 @@ module Usmu
60
61
  end
61
62
  end
62
63
 
63
- # This is a shortcut to accessing metadata.
64
- #
65
- # @see #metadata
66
- def [](index)
67
- metadata[index]
68
- end
69
-
70
64
  # Renders the file with any templating language required and returns the result
71
65
  #
72
66
  # @param variables [Hash] Variables to be used in the template.
@@ -204,7 +198,7 @@ module Usmu
204
198
  # @!attribute [r] helpers
205
199
  # @return [Usmu::Template::Helpers] the Helpers class to use as a scope for templates
206
200
  def helpers
207
- @helpers ||= Usmu::Template::Helpers.new(@configuration)
201
+ @helpers ||= Usmu::Template::Helpers.new(@configuration, self)
208
202
  end
209
203
 
210
204
  # Adds defaults for the given generator engine
@@ -1,10 +1,16 @@
1
1
  require 'usmu/template/layout'
2
+ require 'time'
2
3
 
3
4
  module Usmu
4
5
  module Template
5
6
  # Represents a page in the source directory of the website.
6
7
  class Page < Layout
7
8
 
9
+ private
10
+ alias :super_output_filename :output_filename
11
+
12
+ public
13
+
8
14
  # @param configuration [Usmu::Configuration] The configuration for the website we're generating.
9
15
  # @param name [String] The name of the file in the source directory.
10
16
  # @param metadata [Hash] The metadata for the file.
@@ -21,6 +27,27 @@ module Usmu
21
27
  end
22
28
  end
23
29
 
30
+ def output_filename
31
+ permalink || super_output_filename
32
+ end
33
+
34
+ def date
35
+ date = self['date']
36
+ if date.is_a? Time
37
+ return date
38
+ end
39
+
40
+ if date
41
+ date = Time.parse(date) rescue nil
42
+ end
43
+
44
+ unless date
45
+ date = File.stat(input_path).mtime
46
+ end
47
+
48
+ date
49
+ end
50
+
24
51
  protected
25
52
 
26
53
  # @!attribute [r] content_path
@@ -34,6 +61,19 @@ module Usmu
34
61
  def content_path
35
62
  @configuration.source_path
36
63
  end
64
+
65
+ def permalink
66
+ link = self['permalink']
67
+ return nil unless link
68
+
69
+ date = self.date
70
+
71
+ extension = output_extension
72
+ extension = '.' + extension if extension
73
+
74
+ link_tr = link.gsub('%f', File.basename(@name[0..(@name.rindex('.') - 1)]))
75
+ date.strftime(link_tr) + extension
76
+ end
37
77
  end
38
78
  end
39
79
  end
@@ -5,10 +5,14 @@ module Usmu
5
5
  # Represents a static file which should be transferred to the destination unchanged. This also acts as the base
6
6
  # class for all layouts and page types. The basic interface defined here is used to process all types of files.
7
7
  class StaticFile
8
+ include Usmu::Helpers::Indexer
9
+
8
10
  # @!attribute [r] name
9
11
  # @return [String] the name of the file in the source directory
10
12
  attr_reader :name
11
13
 
14
+ indexer :metadata
15
+
12
16
  # @param configuration [Usmu::Configuration] The configuration for the website we're generating.
13
17
  # @param name [String] The name of the file in the source directory.
14
18
  # @param metadata [Hash] The metadata for the file.
@@ -40,6 +44,10 @@ module Usmu
40
44
  File.join(@configuration.source_path, @name)
41
45
  end
42
46
 
47
+ def metadata
48
+ {}
49
+ end
50
+
43
51
  # @!attribute [r] output_filename
44
52
  # @return [String] the filename to use in the output directory.
45
53
  #
@@ -47,6 +55,16 @@ module Usmu
47
55
  def output_filename
48
56
  @name
49
57
  end
58
+
59
+ def inspect
60
+ "\#<#{self.class}:#{'0x%08x' % __id__} #{@name} => #{output_filename}>"
61
+ end
62
+
63
+ def ==(other)
64
+ return false unless self.class == other.class
65
+
66
+ self.input_path == other.input_path && self.output_filename == other.output_filename
67
+ end
50
68
  end
51
69
  end
52
70
  end
@@ -5,10 +5,6 @@ module Usmu
5
5
  module Ui
6
6
  # This is the CLI UI controller. This is initialised by the usmu binary to control the generation process.
7
7
  class Console
8
- # @!attribute [r] site_generator
9
- # @return [Usmu::SiteGenerator]
10
- attr_reader :site_generator
11
-
12
8
  # @!attribute [r] configuration
13
9
  # Do not access this till your command starts running, eg. in Hooks#commands, otherwise you may not get the right
14
10
  # value for the configuration as option parsing may not have happened yet.
@@ -4,8 +4,8 @@ module Usmu
4
4
  class RackServer
5
5
  def initialize(configuration)
6
6
  @log = Logging.logger[self]
7
- @generator = SiteGenerator.new(configuration)
8
7
  @configuration = configuration
8
+ @generator = @configuration.generator
9
9
  @index = configuration['serve', 'index', default: 'index.html']
10
10
  end
11
11
 
@@ -19,6 +19,7 @@ module Usmu
19
19
  valid = @generator.renderables.select {|r| r.output_filename == path }
20
20
 
21
21
  if valid.length > 0
22
+ @generator.refresh
22
23
  page = valid[0]
23
24
  type = case page.output_filename[page.output_filename.rindex('.')...page.output_filename.length]
24
25
  when '.html', '.php'
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Usmu
3
3
  # The current version string for the gem
4
- VERSION = '0.4.0'
4
+ VERSION = '1.0.0'
5
5
  end
@@ -0,0 +1,2 @@
1
+ ---
2
+ layout: html
@@ -3,4 +3,4 @@
3
3
  title: Example site
4
4
 
5
5
  exclude:
6
- - '**/_*.s[ca]ss
6
+ - '**/_*.s[ca]ss'
@@ -6,17 +6,17 @@ RSpec.describe Usmu::SiteGenerator do
6
6
 
7
7
  it 'should have layouts' do
8
8
  expect(generator.respond_to? :layouts).to eq(true)
9
- expect(generator.layouts.map {|l| l.name}.sort).to eq(%w{embedded.slim html.slim})
9
+ expect(generator.layouts.map {|l| l.name}.sort).to eq(%w{embedded.slim html.slim post.slim})
10
10
  end
11
11
 
12
12
  it 'should have a list of renderable items' do
13
13
  expect(generator.respond_to? :renderables).to eq(true)
14
- expect(generator.renderables.map {|r| r.name}.sort).to eq(%w{.dotfiletest.txt assets/external.scss css/app.scss default.md embedded.md index.md posts/test-post.md robots.txt})
14
+ expect(generator.renderables.map {|r| r.name}.sort).to eq(%w{.dotfiletest.txt archive.slim assets/external.scss css/app.scss default.md embedded.md index.md posts/second-post.md posts/test-post.md robots.txt})
15
15
  end
16
16
 
17
17
  it 'should have pages' do
18
18
  expect(generator.respond_to? :pages).to eq(true)
19
- expect(generator.pages.map {|p| p.name}.sort).to eq(%w{css/app.scss default.md embedded.md index.md posts/test-post.md})
19
+ expect(generator.pages.map {|p| p.name}.sort).to eq(%w{archive.slim css/app.scss default.md embedded.md index.md posts/second-post.md posts/test-post.md})
20
20
  end
21
21
 
22
22
  it 'should have files' do
File without changes
@@ -0,0 +1,13 @@
1
+ p Chronological order:
2
+
3
+ ul
4
+ - for page in collection('posts')
5
+ li
6
+ a href="#{url page}" #{page['title']}
7
+
8
+ p Reverse order:
9
+
10
+ ul
11
+ - for page in collection('posts').pages.reverse
12
+ li
13
+ a href="#{url page}" #{page['title']}
@@ -0,0 +1,4 @@
1
+ ---
2
+ permalink: '%Y/%m/%f'
3
+ collection: posts
4
+ layout: post
@@ -0,0 +1,3 @@
1
+ ## This is my second post!
2
+
3
+ Hello again world.
@@ -0,0 +1,3 @@
1
+ ---
2
+ date: 2015-01-24 12:00:00 +1000
3
+ title: Second post
@@ -1,3 +1,3 @@
1
- # Hello world!
1
+ ## Hello world!
2
2
 
3
- This is my first post.
3
+ This is my first post.
@@ -0,0 +1,3 @@
1
+ ---
2
+ date: 2015-01-23 12:00:00 +1000
3
+ title: Test post
@@ -0,0 +1,29 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Second post | Testing website</title>
5
+ </head>
6
+ <body>
7
+ <div id="content">
8
+ <article>
9
+ <h1>
10
+ Second post
11
+ </h1>
12
+ <h2>This is my second post!</h2>
13
+
14
+ <p>Hello again world.</p>
15
+
16
+ </article>
17
+ <nav class="article-nav">
18
+ <div class="next">
19
+ <a href="/2015/01/test-post.html">Test post</a>
20
+ </div>
21
+ </nav>
22
+
23
+ </div>
24
+ <footer>
25
+ Copyright &copy; Testers Inc.
26
+ </footer>
27
+
28
+ </body>
29
+ </html>
@@ -0,0 +1,29 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Test post | Testing website</title>
5
+ </head>
6
+ <body>
7
+ <div id="content">
8
+ <article>
9
+ <h1>
10
+ Test post
11
+ </h1>
12
+ <h2>Hello world!</h2>
13
+
14
+ <p>This is my first post.</p>
15
+
16
+ </article>
17
+ <nav class="article-nav">
18
+ <div class="next">
19
+ <a href="/2015/01/second-post.html">Second post</a>
20
+ </div>
21
+ </nav>
22
+
23
+ </div>
24
+ <footer>
25
+ Copyright &copy; Testers Inc.
26
+ </footer>
27
+
28
+ </body>
29
+ </html>
@@ -0,0 +1,37 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Default Title | Testing website</title>
5
+ </head>
6
+ <body>
7
+ <div id="content">
8
+ <p>
9
+ Chronological order:
10
+ </p>
11
+ <ul>
12
+ <li>
13
+ <a href="/2015/01/test-post.html">Test post</a>
14
+ </li>
15
+ <li>
16
+ <a href="/2015/01/second-post.html">Second post</a>
17
+ </li>
18
+ </ul>
19
+ <p>
20
+ Reverse order:
21
+ </p>
22
+ <ul>
23
+ <li>
24
+ <a href="/2015/01/second-post.html">Second post</a>
25
+ </li>
26
+ <li>
27
+ <a href="/2015/01/test-post.html">Test post</a>
28
+ </li>
29
+ </ul>
30
+
31
+ </div>
32
+ <footer>
33
+ Copyright &copy; Testers Inc.
34
+ </footer>
35
+
36
+ </body>
37
+ </html>
@@ -0,0 +1,2 @@
1
+ ---
2
+ layout: html
@@ -0,0 +1,10 @@
1
+ article
2
+ h1 #{page['title']}
3
+ | #{{content}}
4
+ nav.article-nav
5
+ - if previous_page
6
+ .previous
7
+ a href="#{url previous_page.output_filename}" #{previous_page['title']}
8
+ - if next_page
9
+ .next
10
+ a href="#{url next_page.output_filename}" #{next_page['title']}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: usmu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Scharley
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-18 00:00:00.000000000 Z
11
+ date: 2015-01-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: slim
@@ -277,10 +277,12 @@ files:
277
277
  - Rakefile
278
278
  - bin/usmu
279
279
  - lib/usmu.rb
280
+ - lib/usmu/collections.rb
280
281
  - lib/usmu/configuration.rb
281
282
  - lib/usmu/deployment.rb
282
283
  - lib/usmu/deployment/directory_diff.rb
283
284
  - lib/usmu/deployment/remote_file_interface.rb
285
+ - lib/usmu/helpers/indexer.rb
284
286
  - lib/usmu/metadata_service.rb
285
287
  - lib/usmu/plugin.rb
286
288
  - lib/usmu/plugin/core.rb
@@ -299,24 +301,26 @@ files:
299
301
  - share/init-site/Gemfile
300
302
  - share/init-site/layouts/html.slim
301
303
  - share/init-site/source/index.md
304
+ - share/init-site/source/index.meta.yml
302
305
  - share/init-site/usmu.yml
303
306
  - spec/acceptance/full_site_build.feature
304
307
  - spec/acceptance/steps/full_site_build_steps.rb
305
- - spec/configuration_spec.rb
306
- - spec/deployment/directory_diff_spec.rb
307
- - spec/metadata_service_spec.rb
308
308
  - spec/mock/usmu/mock_plugin.rb
309
309
  - spec/mock/usmu/mock_remote_files.rb
310
- - spec/plugin/core_spec.rb
311
- - spec/plugin_spec.rb
312
- - spec/site_generator_spec.rb
313
310
  - spec/spec_helper.rb
314
311
  - spec/support/shared_layout.rb
315
- - spec/template/layout_spec.rb
316
- - spec/template/page_spec.rb
317
- - spec/template/static_file_spec.rb
318
- - spec/ui/console_spec.rb
312
+ - spec/usmu/configuration_spec.rb
313
+ - spec/usmu/deployment/directory_diff_spec.rb
314
+ - spec/usmu/metadata_service_spec.rb
315
+ - spec/usmu/plugin/core_spec.rb
316
+ - spec/usmu/plugin_spec.rb
317
+ - spec/usmu/site_generator_spec.rb
318
+ - spec/usmu/template/layout_spec.rb
319
+ - spec/usmu/template/page_spec.rb
320
+ - spec/usmu/template/static_file_spec.rb
321
+ - spec/usmu/ui/console_spec.rb
319
322
  - test-site/content/.dotfiletest.txt
323
+ - test-site/content/archive.slim
320
324
  - test-site/content/assets/external.scss
321
325
  - test-site/content/assets/meta.yml
322
326
  - test-site/content/css/_partial.scss
@@ -326,21 +330,29 @@ files:
326
330
  - test-site/content/embedded.meta.yml
327
331
  - test-site/content/index.md
328
332
  - test-site/content/index.meta.yml
333
+ - test-site/content/posts/meta.yml
334
+ - test-site/content/posts/second-post.md
335
+ - test-site/content/posts/second-post.meta.yml
329
336
  - test-site/content/posts/test-post.md
337
+ - test-site/content/posts/test-post.meta.yml
330
338
  - test-site/content/robots.txt
331
339
  - test-site/expected-site/.dotfiletest.txt
340
+ - test-site/expected-site/2015/01/second-post.html
341
+ - test-site/expected-site/2015/01/test-post.html
342
+ - test-site/expected-site/archive.html
332
343
  - test-site/expected-site/assets/external.scss
333
344
  - test-site/expected-site/css/app.css
334
345
  - test-site/expected-site/default.html
335
346
  - test-site/expected-site/embedded.html
336
347
  - test-site/expected-site/index.html
337
- - test-site/expected-site/posts/test-post.html
338
348
  - test-site/expected-site/robots.txt
339
349
  - test-site/includes/footer.meta.yml
340
350
  - test-site/includes/footer.slim
341
351
  - test-site/layouts/embedded.meta.yml
342
352
  - test-site/layouts/embedded.slim
343
353
  - test-site/layouts/html.slim
354
+ - test-site/layouts/post.meta.yml
355
+ - test-site/layouts/post.slim
344
356
  - test-site/usmu.yml
345
357
  - usmu.gemspec
346
358
  homepage: https://github.com/usmu/usmu
@@ -370,21 +382,22 @@ summary: A static site generator with a web-based frontend for editing.
370
382
  test_files:
371
383
  - spec/acceptance/full_site_build.feature
372
384
  - spec/acceptance/steps/full_site_build_steps.rb
373
- - spec/configuration_spec.rb
374
- - spec/deployment/directory_diff_spec.rb
375
- - spec/metadata_service_spec.rb
376
385
  - spec/mock/usmu/mock_plugin.rb
377
386
  - spec/mock/usmu/mock_remote_files.rb
378
- - spec/plugin/core_spec.rb
379
- - spec/plugin_spec.rb
380
- - spec/site_generator_spec.rb
381
387
  - spec/spec_helper.rb
382
388
  - spec/support/shared_layout.rb
383
- - spec/template/layout_spec.rb
384
- - spec/template/page_spec.rb
385
- - spec/template/static_file_spec.rb
386
- - spec/ui/console_spec.rb
389
+ - spec/usmu/configuration_spec.rb
390
+ - spec/usmu/deployment/directory_diff_spec.rb
391
+ - spec/usmu/metadata_service_spec.rb
392
+ - spec/usmu/plugin/core_spec.rb
393
+ - spec/usmu/plugin_spec.rb
394
+ - spec/usmu/site_generator_spec.rb
395
+ - spec/usmu/template/layout_spec.rb
396
+ - spec/usmu/template/page_spec.rb
397
+ - spec/usmu/template/static_file_spec.rb
398
+ - spec/usmu/ui/console_spec.rb
387
399
  - test-site/content/.dotfiletest.txt
400
+ - test-site/content/archive.slim
388
401
  - test-site/content/assets/external.scss
389
402
  - test-site/content/assets/meta.yml
390
403
  - test-site/content/css/_partial.scss
@@ -394,20 +407,28 @@ test_files:
394
407
  - test-site/content/embedded.meta.yml
395
408
  - test-site/content/index.md
396
409
  - test-site/content/index.meta.yml
410
+ - test-site/content/posts/meta.yml
411
+ - test-site/content/posts/second-post.md
412
+ - test-site/content/posts/second-post.meta.yml
397
413
  - test-site/content/posts/test-post.md
414
+ - test-site/content/posts/test-post.meta.yml
398
415
  - test-site/content/robots.txt
399
416
  - test-site/expected-site/.dotfiletest.txt
417
+ - test-site/expected-site/2015/01/second-post.html
418
+ - test-site/expected-site/2015/01/test-post.html
419
+ - test-site/expected-site/archive.html
400
420
  - test-site/expected-site/assets/external.scss
401
421
  - test-site/expected-site/css/app.css
402
422
  - test-site/expected-site/default.html
403
423
  - test-site/expected-site/embedded.html
404
424
  - test-site/expected-site/index.html
405
- - test-site/expected-site/posts/test-post.html
406
425
  - test-site/expected-site/robots.txt
407
426
  - test-site/includes/footer.meta.yml
408
427
  - test-site/includes/footer.slim
409
428
  - test-site/layouts/embedded.meta.yml
410
429
  - test-site/layouts/embedded.slim
411
430
  - test-site/layouts/html.slim
431
+ - test-site/layouts/post.meta.yml
432
+ - test-site/layouts/post.slim
412
433
  - test-site/usmu.yml
413
434
  has_rdoc:
@@ -1,18 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Default Title | Testing website</title>
5
- </head>
6
- <body>
7
- <div id="content">
8
- <h1>Hello world!</h1>
9
-
10
- <p>This is my first post.</p>
11
-
12
- </div>
13
- <footer>
14
- Copyright &copy; Testers Inc.
15
- </footer>
16
-
17
- </body>
18
- </html>