signore 0.6.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 89502aa06cad37d7834baf70be3c8721f2836819
4
- data.tar.gz: 0b1eff879e6481e1b6a9fe5d649c8bffc07ac355
2
+ SHA256:
3
+ metadata.gz: 53a6bf3a2bc72020cf26754484238b4efb83028f771c395386e857a1916aea59
4
+ data.tar.gz: 278acaae1aee55674c1b736367f77b848bdad91d70d9fd47ba103d1fd55a19be
5
5
  SHA512:
6
- metadata.gz: 7b63d9935c384eb27522c0759f1bd380a24ae3c06590a2561b2cc36345015603925710de79007065a4bf59b19fc15f04eb79cb402505bb6ee628b678100f2035
7
- data.tar.gz: 3d1df2ec0ba886c86c0d06231bb001931009ee442aa944b152b84044ae0e195a373ac055a5e3f8225a0660043a1646dd3851b8ac6cba94308d50d1386f0f8aa2
6
+ metadata.gz: 3e5cce22deca6ff0ff82cda5297a301075a7549059849f26d993caf97c7cca1e265f89d02307ef90c748f0c390d78e07f7b70080e64810095caa196e3eab9c37
7
+ data.tar.gz: 15abbffeb0e9cd013381dfc273c451c9630738d459dd1fab35d0268aa94ccbfba207676ecb04f2532e3fafc01d5aa4c9f234df6d478264b7cabe551efc8efde9
data/.overcommit.yml ADDED
@@ -0,0 +1,4 @@
1
+ PreCommit:
2
+ RakeTarget:
3
+ enabled: true
4
+ targets: [default]
data/.reek.yml ADDED
@@ -0,0 +1,3 @@
1
+ detectors:
2
+ IrresponsibleModule:
3
+ enabled: false
data/.rubocop.yml CHANGED
@@ -1,17 +1,30 @@
1
- Style/AndOr:
1
+ AllCops:
2
+ NewCops: enable
3
+ TargetRubyVersion: 3.2
4
+
5
+ Bundler/GemFilename:
6
+ Enabled: false
7
+
8
+ Gemspec/DevelopmentDependencies:
9
+ Enabled: false
10
+
11
+ Metrics/BlockLength:
12
+ AllowedMethods: describe
13
+
14
+ Naming/HeredocDelimiterCase:
15
+ Enabled: false
16
+
17
+ Naming/HeredocDelimiterNaming:
2
18
  Enabled: false
3
19
 
4
20
  Style/Documentation:
5
21
  Enabled: false
6
22
 
7
- Style/EmptyCaseCondition:
23
+ Style/FrozenStringLiteralComment:
8
24
  Enabled: false
9
25
 
10
26
  Style/Not:
11
27
  Enabled: false
12
28
 
13
- Style/TrailingCommaInArguments:
14
- EnforcedStyleForMultiline: comma
15
-
16
- Style/TrailingCommaInLiteral:
17
- EnforcedStyleForMultiline: comma
29
+ Style/StructInheritance:
30
+ Enabled: false
data/.tool-versions ADDED
@@ -0,0 +1 @@
1
+ ruby 2.6.1
data/.travis.yml CHANGED
@@ -1,10 +1,12 @@
1
- cache: bundler
2
- fast_finish: true
1
+ before_install:
2
+ - gem update --system
3
+ - gem install bundler
4
+ - bundle
3
5
  language: ruby
4
6
  matrix:
5
7
  allow_failures:
6
8
  - rvm: ruby-head
7
9
  rvm:
8
- - ruby-2.3.0
10
+ - 2.5
11
+ - 2.6
9
12
  - ruby-head
