jekyll-last-modified-date 1.3.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1e17aa123ab964e982f6532ce856f7e5795ecb477a0a54c3075f0275f18e77d4
4
+ data.tar.gz: 4dff3e6ebb2155feecc3199c29057d886103cdb1d74c41712d72dd1e035b01eb
5
+ SHA512:
6
+ metadata.gz: 721150c3de5fe5292ddbae1bba9c626f74c36b657bac359eb01ad7637c3230eb51b40a5777d5e84b1a8a2bc74d3edcf98bcae1144f538acfc419a851e94b7775
7
+ data.tar.gz: a92d3fa5b4ad62053dfe2c947cea0b7cb72ed18a668ff948642b5ba383eb2bb105ad6c3e626b430a83f440006ba921134e5d601487a944408b2410ebd59a3caa
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module LastModifiedDate
5
+ require 'jekyll-last-modified-date/tag'
6
+ require 'jekyll-last-modified-date/hook'
7
+
8
+ autoload :VERSION, 'jekyll-last-modified-date/version'
9
+ autoload :Executor, 'jekyll-last-modified-date/executor'
10
+ autoload :Determinator, 'jekyll-last-modified-date/determinator'
11
+ autoload :Git, 'jekyll-last-modified-date/git'
12
+
13
+ PATH_CACHE = {} # rubocop:disable Style/MutableConstant
14
+ REPO_CACHE = {} # rubocop:disable Style/MutableConstant
15
+ end
16
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module LastModifiedDate
5
+ class Determinator
6
+ attr_reader :site_source, :page_path
7
+ attr_accessor :format
8
+
9
+ def initialize(site_source, page_path, format = nil)
10
+ @site_source = site_source
11
+ @page_path = page_path
12
+ @format = format || '%d-%b-%y'
13
+ end
14
+
15
+ def git
16
+ return REPO_CACHE[site_source] unless REPO_CACHE[site_source].nil?
17
+
18
+ REPO_CACHE[site_source] = Git.new(site_source)
19
+ REPO_CACHE[site_source]
20
+ end
21
+
22
+ def formatted_last_modified_date
23
+ return PATH_CACHE[page_path] unless PATH_CACHE[page_path].nil?
24
+
25
+ last_modified = last_modified_at_time.strftime(@format)
26
+ PATH_CACHE[page_path] = last_modified
27
+ last_modified
28
+ end
29
+
30
+ def last_modified_at_time
31
+ raise Errno::ENOENT, "#{absolute_path_to_article} does not exist!" unless File.exist? absolute_path_to_article
32
+
33
+ Time.at(last_modified_at_unix.to_i)
34
+ end
35
+
36
+ def last_modified_at_unix
37
+ if git.git_repo?
38
+ last_commit_date = Executor.sh(
39
+ 'git',
40
+ '--git-dir',
41
+ git.top_level_directory,
42
+ 'log',
43
+ '-n',
44
+ '1',
45
+ '--format="%ct"',
46
+ '--',
47
+ relative_path_from_git_dir
48
+ )[/\d+/]
49
+ # last_commit_date can be nil iff the file was not committed.
50
+ last_commit_date.nil? || last_commit_date.empty? ? mtime(absolute_path_to_article) : last_commit_date
51
+ else
52
+ mtime(absolute_path_to_article)
53
+ end
54
+ end
55
+
56
+ def to_s
57
+ @to_s ||= formatted_last_modified_date
58
+ end
59
+
60
+ def to_liquid
61
+ @to_liquid ||= last_modified_at_time
62
+ end
63
+
64
+ private
65
+
66
+ def absolute_path_to_article
67
+ @absolute_path_to_article ||= Jekyll.sanitized_path(site_source, @page_path)
68
+ end
69
+
70
+ def relative_path_from_git_dir
71
+ return nil unless git.git_repo?
72
+
73
+ @relative_path_from_git_dir ||= Pathname.new(absolute_path_to_article)
74
+ .relative_path_from(
75
+ Pathname.new(File.dirname(git.top_level_directory))
76
+ ).to_s
77
+ end
78
+
79
+ def mtime(file)
80
+ File.mtime(file).to_i.to_s
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'posix/spawn'
4
+
5
+ module Jekyll
6
+ module LastModifiedDate
7
+ module Executor
8
+ extend POSIX::Spawn
9
+
10
+ def self.sh(*args)
11
+ r, w = IO.pipe
12
+ e, eo = IO.pipe
13
+ pid = spawn(*args,
14
+ :out => w, r => :close,
15
+ :err => eo, e => :close)
16
+
17
+ if pid.positive?
18
+ w.close
19
+ eo.close
20
+ out = r.read
21
+ err = e.read
22
+ ::Process.waitpid(pid)
23
+ "#{out} #{err}".strip if out
24
+ end
25
+ ensure
26
+ [r, w, e, eo].each do |io|
27
+ begin
28
+ io.close
29
+ rescue StandardError
30
+ nil
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module LastModifiedDate
5
+ class Git
6
+ attr_reader :site_source
7
+
8
+ def initialize(site_source)
9
+ @site_source = site_source
10
+ @is_git_repo = nil
11
+ end
12
+
13
+ def top_level_directory
14
+ return nil unless git_repo?
15
+
16
+ @top_level_directory ||= begin
17
+ Dir.chdir(@site_source) do
18
+ @top_level_directory = File.join(Executor.sh('git', 'rev-parse', '--show-toplevel'), '.git')
19
+ end
20
+ rescue StandardError
21
+ ''
22
+ end
23
+ end
24
+
25
+ def git_repo?
26
+ return @is_git_repo unless @is_git_repo.nil?
27
+
28
+ @is_git_repo = begin
29
+ Dir.chdir(@site_source) do
30
+ Executor.sh('git', 'rev-parse', '--is-inside-work-tree').eql? 'true'
31
+ end
32
+ rescue StandardError
33
+ false
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module LastModifiedDate
5
+ module Hook
6
+ def self.add_determinator_proc
7
+ proc { |item|
8
+ format = item.site.config.dig('last-modified-date', 'date-format')
9
+ item.data['last_modified_date'] = Determinator.new(item.site.source, item.path,
10
+ format)
11
+ }
12
+ end
13
+
14
+ Jekyll::Hooks.register :posts, :post_init, &Hook.add_determinator_proc
15
+ Jekyll::Hooks.register :pages, :post_init, &Hook.add_determinator_proc
16
+ Jekyll::Hooks.register :documents, :post_init, &Hook.add_determinator_proc
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module LastModifiedDate
5
+ class Tag < Liquid::Tag
6
+ def initialize(tag_name, format, tokens)
7
+ super
8
+ @format = format.empty? ? nil : format.strip
9
+ end
10
+
11
+ def render(context)
12
+ site = context.registers[:site]
13
+ format = @format || site.config.dig('last-modified-date', 'date-format')
14
+ article_file = context.environments.first['page']['path']
15
+ Determinator.new(site.source, article_file, format)
16
+ .formatted_last_modified_date
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ Liquid::Template.register_tag('last_modified_date', Jekyll::LastModifiedDate::Tag)
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module LastModifiedDate
5
+ VERSION = '1.3.1'
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-last-modified-date
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Garen J. Torikian
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jekyll
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '3.7'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '3.7'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: posix-spawn
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 0.3.9
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 0.3.9
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.4'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.4'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rubocop
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rubocop-performance
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rubocop-standard
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: spork
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ description:
132
+ email:
133
+ executables: []
134
+ extensions: []
135
+ extra_rdoc_files: []
136
+ files:
137
+ - lib/jekyll-last-modified-date.rb
138
+ - lib/jekyll-last-modified-date/determinator.rb
139
+ - lib/jekyll-last-modified-date/executor.rb
140
+ - lib/jekyll-last-modified-date/git.rb
141
+ - lib/jekyll-last-modified-date/hook.rb
142
+ - lib/jekyll-last-modified-date/tag.rb
143
+ - lib/jekyll-last-modified-date/version.rb
144
+ homepage: https://github.com/Hofled/jekyll-last-modified-at
145
+ licenses:
146
+ - MIT
147
+ metadata: {}
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubygems_version: 3.1.2
164
+ signing_key:
165
+ specification_version: 4
166
+ summary: A liquid tag for Jekyll to indicate the last time a file was modified.
167
+ test_files: []