chlog 0.9.0 → 1.7.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of chlog might be problematic. Click here for more details.

Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. data/bin/chlog +586 -0
  3. data/lib/chlog.rb +4 -408
  4. metadata +7 -8
  5. data/exe/chlog +0 -82
  6. data/lib/chlog/version.rb +0 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c501c040c85ebeba5c6171f5dfb6dcb6fddec08798166cd1beb0fce54dd27df
4
- data.tar.gz: ec9bc451993d99992ae38d5ee2db80190e1fc55e5853d8665e6d31186be941cc
3
+ metadata.gz: 897021483e018487b53a23f88702691ad77e3d069d728a756fa80c34545d7be5
4
+ data.tar.gz: 8ddea1a85e7b876421fcce94588c45b7dc7aaf6c0fc3e82ce447cac7ae58335b
5
5
  SHA512:
6
- metadata.gz: 2bc058d3d29b835fdfea8577cec9195e75b2b30069f2b8ca4e49f942a228b3de600c741fdf302701dc02579cb9db62685990297a0c330b69d8993ecd838b1ecb
7
- data.tar.gz: d8517e795b3bb1e4d9b9666bbeabcf92ac987e3a280275644ac5779e03e8fd68149f62d28c3c447da38087ddf5c2a6f9de67d55350b18845cdb5a6f531f6407e
6
+ metadata.gz: 8a2fa90247df6ff9530ee3225f864504a24d443e1c08d7eeea98370eee08b1d9ff9c0d1ad240a3c63503aba2d1e664b144404d0dcf55437aae412b7401e98d4a
7
+ data.tar.gz: f6fef05a62232c12ae7bccc7fbc91e2b7f011dd517268663944931e81484ddb7f5230db60ee29406be8cf75f10ba104aaf9b4d44e0d4f7016cda5280ac41bfef
data/bin/chlog ADDED
@@ -0,0 +1,586 @@
1
+ #!/usr/bin/env ruby
2
+ # ------------------------------------------------------
3
+ # File : chlog.rb
4
+ # Authors : ccmywish <ccmywish@qq.com>
5
+ # Created on : <2022-03-18>
6
+ # Last modified : <2022-11-29>
7
+ #
8
+ # chlog:
9
+ #
10
+ # Maintain your project's Changelog on the cli.
11
+ #
12
+ # ------------------------------------------------------
13
+
14
+ require 'chlog'
15
+ require 'highline'
16
+ require 'date'
17
+ require 'open3'
18
+
19
+ HL = HighLine.new
20
+
21
+ $today = Date.today.to_s
22
+
23
+ UNRELEASED_TITLE = "## [Unreleased](#) (#$today)"
24
+
25
+ CHLOG_TEMPLATE = <<EOT
26
+ # Changelog
27
+
28
+ #{UNRELEASED_TITLE}
29
+
30
+ <br>
31
+
32
+ ## [Initialize](#) (#$today)
33
+
34
+ <br>
35
+
36
+ <hr>
37
+
38
+ This Changelog is maintained with [chlog](https://github.com/ccmywish/chlog)
39
+
40
+ EOT
41
+
42
+
43
+ # Prevent current directory is not git directory
44
+ Open3.popen3("git rev-parse --show-toplevel") do |i, o, err, t|
45
+ if err.read.include?("fatal: not a git repository")
46
+ puts "chlog: Not a git directory!"
47
+ exit
48
+ else
49
+ $Changelog_file = `git rev-parse --show-toplevel`.chomp + '/CHANGELOG.md'
50
+ end
51
+ end
52
+
53
+
54
+
55
+ def get_changelog
56
+ file = $Changelog_file
57
+ if File.exists? file
58
+ return File.read file
59
+ else
60
+ puts "chlog: Auto generate #$Changelog_file"
61
+ File.write(file, CHLOG_TEMPLATE)
62
+ return File.read file
63
+ end
64
+ end
65
+
66
+
67
+ def help
68
+ puts <<EOH
69
+ chlog (v#{CHLOG_GEM_VERSION}): Help maintain the Changelog of your projects
70
+
71
+ usage:
72
+
73
+ chlog => Generate CHANGELOG.md in git root
74
+ chlog -r 3.14 => Release version to v3.14
75
+ chlog -g [-m] [--sub] => Reuse last Git log [main category/sub category]
76
+ chlog [--sub] log => Determine main category [sub category] add log
77
+ chlog -n [--sub] log => Add log to New features [sub category]
78
+ chlog -e [--sub] log => Add log to Enhancements [sub category]
79
+ chlog -b [--sub] log => Add log to Bug fixes [sub category]
80
+ chlog -s [--sub] log => Add log to Security [sub category]
81
+ chlog -c [--sub] log => Add log to Compatibility[sub category]
82
+ chlog -d [--sub] log => Add log to Deprecations [sub category]
83
+
84
+ EOH
85
+
86
+ end
87
+
88
+ def match_unreleased?(str)
89
+ str =~ /^## \[Unreleased\]\(.*\) \(\d{4}-\d\d-\d\d\)/
90
+ end
91
+
92
+ def match_unreleased_fail!(str)
93
+ unless match_unreleased?(str)
94
+ puts "chlog: Unmathed format with chlog"
95
+ # "#{lns[1][1..]}"
96
+ puts " Unreleased version must be the third line.", ""
97
+ exit -1
98
+ end
99
+ end
100
+
101
+ def match_new_features?(str)
102
+ str =~ /^### New features:/
103
+ end
104
+
105
+ def match_enhancements?(str)
106
+ str =~ /^### Enhancements:/
107
+ end
108
+
109
+ def match_bug_fixes?(str)
110
+ str =~ /^### Bug fixes:/
111
+ end
112
+
113
+ def match_security?(str)
114
+ str =~ /^### Security:/
115
+ end
116
+
117
+ def match_compatibility?(str)
118
+ str =~ /^### Compatibility:/
119
+ end
120
+
121
+ def match_deprecations?(str)
122
+ str =~ /^### Deprecations:/
123
+ end
124
+
125
+
126
+ def next_version_index(lns_array)
127
+ nvi = lns_array[3..].each_with_index {break _2 if _1.start_with?("## [") }
128
+ nvi += 3
129
+ end
130
+
131
+ def next_category_index(lns_array)
132
+ nci = lns_array[3...nvi].each_with_index {break _2 if _1.start_with?("### ") }
133
+
134
+ # The not match return value is not nil!! But an array!!
135
+ if nci.is_a(Integer)
136
+ nci += 3
137
+ else
138
+ nil
139
+ end
140
+ end
141
+
142
+
143
+ #
144
+ # ### New features:
145
+ #
146
+ # - xaaaaa
147
+ # - xbbbbb
148
+ # - xccccc [-> this]
149
+ #
150
+ def find_main_category_last_list_item_index(lns,
151
+ main_cat_index,
152
+ first_lower_order_category_index)
153
+ mci = main_cat_index
154
+ nci = first_lower_order_category_index
155
+
156
+ list_i = lns[mci+2..nci].each_with_index do
157
+ break _2 if _1 !~ /^- .*/
158
+ end
159
+ list_i += mci+2 - 1
160
+ end
161
+
162
+
163
+ ORDER_TABLE = %w[
164
+ new_features
165
+ enhancements
166
+ bug_fixes
167
+ security
168
+ compatibility
169
+ deprecations
170
+ ]
171
+
172
+ # New features
173
+ # Enhancements
174
+ # Bug fixes
175
+ # Security
176
+ # Compatibility
177
+ # Deprecations
178
+ CATEGORY_TABLE = ORDER_TABLE.map do
179
+ _1.split('_').join(' ').capitalize
180
+ end
181
+
182
+ MATCH_TABLE = ORDER_TABLE.map do
183
+ ('match_' + _1 + '?').to_sym
184
+ end
185
+
186
+ METHOD_HASH_TABLE = ([1,2,3,4,5,6].zip ORDER_TABLE.map {|m| ('add_to_' + m).to_sym }).to_h
187
+
188
+
189
+
190
+ def first_lower_order_category_index(lns_array, category_order)
191
+
192
+ o = category_order
193
+
194
+ nvi = next_version_index(lns_array)
195
+
196
+ while o < MATCH_TABLE.size
197
+ lns_array[0...nvi].each_with_index do
198
+ if send(MATCH_TABLE[o], _1)
199
+ return _2
200
+ end
201
+ end
202
+ o += 1
203
+ end
204
+
205
+ # Next version above
206
+ return (nvi - 2)
207
+ end
208
+
209
+
210
+
211
+ #
212
+ # A meta function: do the real work other 6 functions delegate
213
+ #
214
+ # This function detect the main category, and then handle the
215
+ # sub category.
216
+ #
217
+ def meta_add_to_a_category(log, main_category_order, category)
218
+
219
+ content = get_changelog
220
+ lns = content.lines
221
+
222
+ match_unreleased_fail!(lns[2])
223
+
224
+ nvi = next_version_index(lns)
225
+ # To find the existing category line
226
+ main_cat_i = lns[0...nvi].each_with_index do
227
+ # Adjust to index of the order table
228
+ break _2 if send(MATCH_TABLE[main_category_order-1], _1)
229
+ end
230
+
231
+ #
232
+ # Always update to latest time when making a log
233
+ #
234
+ # We must add a "\n" because every element of the array
235
+ # is a sentence with a trailing newline, then they can
236
+ # be 'joined' to a working long string
237
+ #
238
+ lns[2] = UNRELEASED_TITLE + "\n"
239
+
240
+ f_l_o_c_i = first_lower_order_category_index(lns, main_category_order)
241
+
242
+ if main_cat_i.class != Integer
243
+ ################################################################################
244
+ # The main category not exists
245
+ ################################################################################
246
+
247
+
248
+ ########################################
249
+ if $sub_category
250
+
251
+ # Because the main category not exists,
252
+ # nor does the sub category
253
+ #
254
+ sub_cat_i = f_l_o_c_i
255
+ to_wr = lns[0...sub_cat_i].join + "### #{category}:\n\n" + "**#{$sub_category}**\n\n" + ' - ' + log + "\n\n"
256
+ File.write($Changelog_file, to_wr + lns[sub_cat_i..].join)
257
+
258
+ puts "chlog: Add log to #{category}/#{$sub_category}"
259
+ return
260
+ end # end of if $sub_category
261
+ ########################################
262
+
263
+
264
+ # situation: no sub category
265
+
266
+ # Not need adjust to the index of the order table
267
+ log_loc = f_l_o_c_i
268
+ puts "chlog: Add '#{category}' category"
269
+ to_wr = lns[0...(log_loc)].join + "### #{category}:\n\n" + '- ' + log + "\n"
270
+ File.write($Changelog_file, to_wr + lns[log_loc-1..].join)
271
+
272
+ else
273
+ ################################################################################
274
+ # The main category exists
275
+ ################################################################################
276
+
277
+
278
+ ########################################
279
+ if $sub_category
280
+
281
+ # from first list item to next main cat
282
+ # search if sub cat already exists
283
+ sub_cat_i = lns[main_cat_i+2...f_l_o_c_i].each_with_index do
284
+ break _2 if _1 =~ /^\*\*#{$sub_category}\*\*/
285
+ end
286
+
287
+ if !sub_cat_i.is_a?(Integer)
288
+ # the sub category not exists
289
+
290
+ sub_cat_i = 2 + find_main_category_last_list_item_index(lns,main_cat_i,f_l_o_c_i)
291
+ to_wr = lns[0...sub_cat_i].join + "**#{$sub_category}**\n\n" + ' - ' + log + "\n\n"
292
+ File.write($Changelog_file, to_wr + lns[sub_cat_i..].join)
293
+ else
294
+ # the sub category exists
295
+
296
+ sub_cat_i += main_cat_i+2
297
+ to_wr = lns[0..sub_cat_i+1].join + ' - ' + log + "\n"
298
+ File.write($Changelog_file, to_wr + lns[sub_cat_i+2..].join)
299
+ end
300
+
301
+ puts "chlog: Add log to #{category}/#{$sub_category}"
302
+ return
303
+ end # end of if $sub_category
304
+ ########################################
305
+
306
+
307
+
308
+ # situation: no sub category
309
+
310
+ to_wr = lns[0..main_cat_i+1].join + '- ' + log + "\n"
311
+
312
+ # main category list should be separated with
313
+ # sub category
314
+ if lns[main_cat_i+2] =~ /\*\*.*/
315
+ to_wr += "\n"
316
+ end
317
+ File.write($Changelog_file, to_wr + lns[main_cat_i+2..].join)
318
+ end
319
+
320
+ puts "chlog: Add log to #{category}"
321
+ try_auto_commit(log)
322
+ end
323
+
324
+
325
+ #
326
+ # main category order: 1
327
+ #
328
+ def add_to_new_features(log)
329
+ meta_add_to_a_category(log, 1, "New features")
330
+ end
331
+
332
+ #
333
+ # main category order: 2
334
+ #
335
+ def add_to_enhancements(log)
336
+ meta_add_to_a_category(log, 2, "Enhancements")
337
+ end
338
+
339
+ #
340
+ # main_category_order: 3
341
+ #
342
+ def add_to_bug_fixes(log)
343
+ meta_add_to_a_category(log, 3, "Bug fixes")
344
+ end
345
+
346
+ #
347
+ # main_category_order: 4
348
+ #
349
+ def add_to_security(log)
350
+ meta_add_to_a_category(log, 4, "Security")
351
+ end
352
+
353
+ #
354
+ # main_category_order: 5
355
+ #
356
+ def add_to_compatibility(log)
357
+ meta_add_to_a_category(log, 5, "Compatibility")
358
+ end
359
+
360
+ #
361
+ # The last of order table
362
+ # main_category_order: 6
363
+ #
364
+ def add_to_deprecations(log)
365
+ meta_add_to_a_category(log, 6, "Deprecations")
366
+ end
367
+
368
+
369
+ #
370
+ # Release a version
371
+ #
372
+ def release_new_version(ver)
373
+ if ver.nil?
374
+ puts "chlog: No version supplied! "
375
+ puts " Use chlog -r <version>!",""
376
+ exit 1
377
+ end
378
+
379
+ if !ver.downcase.start_with?('v') and ver[0].match? /\d/
380
+ ver = 'v' + ver
381
+ end
382
+
383
+ content = get_changelog
384
+ lns = content.lines
385
+
386
+ match_unreleased_fail!(lns[2])
387
+
388
+ header = <<EOF
389
+ # Changelog
390
+
391
+ ## [Unreleased](#) (#$today)
392
+
393
+ <br>
394
+
395
+ EOF
396
+
397
+ new_version = "## [#{ver}](#) (#$today)\n"
398
+ new_cont = header + new_version + lns[3..].join('')
399
+ File.write($Changelog_file, new_cont)
400
+ puts "Release #{ver} in Changelog!"
401
+ log = "Release #{ver}"
402
+ try_auto_commit(log)
403
+ end
404
+
405
+
406
+ #
407
+ # Help user interactively
408
+ #
409
+ def ask_user_category
410
+ category = HL.choose do |menu|
411
+ menu.index_color = :rgb_77bbff
412
+ menu.prompt = "What main category?"
413
+ # return number!!! not string!!!
414
+ menu.choices(*CATEGORY_TABLE)
415
+ end
416
+
417
+ option = CATEGORY_TABLE.index(category)
418
+
419
+ if $sub_category.nil?
420
+ sub = HL.ask "What sub category? [NIL/sub]"
421
+ case sub
422
+ when ''
423
+ $sub_category = nil
424
+ else
425
+ $sub_category = sub
426
+ end
427
+ end
428
+ return option
429
+ end
430
+
431
+
432
+ def add_log_sensitive(log, with_commit_msg: true)
433
+
434
+ # Be careful the when statements order
435
+ # Match the case you want first
436
+ option = case log
437
+ when /deprecat/i, /^remove/i, /^not/i then 6
438
+ when /^new/i, /^add/i, /new feature/i, /^support/i then 1
439
+ when /^fix/i, /repair/i, /bug/i then 3
440
+ when /compatible/i, /compatibility/i then 5
441
+ when /security/i, /secure/i, /cve/i then 4
442
+ when /feature/i, /update/i, /problem/i, /issue/i then 2
443
+ else
444
+ # Just a fake option to yield main_category -> nil
445
+ 10
446
+ end
447
+
448
+
449
+ main_category = CATEGORY_TABLE[option-1]
450
+ if main_category.nil?
451
+ re = 'need ask user'
452
+ else
453
+ re = HL.ask "Add to '#{main_category}'? [Y/n]"
454
+ end
455
+ if re == '' || re.downcase == 'y' || re.downcase == 'yes'
456
+ send(METHOD_HASH_TABLE[option], log)
457
+ else
458
+ option = ask_user_category
459
+ send(METHOD_HASH_TABLE[option+1], log)
460
+ end
461
+
462
+ try_auto_commit(with_commit_msg)
463
+ end
464
+
465
+
466
+ #
467
+ # Try auto commit every time
468
+ #
469
+ def try_auto_commit(msg = nil)
470
+
471
+ files = `git diff --exit-code --name-only`
472
+ files = files.split
473
+ if (files.size == 1) && (files[0] == "CHANGELOG.md")
474
+ re = HL.ask "chlog: commit the Changelog? [Y/n]"
475
+ if re == "" || re.downcase == 'y' || re.downcase == 'yes'
476
+
477
+ system "git add #$Changelog_file"
478
+ # Can't merge the git add op here, because 'system' only treat them
479
+ # as one command integrally
480
+ system <<~COMMAND
481
+ git commit -m "Update the Changelog with info: #{msg}"
482
+ COMMAND
483
+
484
+ end
485
+ end
486
+ end
487
+
488
+
489
+ #
490
+ # Reuse git commit log
491
+ #
492
+ def add_with_git(first, second)
493
+
494
+ main_category = nil
495
+
496
+ if first =~ /^-([nebscd])$/
497
+ main_category = $1
498
+ elsif first =~ /^--(.*)/
499
+ $sub_category = $1
500
+ end
501
+
502
+ if second =~ /^-([nebscd])$/
503
+ main_category = $1
504
+ elsif second =~ /^--(.*)/
505
+ $sub_category = $1
506
+ end
507
+
508
+
509
+ gitlog = `git log --oneline -n 1`
510
+ log = gitlog.split(' ')
511
+ log = log[1..].join(' ')
512
+ puts "last commit: #{log}"
513
+
514
+
515
+ if main_category.nil?
516
+ return add_log_sensitive(log)
517
+ end
518
+
519
+ main_cat_to_num = %w[n 1 e 2 b 3 s 4 c 5 d 6].to_h { [_1,_1] }
520
+ option = main_cat_to_num[main_category]
521
+
522
+ m = METHOD_HASH_TABLE[option]
523
+ if m
524
+ send(m, log)
525
+ else
526
+ # Not with commit msg, because we are just using the last commit msg
527
+ add_log_sensitive(log, with_commit_msg: false)
528
+ end
529
+ end
530
+
531
+
532
+ #############
533
+ # main
534
+ #############
535
+
536
+ if $*.size == 0
537
+ if File.exists? $Changelog_file
538
+ puts "chlog: Already exists Changelog (#$Changelog_file)"
539
+ puts " Use chlog -h to see options"
540
+ else
541
+ get_changelog
542
+ end
543
+ exit
544
+ end
545
+
546
+ action = $*[0]
547
+ if $*[1] =~ /--(.*)/
548
+ puts "-> DEBUG: #$1"
549
+ $sub_category = $1
550
+ log = $*[2..].join(' ')
551
+ else
552
+ $sub_category = nil
553
+ log = $*[1..].join(' ')
554
+ end
555
+
556
+
557
+ begin
558
+
559
+ case action
560
+ when "-h", "--help" then help()
561
+ when "-n" then add_to_new_features(log)
562
+ when "-e" then add_to_enhancements(log)
563
+ when "-b" then add_to_bug_fixes(log)
564
+ when "-s" then add_to_security(log)
565
+ when "-c" then add_to_compatibility(log)
566
+ when "-d" then add_to_deprecations(log)
567
+ when "-r" then release_new_version($*[1])
568
+ when "-g" then add_with_git($*[1], $*[2])
569
+ else
570
+ if action =~ /^-[^-]*$/
571
+ puts "chlog: Unknown option!"
572
+ exit 1
573
+ else
574
+ if $*[0] =~ /^--(.*)/
575
+ $sub_category = $1
576
+ log = $*[1..].join(' ')
577
+ else
578
+ $sub_category = nil
579
+ log = $*[0..].join(' ')
580
+ end
581
+ add_log_sensitive(log)
582
+ end
583
+ end
584
+
585
+ rescue Interrupt
586
+ end
data/lib/chlog.rb CHANGED
@@ -1,417 +1,13 @@
1
1
  # ------------------------------------------------------
2
2
  # File : chlog.rb
3
- # Authors : Aoran Zeng <ccmywish@qq.com>
3
+ # Authors : ccmywish <ccmywish@qq.com>
4
4
  # Created on : <2022-04-15>
5
- # Last modified : <2023-05-09>
5
+ # Last modified : <2022-11-29>
6
6
  #
7
7
  # chlog:
8
8
  #
9
9
  # Maintain your project's Changelog on the cli.
10
+ #
10
11
  # ------------------------------------------------------
11
12
 
12
- require_relative 'chlog/version'
13
-
14
- class Chlog::Logger
15
-
16
- attr_accessor :sub_category, # 存储次标题
17
- :log, # 存储log
18
- :highline # HighLine 实例
19
- :changelog # CHANGELOG.md 位置
20
-
21
-
22
- def initialize
23
- require 'highline'
24
- @highline = HighLine.new
25
-
26
- require 'open3'
27
- # Prevent current directory is not git directory
28
- Open3.popen3("git rev-parse --show-toplevel") do |i, o, err, t|
29
- if err.read.include?("fatal: not a git repository")
30
- puts "chlog: Not a git directory!" or exit(false)
31
- else
32
- @changelog = `git rev-parse --show-toplevel`.chomp + '/CHANGELOG.md'
33
- end
34
- end
35
- end
36
-
37
- require 'date'
38
- TODAY = Date.today.to_s
39
-
40
- UNRELEASED_TITLE = "## [Unreleased](#) (#{TODAY})"
41
-
42
- TEMPLATE = <<~EOT
43
- # Changelog
44
-
45
- #{UNRELEASED_TITLE}
46
-
47
- <br>
48
-
49
- ## [Initialize](#) (#{TODAY})
50
-
51
- <br>
52
-
53
- <hr>
54
-
55
- This Changelog is maintained with [chlog](https://github.com/ccmywish/chlog)
56
-
57
- EOT
58
-
59
-
60
- def generate_changelog
61
- file = @changelog
62
- if File.exist? file
63
- puts "chlog: Already exists Changelog (#@changelog)" or return false
64
- else
65
- File.write(file, TEMPLATE)
66
- puts "chlog: Generate #@changelog OK!" or return true
67
- end
68
- end
69
-
70
-
71
- def get_changelog
72
- file = @changelog
73
- if File.exist? file
74
- return File.read file
75
- else
76
- abort "chlog: No Changelog exists, use 'chlog -g' to generate!"
77
- end
78
- end
79
-
80
- end
81
-
82
-
83
- class Chlog::Logger
84
-
85
- def match_unreleased?(str)
86
- str =~ /^## \[Unreleased\]\(.*\) \(\d{4}-\d\d-\d\d\)/
87
- end
88
-
89
- def match_unreleased_fail!(str)
90
- unless match_unreleased?(str)
91
- puts "chlog: Unmatched format with chlog"
92
- puts
93
- # "#{lns[1][1..]}"
94
- abort "Unreleased version must be the third line"
95
- end
96
- end
97
-
98
- def match_new_features?(str)
99
- str =~ /^### New features:/
100
- end
101
-
102
- def match_enhancements?(str)
103
- str =~ /^### Enhancements:/
104
- end
105
-
106
- def match_bug_fixes?(str)
107
- str =~ /^### Bug fixes:/
108
- end
109
-
110
- def match_security?(str)
111
- str =~ /^### Security:/
112
- end
113
-
114
- def match_compatibility?(str)
115
- str =~ /^### Compatibility:/
116
- end
117
-
118
- def match_deprecations?(str)
119
- str =~ /^### Deprecations:/
120
- end
121
-
122
-
123
- def next_version_index(lns_array)
124
- nvi = lns_array[3..].each_with_index {break _2 if _1.start_with?("## [") }
125
- nvi += 3
126
- end
127
-
128
- def next_category_index(lns_array)
129
- nci = lns_array[3...nvi].each_with_index {break _2 if _1.start_with?("### ") }
130
-
131
- # The not match return value is not nil!! But an array!!
132
- if nci.is_a(Integer) then nci += 3
133
- else nil end
134
- end
135
-
136
- =begin
137
- ### New features:
138
-
139
- - xaaaaa
140
- - xbbbbb
141
- - xccccc [-> this]
142
- =end
143
- def find_main_category_last_list_item_index(lns,
144
- main_cat_index,
145
- first_lower_order_category_index)
146
- mci = main_cat_index
147
- nci = first_lower_order_category_index
148
-
149
- list_i = lns[mci+2..nci].each_with_index do
150
- break _2 if _1 !~ /^- .*/
151
- end
152
- list_i += mci+2 - 1
153
- end
154
-
155
-
156
- LIST__Feature = %w[
157
- new_features enhancements bug_fixes
158
- security compatibility deprecations
159
- ]
160
-
161
- # New features
162
- # Enhancements
163
- # Bug fixes
164
- # Security
165
- # Compatibility
166
- # Deprecations
167
- LIST__Main_Category = LIST__Feature.map do
168
- _1.split('_').join(' ').capitalize
169
- end
170
-
171
- # match_new_features?
172
- # match_enhancements?
173
- # match_ ...
174
- LIST__Match_Method = LIST__Feature.map do
175
- ('match_' + _1 + '?').to_sym
176
- end
177
-
178
- =begin
179
- {
180
- 1 => :add_to_new_features,
181
- 2 => :add_to_enhancements,
182
- ...
183
- }
184
- =end
185
- HASH__Order_To_AddTo_Method = ([1,2,3,4,5,6].zip LIST__Feature.map {|m| ('add_to_' + m).to_sym }).to_h
186
-
187
-
188
-
189
- def take_action(action)
190
- options = "nebscd"
191
-
192
- =begin
193
- {
194
- "-n" => "new_features", "-e" => "enhancements", "-b" => "bug_fixes",
195
- "-s" => "security", "-c" => "compatibility", "-d" => "deprecations"
196
- }
197
- =end
198
- action_table = options.chars.map do |op|
199
- '-' + op
200
- end.zip(LIST__Feature).to_h
201
-
202
- public_send "add_to_#{action_table[action]}"
203
- end
204
-
205
-
206
- def first_lower_order_category_index(lns_array, category_order)
207
-
208
- o = category_order
209
-
210
- nvi = next_version_index(lns_array)
211
-
212
- while o < LIST__Match_Method.size
213
- lns_array[0...nvi].each_with_index do
214
- return _2 if send(LIST__Match_Method[o], _1)
215
- end
216
- o += 1
217
- end
218
-
219
- # Next version above
220
- return (nvi - 2)
221
- end
222
-
223
-
224
- # A meta function: do the real work other 6 functions delegate
225
- #
226
- # This function detect the main category, and then handle the
227
- # sub category.
228
- def meta_add_to_a_category(log, main_category_order, category)
229
-
230
- content = get_changelog
231
- lns = content.lines
232
-
233
- match_unreleased_fail!(lns[2])
234
-
235
- nvi = next_version_index(lns)
236
- # To find the existing category line
237
- main_cat_i = lns[0...nvi].each_with_index do
238
- # Adjust to index of the order table
239
- break _2 if send(LIST__Match_Method[main_category_order-1], _1)
240
- end
241
-
242
- #
243
- # Always update to latest time when making a log
244
- #
245
- # We must add a "\n" because every element of the array
246
- # is a sentence with a trailing newline, then they can
247
- # be 'joined' to a working long string
248
- #
249
- lns[2] = UNRELEASED_TITLE + "\n"
250
-
251
- f_l_o_c_i = first_lower_order_category_index(lns, main_category_order)
252
-
253
- if main_cat_i.class != Integer
254
- ################################################################################
255
- # The main category not exists
256
- ################################################################################
257
-
258
-
259
- ########################################
260
- if @sub_category
261
-
262
- # Because the main category not exists,
263
- # nor does the sub category
264
- #
265
- sub_cat_i = f_l_o_c_i
266
- to_wr = lns[0...sub_cat_i].join + "### #{category}:\n\n" + "**#{@sub_category}**\n\n" + ' - ' + log + "\n\n"
267
- File.write(@changelog, to_wr + lns[sub_cat_i..].join)
268
-
269
- puts "chlog: Add log to #{category}/#{@sub_category}"
270
- return
271
- end # end of if @sub_category
272
- ########################################
273
-
274
- # situation: no sub category
275
-
276
- # Not need adjust to the index of the order table
277
- log_loc = f_l_o_c_i
278
- puts "chlog: Add '#{category}' category"
279
- to_wr = lns[0...(log_loc)].join + "### #{category}:\n\n" + '- ' + log + "\n"
280
- File.write(@changelog, to_wr + lns[log_loc-1..].join)
281
-
282
- else
283
- ################################################################################
284
- # The main category exists
285
- ################################################################################
286
-
287
-
288
- ########################################
289
- if @sub_category
290
-
291
- # from first list item to next main cat
292
- # search if sub cat already exists
293
- sub_cat_i = lns[main_cat_i+2...f_l_o_c_i].each_with_index do
294
- break _2 if _1 =~ /^\*\*#{@sub_category}\*\*/
295
- end
296
-
297
- if !sub_cat_i.is_a?(Integer)
298
- # the sub category not exists
299
-
300
- sub_cat_i = 2 + find_main_category_last_list_item_index(lns,main_cat_i,f_l_o_c_i)
301
- to_wr = lns[0...sub_cat_i].join + "**#{@sub_category}**\n\n" + ' - ' + log + "\n\n"
302
- File.write(@changelog, to_wr + lns[sub_cat_i..].join)
303
- else
304
- # the sub category exists
305
-
306
- sub_cat_i += main_cat_i+2
307
- to_wr = lns[0..sub_cat_i+1].join + ' - ' + log + "\n"
308
- File.write(@changelog, to_wr + lns[sub_cat_i+2..].join)
309
- end
310
-
311
- puts "chlog: Add log to #{category}/#{@sub_category}"
312
- return
313
- end # end of if @sub_category
314
- ########################################
315
-
316
-
317
-
318
- # situation: no sub category
319
-
320
- to_wr = lns[0..main_cat_i+1].join + '- ' + log + "\n"
321
-
322
- # main category list should be separated with
323
- # sub category
324
- if lns[main_cat_i+2] =~ /\*\*.*/
325
- to_wr += "\n"
326
- end
327
- File.write(@changelog, to_wr + lns[main_cat_i+2..].join)
328
- end
329
-
330
- puts "chlog: Add log to #{category}"
331
- end
332
-
333
-
334
-
335
- # main category order: 1
336
- def add_to_new_features
337
- meta_add_to_a_category(@log, 1, "New features")
338
- end
339
-
340
- # main category order: 2
341
- def add_to_enhancements
342
- meta_add_to_a_category(@log, 2, "Enhancements")
343
- end
344
-
345
- # main_category_order: 3
346
- def add_to_bug_fixes
347
- meta_add_to_a_category(@log, 3, "Bug fixes")
348
- end
349
-
350
- # main_category_order: 4
351
- def add_to_security
352
- meta_add_to_a_category(@log, 4, "Security")
353
- end
354
-
355
- # main_category_order: 5
356
- def add_to_compatibility
357
- meta_add_to_a_category(@log, 5, "Compatibility")
358
- end
359
-
360
- # The last of order table
361
- # main_category_order: 6
362
- def add_to_deprecations
363
- meta_add_to_a_category(@log, 6, "Deprecations")
364
- end
365
-
366
- # Release a version
367
- def release_new_version(ver)
368
- if ver.nil?
369
- puts "chlog: No version supplied!"; puts; abort "Use chlog -r <version>!"
370
- end
371
-
372
- if !ver.downcase.start_with?('v') and ver[0].match? /\d/
373
- ver = 'v' + ver
374
- end
375
-
376
- content = get_changelog
377
- lns = content.lines
378
-
379
- match_unreleased_fail!(lns[2])
380
-
381
- header = <<~EOF
382
- # Changelog
383
-
384
- ## [Unreleased](#) (#{TODAY})
385
-
386
- <br>
387
-
388
- EOF
389
-
390
- new_version = "## [#{ver}](#) (#{TODAY})\n"
391
- new_cont = header + new_version + lns[3..].join('')
392
- File.write(@changelog, new_cont)
393
- puts "chlog: Release #{ver} in Changelog!" or return true
394
- end
395
-
396
-
397
- # Help user interactively
398
- def ask_user_category
399
- category = @highline.choose do |menu|
400
- menu.index_color = :rgb_77bbff
401
- menu.prompt = "What main category?"
402
- # return number!!! not string!!!
403
- menu.choices(*LIST__Main_Category)
404
- end
405
-
406
- option = LIST__Main_Category.index(category)
407
-
408
- if @sub_category.nil?
409
- sub = @highline.ask "What sub category? [NIL/sub]"
410
- case sub
411
- when '' then @sub_category = nil
412
- else @sub_category = sub end
413
- end
414
- return option
415
- end
416
-
417
- end
13
+ CHLOG_GEM_VERSION = "1.7.3"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chlog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 1.7.3
5
5
  platform: ruby
6
6
  authors:
7
- - Aoran Zeng
7
+ - ccmywish
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-09 00:00:00.000000000 Z
11
+ date: 2022-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -34,9 +34,8 @@ executables:
34
34
  extensions: []
35
35
  extra_rdoc_files: []
36
36
  files:
37
- - exe/chlog
37
+ - bin/chlog
38
38
  - lib/chlog.rb
39
- - lib/chlog/version.rb
40
39
  homepage: https://github.com/ccmywish/chlog
41
40
  licenses:
42
41
  - MIT
@@ -58,8 +57,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
57
  - !ruby/object:Gem::Version
59
58
  version: '0'
60
59
  requirements: []
61
- rubygems_version: 3.4.8
60
+ rubygems_version: 3.3.7
62
61
  signing_key:
63
62
  specification_version: 4
64
- summary: Help maintain Changelog on the command line!
63
+ summary: 'chlog: help maintain Changelog'
65
64
  test_files: []
data/exe/chlog DELETED
@@ -1,82 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # ------------------------------------------------------
3
- # File : chlog.rb
4
- # Authors : Aoran Zeng <ccmywish@qq.com>
5
- # Created on : <2022-03-18>
6
- # Last modified : <2023-05-09>
7
- #
8
- # chlog:
9
- #
10
- # Maintain your project's Changelog on the cli.
11
- # ------------------------------------------------------
12
-
13
- require 'chlog'
14
-
15
- module Chlog::CLI
16
-
17
- def self.run
18
-
19
- args = $*.dup
20
-
21
- if args.size == 0
22
- help or exit
23
- end
24
-
25
- action = args[0]
26
-
27
- case action
28
- when "-h", "--help" then help or exit end
29
-
30
- logger = Chlog::Logger.new
31
-
32
- case action
33
- when "-g" then exit logger.generate_changelog
34
- when "-r" then exit logger.release_new_version(args[1])
35
- end
36
-
37
- if args[1] =~ /^--(.*)/
38
- logger.sub_category = $1
39
- logger.log = args[2..].join(' ')
40
- else
41
- logger.sub_category = nil
42
- logger.log = args[1..].join(' ')
43
- end
44
-
45
- case action
46
- when /-[nebscd]/
47
- logger.take_action(action)
48
- else
49
- # action =~ /^-[^-]*$/
50
- abort "chlog: Unknown option!"
51
- end
52
- end
53
-
54
-
55
- def self.help
56
- puts <<~EOH
57
- chlog (v#{Chlog::GEM_VERSION}): Help maintain the Changelog of your projects
58
-
59
- Usage:
60
-
61
- chlog -g Generate CHANGELOG.md in git root
62
- chlog -r <3.14> Release version to v3.14
63
-
64
- Add log:
65
-
66
- chlog <-main category> [--sub category] <log>
67
-
68
- Main Category:
69
-
70
- -n Add log to New features
71
- -e Add log to Enhancements
72
- -b Add log to Bug fixes
73
- -s Add log to Security
74
- -c Add log to Compatibility
75
- -d Add log to Deprecations
76
-
77
- EOH
78
- end
79
-
80
- end
81
-
82
- Chlog::CLI.run
data/lib/chlog/version.rb DELETED
@@ -1,16 +0,0 @@
1
- # ---------------------------------------------------------------
2
- # File : version.rb
3
- # Authors : Aoran Zeng <ccmywish@qq.com>
4
- # Created on : <2023-05-09>
5
- # Last modified : <2023-05-09>
6
- #
7
- # version:
8
- #
9
- # Lib version
10
- # ---------------------------------------------------------------
11
-
12
- module Chlog
13
-
14
- GEM_VERSION = "0.9.0"
15
-
16
- end