10
- sudo: false
data/README.md CHANGED
@@ -86,4 +86,4 @@ signore stores the signatures in a YAML file (for ease of editing, if such a nee
86
86
 
87
87
  ---
88
88
 
89
- © MMIX-MMXV Piotr Szotkowski <chastell@chastell.net>, licensed under AGPL-3.0 (see LICENCE)
89
+ © MMIX-MMXIX Piotr Szotkowski <chastell@chastell.net>, licensed under AGPL-3.0 (see LICENCE)
data/Rakefile CHANGED
@@ -1,10 +1,9 @@
1
- # frozen_string_literal: true
2
-
1
+ require 'bundler/setup'
3
2
  require 'rake/testtask'
4
3
  require 'reek/rake/task'
5
4
  require 'rubocop/rake_task'
6
5
 
7
- task default: %i(test rubocop reek)
6
+ task default: %i[test rubocop reek]
8
7
 
9
8
  Rake::TestTask.new do |task|
10
9
  task.pattern = 'test/**/*_test.rb'
@@ -13,7 +12,6 @@ end
13
12
 
14
13
  Reek::Rake::Task.new do |task|
15
14
  task.fail_on_error = false
16
- task.reek_opts = '--no-wiki-links'
17
15
  end
18
16
 
19
17
  RuboCop::RakeTask.new do |task|
data/bin/signore CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
2
 
4
3
  require_relative '../lib/signore'
5
4
  trap(:INT) { exit }
data/gems.locked ADDED
@@ -0,0 +1,98 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ signore (0.7.0)
5
+ lovely_rufus (~> 1.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ast (2.4.3)
11
+ bigdecimal (3.1.9)
12
+ concurrent-ruby (1.3.5)
13
+ dry-configurable (1.3.0)
14
+ dry-core (~> 1.1)
15
+ zeitwerk (~> 2.6)
16
+ dry-core (1.1.0)
17
+ concurrent-ruby (~> 1.0)
18
+ logger
19
+ zeitwerk (~> 2.6)
20
+ dry-inflector (1.2.0)
21
+ dry-initializer (3.2.0)
22
+ dry-logic (1.6.0)
23
+ bigdecimal
24
+ concurrent-ruby (~> 1.0)
25
+ dry-core (~> 1.1)
26
+ zeitwerk (~> 2.6)
27
+ dry-schema (1.14.1)
28
+ concurrent-ruby (~> 1.0)
29
+ dry-configurable (~> 1.0, >= 1.0.1)
30
+ dry-core (~> 1.1)
31
+ dry-initializer (~> 3.2)
32
+ dry-logic (~> 1.5)
33
+ dry-types (~> 1.8)
34
+ zeitwerk (~> 2.6)
35
+ dry-types (1.8.2)
36
+ bigdecimal (~> 3.0)
37
+ concurrent-ruby (~> 1.0)
38
+ dry-core (~> 1.0)
39
+ dry-inflector (~> 1.0)
40
+ dry-logic (~> 1.4)
41
+ zeitwerk (~> 2.6)
42
+ json (2.12.0)
43
+ language_server-protocol (3.17.0.5)
44
+ lint_roller (1.1.0)
45
+ logger (1.7.0)
46
+ lovely_rufus (1.3.0)
47
+ minitest (5.25.5)
48
+ minitest-focus (1.4.0)
49
+ minitest (>= 4, < 6)
50
+ parallel (1.27.0)
51
+ parser (3.3.8.0)
52
+ ast (~> 2.4.1)
53
+ racc
54
+ prism (1.4.0)
55
+ racc (1.8.1)
56
+ rainbow (3.1.1)
57
+ rake (13.2.1)
58
+ reek (6.5.0)
59
+ dry-schema (~> 1.13)
60
+ logger (~> 1.6)
61
+ parser (~> 3.3.0)
62
+ rainbow (>= 2.0, < 4.0)
63
+ rexml (~> 3.1)
64
+ regexp_parser (2.10.0)
65
+ rexml (3.4.1)
66
+ rubocop (1.75.6)
67
+ json (~> 2.3)
68
+ language_server-protocol (~> 3.17.0.2)
69
+ lint_roller (~> 1.1.0)
70
+ parallel (~> 1.10)
71
+ parser (>= 3.3.0.2)
72
+ rainbow (>= 2.2.2, < 4.0)
73
+ regexp_parser (>= 2.9.3, < 3.0)
74
+ rubocop-ast (>= 1.44.0, < 2.0)
75
+ ruby-progressbar (~> 1.7)
76
+ unicode-display_width (>= 2.4.0, < 4.0)
77
+ rubocop-ast (1.44.1)
78
+ parser (>= 3.3.7.2)
79
+ prism (~> 1.4)
80
+ ruby-progressbar (1.13.0)
81
+ unicode-display_width (3.1.4)
82
+ unicode-emoji (~> 4.0, >= 4.0.4)
83
+ unicode-emoji (4.0.4)
84
+ zeitwerk (2.7.2)
85
+
86
+ PLATFORMS
87
+ ruby
88
+
89
+ DEPENDENCIES
90
+ minitest (~> 5.6)
91
+ minitest-focus (~> 1.1)
92
+ rake (~> 13.0)
93
+ reek (~> 6.0)
94
+ rubocop (~> 1.0)
95
+ signore!
96
+
97
+ BUNDLED WITH
98
+ 2.6.9
@@ -1,4 +1,2 @@
1
- # frozen_string_literal: true
2
-
3
1
  source 'https://rubygems.org'
4
2
  gemspec
data/lib/signore/cli.rb CHANGED
@@ -1,15 +1,14 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'forwardable'
4
2
  require_relative 'repo'
5
3
  require_relative 'settings'
4
+ require_relative 'sig_finder'
6
5
  require_relative 'sig_from_stream'
7
6
 
8
7
  module Signore
9
8
  class CLI
10
9
  extend Forwardable
11
10
 
12
- delegate %i(action tags) => :settings
11
+ delegate %i[action tags] => :settings
13
12
 
14
13
  def initialize(args = ARGV, repo: Repo.new)
15
14
  @settings = Settings.new(args)
@@ -29,7 +28,7 @@ module Signore
29
28
  attr_reader :repo, :settings
30
29
 
31
30
  def prego
32
- sig = repo.find(tags: tags)
31
+ sig = SigFinder.find(repo.sigs, tags: tags)
33
32
  puts case
34
33
  when repo.empty? then 'No signatures found.'
35
34
  when sig.empty? then "Sadly no signatures are tagged #{tags}."
@@ -38,7 +37,7 @@ module Signore
38
37
  end
39
38
 
40
39
  def create_sig_from(input)
41
- SigFromStream.sig_from(input, tags: tags).tap { |sig| repo << sig }
40
+ SigFromStream.call(input, tags: tags).tap { |sig| repo << sig }
42
41
  end
43
42
  end
44
43
  end
data/lib/signore/repo.rb CHANGED
@@ -1,53 +1,55 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'forwardable'
2
+ require 'pathname'
4
3
  require 'yaml/store'
5
- require_relative 'mapper'
6
- require_relative 'settings'
7
- require_relative 'sig_finder'
4
+ require_relative 'signature'
8
5
  require_relative 'tags'
9
6
 
10
7
  module Signore
11
8
  class Repo
9
+ class << self
10
+ def default_path
11
+ dir = ENV.fetch('XDG_DATA_HOME') { File.expand_path('~/.local/share') }
12
+ Pathname.new(dir) / 'signore' / 'signatures.yml'
13
+ end
14
+ end
15
+
12
16
  extend Forwardable
13
17
 
14
- def initialize(path: Settings.new.repo_path, sig_finder: SigFinder.new)
15
- @path = path
16
- @sig_finder = sig_finder
18
+ def initialize(path: self.class.default_path)
19
+ @path = path
17
20
  convert if legacy?
18
21
  end
19
22
 
20
- def <<(sig)
21
- store.transaction { (store['signatures'] ||= []) << Mapper.to_h(sig) }
23
+ def <<(signature)
24
+ self.hashes = hashes + [signature.to_h]
22
25
  end
23
26
 
24
- delegate empty?: :sigs
25
-
26
- def find(tags: Tags.new)
27
- sig_finder.find(sigs, tags: tags)
28
- end
27
+ delegate empty?: :hashes
29
28
 
30
29
  def sigs
31
- @sigs ||= begin
32
- hashes = store.transaction(true) { store.fetch('signatures', []) }
33
- hashes.map(&Mapper.method(:from_h))
34
- end
30
+ hashes.map(&Signature.method(:from_h))
35
31
  end
36
32
 
37
33
  private
38
34
 
39
- attr_reader :path, :sig_finder
35
+ attr_reader :path
40
36
 
41
37
  def convert
42
- store.transaction do
43
- store['signatures'] = store.fetch('signatures', []).map(&:to_h)
44
- end
38
+ self.hashes = hashes.map(&:to_h)
45
39
  end
46
40
 
47
41
  def legacy?
48
42
  path.exist? and path.read.include?('Signore::Signature')
49
43
  end
50
44
 
45
+ def hashes
46
+ store.transaction(true) { store.fetch('signatures', []) }
47
+ end
48
+
49
+ def hashes=(hashes)
50
+ store.transaction { store['signatures'] = hashes }
51
+ end
52
+
51
53
  def store
52
54
  @store ||= begin
53
55
  path.dirname.mkpath
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'pathname'
4
2
  require_relative 'tags'
5
3
 
@@ -13,15 +11,9 @@ module Signore
13
11
  args.first
14
12
  end
15
13
 
16
- # :reek:UtilityFunction
17
- def repo_path
18
- dir = ENV.fetch('XDG_DATA_HOME') { File.expand_path('~/.local/share') }
19
- Pathname.new("#{dir}/signore/signatures.yml")
20
- end
21
-
22
14
  def tags
23
15
  negated, required = tag_names.partition { |name| name.start_with?('~') }
24
- Tags.new(forbidden: negated.map { |neg| neg[1..-1] }, required: required)
16
+ Tags.new(forbidden: negated.map { |neg| neg[1..] }, required: required)
25
17
  end
26
18
 
27
19
  private
@@ -29,7 +21,7 @@ module Signore
29
21
  attr_reader :args
30
22
 
31
23
  def tag_names
32
- args[1..-1] or []
24
+ args.empty? ? [] : args[1..]
33
25
  end
34
26
  end
35
27
  end
@@ -1,21 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'signature'
4
2
  require_relative 'tags'
5
3
 
6
4
  module Signore
7
- class SigFinder
8
- def initialize(random: Random.new)
9
- @random = random
10
- end
5
+ module SigFinder
6
+ module_function
11
7
 
12
- def find(sigs, tags: Tags.new)
8
+ def find(sigs, random: Random.new, tags: Tags.new)
13
9
  shuffled = sigs.shuffle(random: random)
14
10
  shuffled.find(-> { Signature.new }) { |sig| tags.match?(sig.tags) }
15
11
  end
16
-
17
- private
18
-
19
- attr_reader :random
20
12
  end
21
13
  end
@@ -1,12 +1,10 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'signature'
4
2
  require_relative 'tags'
5
3
 
6
4
  module Signore
7
5
  class SigFromStream
8
- def self.sig_from(input, tags: Tags.new)
9
- new(input, tags: tags).to_sig
6
+ def self.call(input, tags: Tags.new)
7
+ new(input, tags: tags).call
10
8
  end
11
9
 
12
10
  def initialize(input, tags: Tags.new)
@@ -14,31 +12,22 @@ module Signore
14
12
  @tags = tags
15
13
  end
16
14
 
17
- def to_sig
15
+ def call
18
16
  Signature.new(author: params.author, source: params.source,
19
17
  subject: params.subject, tags: tags.required,
20
18
  text: params.text)
21
19
  end
22
20
 
21
+ Params = Struct.new(:text, :author, :subject, :source)
22
+
23
23
  private
24
24
 
25
25
  attr_reader :input, :tags
26
26
 
27
- Params = Struct.new(:text, :author, :subject, :source)
28
-
29
27
  def get_param(param)
30
- return get_text if param == :text
31
- puts
32
- puts "#{param}?"
33
- input.gets.strip
34
- end
35
-
36
- # :reek:FeatureEnvy
37
- def get_text # rubocop:disable AccessorMethodName
38
- puts 'text?'
39
- value = ''
40
- value += input.gets until value.lines.to_a.last == "\n"
41
- value.strip
28
+ puts "\n#{param}?"
29
+ separator = param == :text ? "\n\n" : "\n"
30
+ input.gets(separator).strip
42
31
  end
43
32
 
44
33
  def params
@@ -1,31 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'lovely_rufus'
4
2
 
5
3
  module Signore
6
- Signature = Struct.new(:text, :author, :source, :subject, :tags) do
4
+ class Signature < Struct.new(:text, :author, :source, :subject, :tags)
5
+ class << self
6
+ def from_h(hash)
7
+ new(**hash.transform_keys(&:to_sym))
8
+ end
9
+ end
10
+
7
11
  def initialize(author: '', source: '', subject: '', tags: [], text: '')
8
- super text, author, source, subject, tags
12
+ super(text, author, source, subject, tags)
9
13
  end
10
14
 
11
15
  def empty?
12
16
  to_s.empty?
13
17
  end
14
18
 
15
- undef text if defined?(:text)
16
- def text
17
- self[:text] or ''
18
- end
19
-
20
19
  def to_h
21
- super.map { |key, val| [key.to_s, val] }.to_h.keep_if do |_, value|
22
- value and not value.empty?
23
- end
20
+ super.map { |key, val| { key.to_s => val } }.reduce({}, :merge)
21
+ .compact.reject { |_, val| val.empty? }
24
22
  end
25
23
 
26
24
  def to_s
27
25
  spaced = text.gsub("\n", "\n\n")
28
- wrapped = LovelyRufus.wrap(spaced, width: 80)
26
+ wrapped = LovelyRufus.wrap(spaced, width: 50)
29
27
  squeezed = wrapped.gsub("\n\n", "\n").chomp
30
28
  squeezed + meta_for(squeezed)
31
29
  end
data/lib/signore/tags.rb CHANGED
@@ -1,17 +1,15 @@
1
- # frozen_string_literal: true
2
-
3
1
  module Signore
4
2
  Tags = Struct.new(:forbidden, :required) do
5
3
  def initialize(forbidden: [], required: [])
6
- super forbidden, required
4
+ super(forbidden, required)
7
5
  end
8
6
 
9
7
  def match?(sig_tags)
10
- (required & sig_tags) == required and (forbidden & sig_tags).empty?
8
+ (required & sig_tags) == required and not forbidden.intersect?(sig_tags) # rubocop:disable Style/BitwisePredicate
11
9
  end
12
10
 
13
11
  def to_s
14
- (required + forbidden.map { |tag| '~' + tag }).join(' ')
12
+ (required + forbidden.map { |tag| "~#{tag}" }).join(' ')
15
13
  end
16
14
  end
17
15
  end
data/lib/signore.rb CHANGED
@@ -1,3 +1 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'signore/cli'
data/signore.gemspec CHANGED
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require 'English'
4
2
  require 'pathname'
5
3
 
@@ -9,28 +7,23 @@ Gem::Specification.new do |gem|
9
7
  'random ones based on their tags'
10
8
  gem.email = 'chastell@chastell.net'
11
9
  gem.homepage = 'http://github.com/chastell/signore'
12
- gem.license = 'AGPL-3.0'
10
+ gem.license = 'AGPL-3.0-or-later'
13
11
  gem.name = 'signore'
14
12
  gem.summary = 'signore: an email signature manager/randomiser'
15
- gem.version = '0.6.0'
13
+ gem.version = '1.0.0'
16
14
 
17
- gem.required_ruby_version = '~> 2.3'
15
+ gem.required_ruby_version = '~> 3.2'
18
16
 
19
17
  gem.files = `git ls-files -z`.split "\0"
20
18
  gem.executables = gem.files.grep(%r{^bin/}).map { |path| File.basename(path) }
21
- gem.test_files = gem.files.grep(%r{^test/.*\.rb$})
22
-
23
- gem.cert_chain = ['certs/chastell.pem']
24
- if Pathname.new($PROGRAM_NAME).basename == Pathname.new('gem')
25
- gem.signing_key = Pathname.new('~/.ssh/gem-private_key.pem').expand_path
26
- end
27
19
 
28
20
  gem.add_dependency 'lovely_rufus', '~> 1.0'
29
21
 
30
- gem.add_development_dependency 'bogus', '~> 0.1.3'
31
22
  gem.add_development_dependency 'minitest', '~> 5.6'
32
23
  gem.add_development_dependency 'minitest-focus', '~> 1.1'
33
- gem.add_development_dependency 'rake', '~> 11.0'
34
- gem.add_development_dependency 'reek', '~> 4.0'
35
- gem.add_development_dependency 'rubocop', '~> 0.43.0'
24
+ gem.add_development_dependency 'rake', '~> 13.0'
25
+ gem.add_development_dependency 'reek', '~> 6.0'
26
+ gem.add_development_dependency 'rubocop', '~> 1.0'
27
+
28
+ gem.metadata['rubygems_mfa_required'] = 'true'
36
29
  end
@@ -16,8 +16,9 @@
16
16
  - - !ruby/struct:Signore::Signature
17
17
  text: It may look like I’m just sitting here doing nothing. But I’m really actively waiting for all my problems to go away.
18
18
  - |-
19
- It may look like I’m just sitting here doing nothing. But
20
- I’m really actively waiting for all my problems to go away.
19
+ It may look like I’m just sitting here
20
+ doing nothing. But I’m really actively
21
+ waiting for all my problems to go away.
21
22
 
22
23
  # meta info is right-aligned to the longest line
23
24
  - - !ruby/struct:Signore::Signature
@@ -37,11 +38,13 @@
37
38
  author: M. Edward (Ed) Borasky, Matt Lawrence, Gregory Brown
38
39
  source: ruby-talk
39
40
  - |-
40
- ‘The Ruby community should proceed with all deliberate
41
- speed towards ISO standardization of the language.’
41
+ ‘The Ruby community should proceed
42
+ with all deliberate speed towards
43
+ ISO standardization of the language.’
42
44
  ‘Yeah, look what it did to Forth.’
43
- ‘Don’t just say it, show it. <http://vividpicture.com/aleks/atari/forth.jpg>’
44
- [M. Edward (Ed) Borasky, Matt Lawrence, Gregory Brown, ruby-talk]
45
+ ‘Don’t just say it, show it.
46
+ <http://vividpicture.com/aleks/atari/forth.jpg>’
47
+ [M. Edward (Ed) Borasky, Matt Lawrence, Gregory Brown, ruby-talk]
45
48
 
46
49
  # long meta info is flushed left
47
50
  - - !ruby/struct:Signore::Signature
@@ -53,14 +56,18 @@
53
56
  author: Spehro Pefhany, CyberCypher, Jess Askin, don groves
54
57
  source: alt.usage.english
55
58
  - |-
56
- ‘The Guardian also had a pre-election column, in which an allegedly
57
- “ironic joke” was open to other interpretations: “John Wilkes Booth,
58
- Lee Harvey Oswald, John Hinckley Jr., where are you now that we need
59
- you?” They removed the column from on-line access and apologized.’
60
- ‘They should have. Hinckley missed the vital spot, so who needs him?’
59
+ ‘The Guardian also had a pre-election column, in
60
+ which an allegedly “ironic joke” was open to other
61
+ interpretations: John Wilkes Booth, Lee Harvey
62
+ Oswald, John Hinckley Jr., where are you now
63
+ that we need you?” They removed the column
64
+ from on-line access and apologized.’
65
+ ‘They should have. Hinckley missed
66
+ the vital spot, so who needs him?’
61
67
  ‘As everybody knows, Reagan was killed in
62
68
  that attack and a lookalike was substituted.’
63
- ‘You mean we were governed all those years by an ACTOR!’
69
+ ‘You mean we were governed
70
+ all those years by an ACTOR!’
64
71
  [Spehro Pefhany, CyberCypher, Jess Askin, don groves, alt.usage.english]
65
72
 
66
73
  # wrapping doesn’t left one-letter words at the end of lines
@@ -77,10 +84,11 @@
77
84
  text: Better to teach a man to fish than to give him a fish. And if he can’t be bothered to learn to fish and starves to death, that’s a good enough outcome for me.
78
85
  author: Steve VanDevender
79
86
  - |-
80
- Better to teach a man to fish than to give him a fish.
81
- And if he can’t be bothered to learn to fish and starves
82
- to death, that’s a good enough outcome for me.
83
- [Steve VanDevender]
87
+ Better to teach a man to fish than to give
88
+ him a fish. And if he can’t be bothered
89
+ to learn to fish and starves to death,
90
+ that’s a good enough outcome for me.
91
+ [Steve VanDevender]
84
92
 
85
93
  # for two-line signatures, first line is considered for hangouts
86
94
  - - !ruby/struct:Signore::Signature
@@ -89,6 +97,7 @@
89
97
  subject: on subway engines
90
98
  source: asr
91
99
  - |-
92
- Well, the old ones go mmmmmbbbbzzzzttteeeeeep as they start up
93
- and the new ones go whupwhupwhupwhooopwhooooopwhooooooommmmmmmmmm.
94
- [Graham Reed on subway engines, asr]
100
+ Well, the old ones go mmmmmbbbbzzzzttteeeeeep
101
+ as they start up and the new ones go
102
+ whupwhupwhupwhooopwhooooopwhooooooommmmmmmmmm.
103
+ [Graham Reed on subway engines, asr]