usmu 0.4.0 → 1.0.0

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.
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>