Class: EasyChangelog

Inherits:
Object
  • Object
show all
Defined in:
lib/easy_changelog.rb,
lib/easy_changelog/entry.rb,
lib/easy_changelog/railtie.rb,
lib/easy_changelog/utility.rb,
lib/easy_changelog/version.rb,
lib/easy_changelog/configuration.rb,
lib/easy_changelog/task_options_parser.rb

Defined Under Namespace

Classes: Configuration, ConfigurationError, EmptyReleaseError, Entry, Error, Railtie, TaskOptionsParser, Utility

Constant Summary collapse

HEADER =
/### (.*)/.freeze
CONTRIBUTOR =
'[@%<user>s]: https://github.com/%<user>s'
EOF =
"\n"
VERSION =
'1.2.0'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(content: File.read(EasyChangelog.configuration.changelog_filename), entries: EasyChangelog.read_entries) ⇒ EasyChangelog

Returns a new instance of EasyChangelog.



55
56
57
58
59
60
61
# File 'lib/easy_changelog.rb', line 55

def initialize(content: File.read(EasyChangelog.configuration.changelog_filename),
               entries: EasyChangelog.read_entries)
  require 'strscan'

  @header, @unreleased, @rest = EasyChangelog::Utility.parse_changelog(content)
  @entries = entries
end

Instance Attribute Details

#entriesObject (readonly)

Returns the value of attribute entries.



53
54
55
# File 'lib/easy_changelog.rb', line 53

def entries
  @entries
end

#headerObject (readonly)

Returns the value of attribute header.



53
54
55
# File 'lib/easy_changelog.rb', line 53

def header
  @header
end

Class Method Details

.configurationObject



20
21
22
# File 'lib/easy_changelog.rb', line 20

def configuration
  @configuration ||= EasyChangelog::Configuration.new
end

.configure {|configuration| ... } ⇒ Object

Yields:



24
25
26
# File 'lib/easy_changelog.rb', line 24

def configure
  yield(configuration)
end

.entry_pathsObject



40
41
42
# File 'lib/easy_changelog.rb', line 40

def entry_paths
  Dir["#{EasyChangelog.configuration.entries_path}*"]
end

.merge_and_delete!Object



32
33
34
# File 'lib/easy_changelog.rb', line 32

def merge_and_delete!
  new.merge_and_delete!
end

.pending?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/easy_changelog.rb', line 28

def pending?
  entry_paths.any?
end

.read_entriesObject



44
45
46
# File 'lib/easy_changelog.rb', line 44

def read_entries
  entry_paths.to_h { |path| [path, File.read(path)] }
end

.release!Object



36
37
38
# File 'lib/easy_changelog.rb', line 36

def release!
  new.release!
end

.release_count(pattern) ⇒ Object



48
49
50
# File 'lib/easy_changelog.rb', line 48

def release_count(pattern)
  File.read(EasyChangelog.configuration.changelog_filename).scan(pattern).size
end

Instance Method Details

#contributorsObject



119
120
121
122
123
# File 'lib/easy_changelog.rb', line 119

def contributors
  @entries.values.flat_map do |entry|
    EasyChangelog::Utility.attr_from_entry(:username, entry)&.gsub(/@/, '')
  end
end

#delete!Object



73
74
75
# File 'lib/easy_changelog.rb', line 73

def delete!
  @entries.each_key { |path| File.delete(path) }
end

#merge!Object



68
69
70
71
# File 'lib/easy_changelog.rb', line 68

def merge!
  EasyChangelog::Utility.update_changelog(merge_content)
  self
end

#merge_and_delete!Object



63
64
65
66
# File 'lib/easy_changelog.rb', line 63

def merge_and_delete!
  merge!
  delete!
end

#merge_contentObject



94
95
96
97
98
# File 'lib/easy_changelog.rb', line 94

def merge_content
  merged_content = [@header, unreleased_content, @rest.chomp, *new_contributor_lines].join("\n")

  merged_content << EOF
end

#new_contributor_linesObject



111
112
113
114
115
116
117
# File 'lib/easy_changelog.rb', line 111

def new_contributor_lines
  return [] unless EasyChangelog.configuration.user_signature

  unique_contributor_names = contributors.map { |user| format(CONTRIBUTOR, user: user) }.uniq

  unique_contributor_names.reject { |line| @rest.include?(line) }
end

#release!Object



77
78
79
80
# File 'lib/easy_changelog.rb', line 77

def release!
  EasyChangelog::Utility.update_changelog(release_content)
  self
end

#release_contentObject

Raises:



100
101
102
103
104
105
106
107
108
109
# File 'lib/easy_changelog.rb', line 100

def release_content
  unreleased = unreleased_content
  raise EmptyReleaseError, 'No unreleased content to release' if unreleased.empty?

  release_message = EasyChangelog.configuration.release_message_template
  release_message = "\n#{release_message}" unless release_message.start_with?("\n")

  released_content = [@header, release_message, unreleased, @rest.chomp, *new_contributor_lines].join("\n")
  released_content << EOF
end

#unreleased_contentObject



82
83
84
85
86
87
88
89
90
91
92
# File 'lib/easy_changelog.rb', line 82

def unreleased_content
  entry_map = parse_entries(@entries)
  merged_map = merge_entries(entry_map)
  merged_map.flat_map do |header, things|
    if header.empty?
      [*things, '']
    else
      ["### #{header}\n", *things, '']
    end
  end.join("\n")
end