lifer 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 225194090fc0812a6c9c760203e4c8e2b3d74b8a83a9b8393ebdbf691a942c90
4
- data.tar.gz: 4fa359e525044b675b6e429501a53e6c6f2d6495ab5938681e3b83b068c5628f
3
+ metadata.gz: c5891938dbf0269f6cf30b14cd14130025b2214e0b03b6c756d48efa1abf8ae3
4
+ data.tar.gz: a6bb29832ac1e2ccde939d17f6c84643c5d8f3544d0cda7f407a696d642836e7
5
5
  SHA512:
6
- metadata.gz: 334f8a7359bac5537ae3279d01c1d153fec4d9ae27b7c29dc2132f4443227b0c7c4409f2fe6461592ec53690c66e04e7e6018e6ca5bc2e23d60b7afa432160b9
7
- data.tar.gz: 475dbdb28f05668418d90531832103b8592f3734270e5d3d3cd0400feafc3760570d116a2a27c9730c6f39421524ea00b1d843af9cb93bd2645c5fb2c6b852a1
6
+ metadata.gz: 6cd12ec2588d1afc192352219a98e04672ce721069160bc5b3f0db5e2c91998a156318d30ee7a3299d062f32127b0cf9cc9d7eea7ece320212627c3e27344d91
7
+ data.tar.gz: 1506e4a3bf8957dce6dbacccf25d75a52edf710c886a8955b979dede89b698dfc8f0a8dd1571fa6275ad8737ad0cdc2e9897503b16bb848bcaef2027ddfb8fcf
@@ -4,13 +4,14 @@ on: [push,pull_request]
4
4
 
5
5
  jobs:
6
6
  build:
7
+ name: Run RSpec test suite
7
8
  runs-on: ubuntu-latest
8
9
  steps:
9
10
  - uses: actions/checkout@v2
10
11
  - name: Set up Ruby
11
12
  uses: ruby/setup-ruby@v1
12
13
  with:
13
- ruby-version: 3.0.2
14
+ ruby-version: 3.1.2
14
15
  bundler-cache: true
15
16
  - name: Run the default task
16
17
  run: bundle exec rake
data/.gitignore CHANGED
@@ -1,11 +1,13 @@
1
+ # Ruby tooling.
2
+ .rspec_status
1
3
  /.bundle/
2
4
  /.yardoc
3
5
  /_yardoc/
4
6
  /coverage/
5
- /doc/
6
- /pkg/
7
7
  /spec/reports/
8
- /tmp/
9
8
 
10
- # rspec failure tracking
11
- .rspec_status
9
+ # Gem builds.
10
+ lifer*.gem
11
+
12
+ # Temp files.
13
+ /tmp/
data/Gemfile.lock CHANGED
@@ -7,10 +7,18 @@ PATH
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
+ debug (1.6.2)
11
+ irb (>= 1.3.6)
12
+ reline (>= 0.3.1)
10
13
  diff-lcs (1.5.0)
14
+ io-console (0.5.11)
15
+ irb (1.4.1)
16
+ reline (>= 0.3.0)
11
17
  kramdown (2.4.0)
12
18
  rexml
13
19
  rake (13.0.6)
20
+ reline (0.3.1)
21
+ io-console (~> 0.5)
14
22
  rexml (3.2.5)
15
23
  rspec (3.11.0)
16
24
  rspec-core (~> 3.11.0)
@@ -27,12 +35,14 @@ GEM
27
35
  rspec-support (3.11.0)
28
36
 
29
37
  PLATFORMS
30
- x86_64-darwin-20
38
+ x86_64-darwin-21
39
+ x86_64-linux
31
40
 
32
41
  DEPENDENCIES
42
+ debug
33
43
  lifer!
34
44
  rake (~> 13.0)
35
45
  rspec (~> 3.0)
36
46
 
37
47
  BUNDLED WITH
38
- 2.2.22
48
+ 2.3.21
@@ -1,11 +1,8 @@
1
1
  require "fileutils"
2
2
 
3
- # FIXME:
4
- # This builder is not currently designed in a good way. Every builder should
5
- # have an interface that lets us swap steps in and out in an easy way.
6
- #
7
3
  class Lifer::Builder::HTML
8
4
  DEFAULT_OUTPUT_DIRECTORY_NAME = "_build"
5
+ FALLBACK_URI_STRATEGY = "simple"
9
6
 
10
7
  class << self
11
8
  def execute(root:)
@@ -15,21 +12,17 @@ class Lifer::Builder::HTML
15
12
 
16
13
  def execute
17
14
  # Remove any existing output directory.
15
+ #
18
16
  FileUtils.rm_r(output_directory)
19
17
 
20
18
  # Go into the fresh build directory and generate each HTML file from the
21
19
  # given directory.
20
+ #
22
21
  Dir.chdir(output_directory) do
23
22
  Lifer.collections.each do |collection|
24
23
  collection.entries.each do |entry|
