lifer 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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