yard-timekeeper 0.1.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.
data/certs/pboling.pem ADDED
@@ -0,0 +1,27 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
3
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
4
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
5
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
6
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
7
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
8
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
9
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
10
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
11
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
12
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
13
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
14
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
15
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
16
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
17
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
18
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
19
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
20
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
21
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
22
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
23
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
24
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
25
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
26
+ L9nRqA==
27
+ -----END CERTIFICATE-----
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yard
4
+ module Timekeeper
5
+ module Version
6
+ VERSION = "0.1.0"
7
+ end
8
+ VERSION = Version::VERSION # Traditional Constant Location
9
+ end
10
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+ require "version_gem"
5
+ require_relative "timekeeper/version"
6
+
7
+ Yard::Timekeeper::Version.class_eval do
8
+ extend VersionGem::Basic
9
+ end
10
+
11
+ module Yard
12
+ module Timekeeper
13
+ class Error < StandardError; end
14
+ RAKE_INTEGRATIONS = {}
15
+ RAKE_INTEGRATIONS_MUTEX = Mutex.new
16
+
17
+ TIMESTAMP_DIFF_LINE_RE = /\A[+-]\s{2}Generated on .+ by\s*\z/
18
+ DIFF_METADATA_PREFIXES = [
19
+ "diff --git ",
20
+ "index ",
21
+ "--- ",
22
+ "+++ ",
23
+ "@@ ",
24
+ ].freeze
25
+
26
+ class << self
27
+ def postprocess_html_docs
28
+ return unless enabled?
29
+
30
+ docs_dir = File.join(Dir.pwd, "docs")
31
+ return unless Dir.exist?(docs_dir)
32
+
33
+ root = git_root
34
+ return unless root
35
+
36
+ changed_docs_files(root).each do |relative_path|
37
+ next unless relative_path.end_with?(".html")
38
+ next unless timestamp_only_diff?(git_diff(relative_path, root))
39
+
40
+ restore_file(relative_path, root)
41
+ end
42
+ rescue StandardError => e
43
+ warn("Yard::Timekeeper.postprocess_html_docs failed: #{e.class}: #{e.message}")
44
+ end
45
+
46
+ def run_at_exit
47
+ postprocess_html_docs
48
+ end
49
+
50
+ def install_rake_tasks!(yard_task_name = :yard)
51
+ return false unless defined?(::Rake::Task) && ::Rake::Task.task_defined?(yard_task_name)
52
+
53
+ RAKE_INTEGRATIONS_MUTEX.synchronize do
54
+ key = yard_task_name.to_s
55
+ unless RAKE_INTEGRATIONS[key]
56
+ ::Rake::Task[yard_task_name].enhance { ::Yard::Timekeeper.postprocess_html_docs }
57
+ RAKE_INTEGRATIONS[key] = true
58
+ end
59
+ end
60
+
61
+ true
62
+ end
63
+
64
+ def __reset_rake_integrations__
65
+ RAKE_INTEGRATIONS_MUTEX.synchronize { RAKE_INTEGRATIONS.clear }
66
+ nil
67
+ end
68
+
69
+ def enabled?
70
+ !ENV.fetch("YARD_TIMEKEEPER_DISABLE", "false").casecmp?("true")
71
+ end
72
+
73
+ def git_root
74
+ stdout, status = Open3.capture2("git", "rev-parse", "--show-toplevel", chdir: Dir.pwd)
75
+ return unless status.success?
76
+
77
+ stdout.strip
78
+ rescue Errno::ENOENT
79
+ nil
80
+ end
81
+
82
+ def changed_docs_files(root)
83
+ stdout, status = Open3.capture2("git", "diff", "--name-only", "--relative", "--", "docs", chdir: root)
84
+ return [] unless status.success?
85
+
86
+ stdout.lines.map(&:strip).reject(&:empty?)
87
+ rescue Errno::ENOENT
88
+ []
89
+ end
90
+
91
+ def git_diff(path, root)
92
+ stdout, _status = Open3.capture2(
93
+ "git",
94
+ "diff",
95
+ "--no-ext-diff",
96
+ "--no-color",
97
+ "--unified=0",
98
+ "--",
99
+ path,
100
+ chdir: root,
101
+ )
102
+ stdout
103
+ end
104
+
105
+ def timestamp_only_diff?(diff_text)
106
+ return false if diff_text.to_s.strip.empty?
107
+
108
+ change_lines = []
109
+
110
+ diff_text.each_line do |line|
111
+ next if DIFF_METADATA_PREFIXES.any? { |prefix| line.start_with?(prefix) }
112
+ next if line.strip.empty?
113
+
114
+ return false unless line.match?(TIMESTAMP_DIFF_LINE_RE)
115
+
116
+ change_lines << line
117
+ end
118
+
119
+ change_lines.size == 2 &&
120
+ change_lines.one? { |line| line.start_with?("-") } &&
121
+ change_lines.one? { |line| line.start_with?("+") }
122
+ end
123
+
124
+ def restore_file(path, root)
125
+ _stdout, _stderr, status = Open3.capture3("git", "checkout", "--", path, chdir: root)
126
+ status.success?
127
+ rescue Errno::ENOENT
128
+ false
129
+ end
130
+ end
131
+ end
132
+ end
133
+ # Rake integration is explicit. Call Yard::Timekeeper.install_rake_tasks! from
134
+ # your Rakefile after defining the :yard task so postprocess only runs for
135
+ # documentation builds, never for unrelated processes that happen to load YARD.
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ # YARD plugin loader for `--plugin timekeeper`.
4
+ # YARD tries requiring several patterns; providing `yard-timekeeper` ensures
5
+ # it can be loaded regardless of whether YARD attempts `yard-timekeeper`
6
+ # or `yard/timekeeper`.
7
+ require_relative "yard/timekeeper"
@@ -0,0 +1,9 @@
1
+ module Yard
2
+ module Timekeeper
3
+ module Version
4
+ VERSION: String
5
+ end
6
+ VERSION: String
7
+ end
8
+ end
9
+
@@ -0,0 +1,6 @@
1
+ module Yard
2
+ module Timekeeper
3
+ VERSION: String
4
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
5
+ end
6
+ end
data.tar.gz.sig ADDED
Binary file
metadata ADDED
@@ -0,0 +1,292 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: yard-timekeeper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter H. Boling
8
+ bindir: exe
9
+ cert_chain:
10
+ - |
11
+ -----BEGIN CERTIFICATE-----
12
+ MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
13
+ ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
14
+ A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
15
+ DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
16
+ LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
17
+ uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
18
+ LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
19
+ mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
20
+ coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
21
+ FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
22
+ yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
23
+ to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
24
+ qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
25
+ fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
26
+ HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
27
+ A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
28
+ ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
29
+ wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
30
+ L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
31
+ GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
32
+ kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
33
+ QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
34
+ 0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
35
+ DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
36
+ L9nRqA==
37
+ -----END CERTIFICATE-----
38
+ date: 1980-01-02 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: version_gem
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.1'
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.1.9
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '1.1'
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: 1.1.9
60
+ - !ruby/object:Gem::Dependency
61
+ name: kettle-dev
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '2.0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '2.0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: bundler-audit
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 0.9.3
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: 0.9.3
88
+ - !ruby/object:Gem::Dependency
89
+ name: rake
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '13.0'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '13.0'
102
+ - !ruby/object:Gem::Dependency
103
+ name: require_bench
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.0'
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 1.0.4
112
+ type: :development
113
+ prerelease: false
114
+ version_requirements: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '1.0'
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: 1.0.4
122
+ - !ruby/object:Gem::Dependency
123
+ name: appraisal2
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: '3.0'
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 3.0.6
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '3.0'
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: 3.0.6
142
+ - !ruby/object:Gem::Dependency
143
+ name: kettle-test
144
+ requirement: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '2.0'
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: 2.0.0
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '2.0'
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: 2.0.0
162
+ - !ruby/object:Gem::Dependency
163
+ name: ruby-progressbar
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '1.13'
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: '1.13'
176
+ - !ruby/object:Gem::Dependency
177
+ name: stone_checksums
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: '1.0'
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 1.0.3
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '1.0'
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: 1.0.3
196
+ - !ruby/object:Gem::Dependency
197
+ name: gitmoji-regex
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: '1.0'
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: 1.0.3
206
+ type: :development
207
+ prerelease: false
208
+ version_requirements: !ruby/object:Gem::Requirement
209
+ requirements:
210
+ - - "~>"
211
+ - !ruby/object:Gem::Version
212
+ version: '1.0'
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: 1.0.3
216
+ description: "\U0001F570️ A YARD plugin that post-processes generated docs, detects
217
+ timestamp-only diffs in tracked HTML files under docs/, and restores those files
218
+ from git to prevent pointless churn while keeping the footer timestamp on genuinely
219
+ changed pages."
220
+ email:
221
+ - peter.boling@gmail.com
222
+ executables: []
223
+ extensions: []
224
+ extra_rdoc_files:
225
+ - CHANGELOG.md
226
+ - CITATION.cff
227
+ - CODE_OF_CONDUCT.md
228
+ - CONTRIBUTING.md
229
+ - FUNDING.md
230
+ - LICENSE.md
231
+ - README.md
232
+ - RUBOCOP.md
233
+ - SECURITY.md
234
+ files:
235
+ - CHANGELOG.md
236
+ - CITATION.cff
237
+ - CODE_OF_CONDUCT.md
238
+ - CONTRIBUTING.md
239
+ - FUNDING.md
240
+ - LICENSE.md
241
+ - README.md
242
+ - RUBOCOP.md
243
+ - SECURITY.md
244
+ - certs/pboling.pem
245
+ - lib/yard-timekeeper.rb
246
+ - lib/yard/timekeeper.rb
247
+ - lib/yard/timekeeper/version.rb
248
+ - sig/yard/timekeeper.rbs
249
+ - sig/yard/timekeeper/version.rbs
250
+ homepage: https://github.com/galtzo-floss/yard-timekeeper
251
+ licenses:
252
+ - MIT
253
+ metadata:
254
+ homepage_uri: https://yard-timekeeper.galtzo.com
255
+ source_code_uri: https://github.com/galtzo-floss/yard-timekeeper/tree/v0.1.0
256
+ changelog_uri: https://github.com/galtzo-floss/yard-timekeeper/blob/v0.1.0/CHANGELOG.md
257
+ bug_tracker_uri: https://github.com/galtzo-floss/yard-timekeeper/issues
258
+ documentation_uri: https://www.rubydoc.info/gems/yard-timekeeper/0.1.0
259
+ funding_uri: https://github.com/sponsors/pboling
260
+ wiki_uri: https://github.com/galtzo-floss/yard-timekeeper/wiki
261
+ news_uri: https://www.railsbling.com/tags/yard-timekeeper
262
+ discord_uri: https://discord.gg/3qme4XHNKN
263
+ rubygems_mfa_required: 'true'
264
+ rdoc_options:
265
+ - "--title"
266
+ - "yard-timekeeper - \U0001F570️ Preserve tracked YARD docs when only the generated
267
+ timestamp changed."
268
+ - "--main"
269
+ - README.md
270
+ - "--exclude"
271
+ - "^sig/"
272
+ - "--line-numbers"
273
+ - "--inline-source"
274
+ - "--quiet"
275
+ require_paths:
276
+ - lib
277
+ required_ruby_version: !ruby/object:Gem::Requirement
278
+ requirements:
279
+ - - ">="
280
+ - !ruby/object:Gem::Version
281
+ version: 3.2.0
282
+ required_rubygems_version: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - ">="
285
+ - !ruby/object:Gem::Version
286
+ version: '0'
287
+ requirements: []
288
+ rubygems_version: 4.0.11
289
+ specification_version: 4
290
+ summary: "\U0001F570️ Preserve tracked YARD docs when only the generated timestamp
291
+ changed."
292
+ test_files: []
metadata.gz.sig ADDED
Binary file