25
- initialize_subdirectories_for entry
26
-
27
- File.open(uri_strategy.file_for(entry), "w") { |f|
28
- f.write Lifer::Layout.build(
29
- entry: entry,
30
- template: layout_for(collection)
31
- )
32
- }
24
+ generate_output_directories_for entry, current_collection: collection
25
+ generate_output_file_for entry, current_collection: collection
33
26
  end
34
27
  end
35
28
  end
@@ -37,18 +30,27 @@ class Lifer::Builder::HTML
37
30
 
38
31
  private
39
32
 
40
- attr_reader :root, :uri_strategy
33
+ attr_reader :root
41
34
 
42
35
  def initialize(root:)
43
36
  @root = root
44
- @uri_strategy = Lifer::URIStrategy::Simple.new(directory: root)
45
37
  end
46
38
 
47
- def initialize_subdirectories_for(entry)
48
- return if (dirname = uri_strategy.dirname_for(entry)).nil? ||
49
- Dir.exist?(dirname)
39
+ def generate_output_directories_for(entry, current_collection:)
40
+ dirname =
41
+ Pathname File.dirname(uri_strategy(current_collection).output_file(entry))
42
+ FileUtils.mkdir_p dirname unless Dir.exist?(dirname)
43
+ end
50
44
 
51
- FileUtils.mkdir_p uri_strategy.dirname_for(entry)
45
+ def generate_output_file_for(entry, current_collection:)
46
+ File.open(uri_strategy(current_collection).output_file(entry), "w") { |file|
47
+ file.write(
48
+ Lifer::Layout.build(
49
+ entry: entry,
50
+ template: layout_for(current_collection)
51
+ )
52
+ )
53
+ }
52
54
  end
53
55
 
54
56
  def layout_for(collection)
@@ -70,4 +72,14 @@ class Lifer::Builder::HTML
70
72
  Dir.mkdir(dir)
71
73
  Pathname(dir)
72
74
  end
75
+
76
+ def uri_strategy(current_collection)
77
+ collection_settings =
78
+ Lifer.settings[current_collection.name] || Lifer.settings[:root]
79
+ current_uri_strategy =
80
+ collection_settings && collection_settings[:uri_strategy] ||
81
+ FALLBACK_URI_STRATEGY
82
+
83
+ Lifer::URIStrategy.find_by_name(current_uri_strategy).new(root: root)
84
+ end
73
85
  end
data/lib/lifer/entry.rb CHANGED
@@ -1,8 +1,11 @@
1
+ require "date"
1
2
  require "kramdown"
3
+ require "time"
2
4
 
3
5
  require_relative "utilities"
4
6
 
5
7
  class Lifer::Entry
8
+ FILENAME_DATE_FORMAT = /^(\d{4}-\d{1,2}-\d{1,2})-/
6
9
  FRONTMATTER_REGEX = /^---\n(.*)---\n/m
7
10
 
8
11
  attr_reader :file
@@ -17,18 +20,31 @@ class Lifer::Entry
17
20
  full_text.gsub(FRONTMATTER_REGEX, "").strip
18
21
  end
19
22
 
23
+ def date
24
+ date_data = frontmatter[:date] || filename_date
25
+
26
+ case date_data
27
+ when Time then date_data
28
+ when String then DateTime.parse(date_data).to_time
29
+ else
30
+ puts "[%s]: no date metadata" % [file]
31
+ nil
32
+ end
33
+ rescue ArgumentError => error
34
+ puts "[%s]: %s" % [file, error]
35
+ nil
36
+ end
37
+
20
38
  def frontmatter
21
- return nil unless frontmatter?
39
+ return {} unless frontmatter?
22
40
 
23
41
  Lifer::Utilities.symbolize_keys(
24
- YAML.load full_text[FRONTMATTER_REGEX, 1]
42
+ YAML.load(full_text[FRONTMATTER_REGEX, 1], permitted_classes: [Time])
25
43
  )
26
44
  end
27
45
 
28
46
  def full_text
29
- return unless file
30
-
31
- File.readlines(file).join
47
+ File.readlines(file).join if file
32
48
  end
33
49
 
34
50
  def to_html
@@ -37,7 +53,13 @@ class Lifer::Entry
37
53
 
38
54
  private
39
55
 
56
+ def filename_date
57
+ return unless file && File.basename(file).match?(FILENAME_DATE_FORMAT)
58
+
59
+ File.basename(file).match(FILENAME_DATE_FORMAT)[1]
60
+ end
61
+
40
62
  def frontmatter?
41
- full_text.match? FRONTMATTER_REGEX
63
+ full_text && full_text.match?(FRONTMATTER_REGEX)
42
64
  end
43
65
  end
@@ -1,19 +1,15 @@
1
1
  class Lifer::URIStrategy::Base
2
- attr_reader :directory
2
+ attr_reader :root
3
3
 
4
- def initialize(directory:)
5
- @directory = directory
4
+ def initialize(root:)
5
+ @root = root
6
6
  end
7
7
 
8
8
  def name
9
9
  raise NotImplementedError, "implement on a subclass"
10
10
  end
11
11
 
12
- def dirname_for(entry)
13
- raise NotImplementedError, "implement on a subclass"
14
- end
15
-
16
- def file_for(entry)
12
+ def output_file(entry)
17
13
  raise NotImplementedError, "implement on a subclass"
18
14
  end
19
15
  end
@@ -0,0 +1,13 @@
1
+ class Lifer::URIStrategy::Pretty < Lifer::URIStrategy::Base
2
+ def name
3
+ "pretty"
4
+ end
5
+
6
+ def output_file(entry)
7
+ basename = File.basename(entry.file, ".*")
8
+
9
+ Pathname entry.file.to_s
10
+ .gsub(/#{root}[\/]{0,1}/, "")
11
+ .gsub(/#{basename}(\..+)/, "#{basename}/index.html")
12
+ end
13
+ end
@@ -1,23 +1,13 @@
1
1
  class Lifer::URIStrategy::Simple < Lifer::URIStrategy::Base
2
- def name_for(entry)
3
- File.basename(entry.file, ".*")
2
+ def name
3
+ "simple"
4
4
  end
5
5
 
6
- def dirname_for(entry)
7
- return nil if (path = entry.file.dirname.to_s) == directory.to_s
6
+ def output_file(entry)
7
+ basename = File.basename(entry.file, ".*")
8
8
 
9
- Pathname entry.file.dirname.to_s.gsub(
10
- /#{directory}[\/]{0,1}/,
11
- ""
12
- )
13
- end
14
-
15
- def file_for(entry)
16
- Pathname(
17
- [
18
- dirname_for(entry),
19
- ("%s.html" % name_for(entry))
20
- ].compact.join("/")
21
- )
9
+ Pathname entry.file.to_s
10
+ .gsub(/#{root}[\/]{0,1}/, "")
11
+ .gsub(/#{basename}(\..+)/, "#{basename}.html")
22
12
  end
23
13
  end
@@ -1,4 +1,13 @@
1
- module Lifer::URIStrategy; end
1
+ class Lifer::URIStrategy
2
+ class << self
3
+ def find_by_name(name)
4
+ self.const_get name.capitalize
5
+ rescue NameError => error
6
+ raise StandardError, "no URI strategy '#{name}'"
7
+ end
8
+ end
9
+ end
2
10
 
3
11
  require_relative "uri_strategy/base"
12
+ require_relative "uri_strategy/pretty"
4
13
  require_relative "uri_strategy/simple"
data/lifer.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lifer
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
6
6
 
7
7
  Gem::Specification.new do |spec|
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.summary = "Minimal static weblog generator."
14
14
  spec.description = "Minimal static weblog generator. Good RSS feeds."
15
15
  spec.homepage = "https://github.com/benjaminwil/lifer"
16
- spec.required_ruby_version = ">= 2.4.0"
16
+ spec.required_ruby_version = ">= 3.1"
17
17
 
18
18
  spec.metadata["allowed_push_host"] = "https://rubygems.org"
19
19
 
@@ -35,4 +35,6 @@ Gem::Specification.new do |spec|
35
35
  spec.require_paths = ["lib"]
36
36
 
37
37
  spec.add_dependency "kramdown", "~> 2.4"
38
+
39
+ spec.add_development_dependency "debug"
38
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lifer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - benjamin wil
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-21 00:00:00.000000000 Z
11
+ date: 2022-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kramdown
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: debug
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Minimal static weblog generator. Good RSS feeds.
28
42
  email:
29
43
  - benjamin@super.gd
@@ -33,7 +47,6 @@ extra_rdoc_files: []
33
47
  files:
34
48
  - ".github/workflows/main.yml"
35
49
  - ".gitignore"
36
- - ".rspec"
37
50
  - Gemfile
38
51
  - Gemfile.lock
39
52
  - README.md
@@ -53,6 +66,7 @@ files:
53
66
  - lib/lifer/templates/layout.html.erb
54
67
  - lib/lifer/uri_strategy.rb
55
68
  - lib/lifer/uri_strategy/base.rb
69
+ - lib/lifer/uri_strategy/pretty.rb
56
70
  - lib/lifer/uri_strategy/simple.rb
57
71
  - lib/lifer/utilities.rb
58
72
  - lifer.gemspec
@@ -71,14 +85,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - ">="
73
87
  - !ruby/object:Gem::Version
74
- version: 2.4.0
88
+ version: '3.1'
75
89
  required_rubygems_version: !ruby/object:Gem::Requirement
76
90
  requirements:
77
91
  - - ">="
78
92
  - !ruby/object:Gem::Version
79
93
  version: '0'
80
94
  requirements: []
81
- rubygems_version: 3.2.22
95
+ rubygems_version: 3.3.7
82
96
  signing_key:
83
97
  specification_version: 4
84
98
  summary: Minimal static weblog generator.
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- --require spec_helper