codeless_code 0.1.7 → 0.1.8

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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +1 -1
  3. data/.reek.yml +14 -0
  4. data/.rubocop.yml +18 -0
  5. data/.ruby-version +1 -0
  6. data/{test/test_codeless_code.rb → .travis.yml} +12 -10
  7. data/Gemfile +5 -0
  8. data/Gemfile.lock +21 -0
  9. data/Guardfile +13 -1
  10. data/README.md +6 -0
  11. data/Rakefile +26 -11
  12. data/VERSION +1 -1
  13. data/bin/codeless_code +3 -1
  14. data/codeless_code.gemspec +33 -12
  15. data/lib/codeless_code/catalog.rb +3 -1
  16. data/lib/codeless_code/cli.rb +56 -24
  17. data/lib/codeless_code/commands/filter_fables.rb +15 -10
  18. data/lib/codeless_code/commands/list_translations.rb +3 -0
  19. data/lib/codeless_code/fable.rb +42 -53
  20. data/lib/codeless_code/fable_set.rb +8 -6
  21. data/lib/codeless_code/filters/builders.rb +4 -2
  22. data/lib/codeless_code/filters/composite.rb +3 -1
  23. data/lib/codeless_code/filters/date.rb +40 -30
  24. data/lib/codeless_code/filters/from_options.rb +45 -28
  25. data/lib/codeless_code/filters/headers/base.rb +61 -0
  26. data/lib/codeless_code/filters/{header_integer.rb → headers/integer.rb} +16 -19
  27. data/lib/codeless_code/filters/{header_string.rb → headers/string.rb} +12 -22
  28. data/lib/codeless_code/filters/lang.rb +3 -0
  29. data/lib/codeless_code/filters/translator.rb +7 -2
  30. data/lib/codeless_code/filters.rb +16 -8
  31. data/lib/codeless_code/formats/base.rb +20 -7
  32. data/lib/codeless_code/formats/parsers/base.rb +106 -0
  33. data/lib/codeless_code/formats/parsers/plain.rb +49 -0
  34. data/lib/codeless_code/formats/parsers/term.rb +79 -0
  35. data/lib/codeless_code/formats/plain.rb +21 -12
  36. data/lib/codeless_code/formats/raw.rb +2 -0
  37. data/lib/codeless_code/formats/term.rb +21 -15
  38. data/lib/codeless_code/language_set.rb +7 -4
  39. data/lib/codeless_code/options.rb +5 -3
  40. data/lib/codeless_code/renderers/fable.rb +13 -8
  41. data/lib/codeless_code/renderers/term_page.rb +46 -31
  42. data/lib/codeless_code.rb +119 -106
  43. data/test/codeless_code/commands/test_filter_fables.rb +89 -0
  44. data/test/codeless_code/filters/headers/test_integer.rb +86 -0
  45. data/test/codeless_code/filters/headers/test_string.rb +86 -0
  46. data/test/codeless_code/filters/test_builders.rb +4 -2
  47. data/test/codeless_code/filters/test_composite.rb +70 -0
  48. data/test/codeless_code/filters/test_date.rb +99 -0
  49. data/test/codeless_code/filters/test_langs.rb +50 -0
  50. data/test/codeless_code/filters/test_translator.rb +51 -0
  51. data/test/codeless_code/renderers/test_fable.rb +98 -0
  52. data/test/codeless_code/renderers/test_term_page.rb +87 -0
  53. data/test/codeless_code/test_catalog.rb +12 -5
  54. data/test/codeless_code/test_cli.rb +85 -0
  55. data/test/codeless_code/test_fable.rb +19 -10
  56. data/test/codeless_code/test_fable_set.rb +17 -5
  57. data/test/codeless_code/test_language_set.rb +16 -3
  58. data/test/codeless_code/test_options.rb +3 -11
  59. data/test/helper.rb +36 -10
  60. data/test/support/fs.rb +103 -0
  61. metadata +65 -11
  62. data/.document +0 -5
  63. data/data/README.md +0 -34
  64. data/lib/codeless_code/formats/plain_generator.rb +0 -157
  65. data/lib/codeless_code/formats/term_generator.rb +0 -167
  66. data/test/codeless_code/filters/test_header_integer.rb +0 -82
  67. data/test/codeless_code/filters/test_header_string.rb +0 -82
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ead759abc57cf4ba37d82e2837ebedb3b8375859b4146513e7cc2e53dbe24868
4
- data.tar.gz: 1c528ddfca911727e94e8786c69f16f296dce0dc6ec1972772a41b4f195fc22f
3
+ metadata.gz: 5154091052ec2023109ecdc022ec10fdfa3762dcec89f1dd2f6203acac57018d
4
+ data.tar.gz: f9eb3c12e08dd25885faf6d758d67e1020d324a8ce53ab7c77b486b001eeceb1
5
5
  SHA512:
6
- metadata.gz: c0136a3d0368a69d20fe44d0541ddfe42d54315985dc978ad175314f3f51854635999ae8bdbc11ce7f2cbdd9992eefc4458d9359175e508bfd399512147f68d3
7
- data.tar.gz: 66c643b815b4a49626eaa57c01682af7f8ed0f8d9a746084691fed9acfda0203a24e4b8191ca0d8ec683403b9834483c96487728ef1a8ac2a8a9ea6cb751643b
6
+ metadata.gz: bba85e6463c19551a62b0064af87905f0bc1781bcaf198591c2513b4157ae514cc0fd17e31da864683be25c599c7d4170250ecfee8a098c45df9caab6d40600d
7
+ data.tar.gz: 4d8b4f45d6511bac204a88bb5b936a5303da0d5bbed221bdfa0531e03ee45193bcce7ae3f959c5d3c1b41f8ea75359598a5d010a09e98393dfa57dfd9a1de525
data/.gitmodules CHANGED
@@ -1,3 +1,3 @@
1
1
  [submodule "data/the-codeless-code"]
2
2
  path = data/the-codeless-code
3
- url = git@github.com:sangster/the-codeless-code.git
3
+ url = https://github.com/sangster/the-codeless-code.git
data/.reek.yml ADDED
@@ -0,0 +1,14 @@
1
+ ---
2
+ exclude_paths:
3
+ - test
4
+ detectors:
5
+ DuplicateMethodCall:
6
+ enabled: false
7
+ NilCheck:
8
+ enabled: false
9
+ LongParameterList:
10
+ max_params: 4
11
+ UtilityFunction:
12
+ exclude:
13
+ - CodelessCode::Filters::Headers::Base
14
+ - CodelessCode::Filters::Date
data/.rubocop.yml ADDED
@@ -0,0 +1,18 @@
1
+ AllCops:
2
+ Exclude:
3
+ - codeless_code.gemspec
4
+ - vendor/**/*
5
+
6
+ Metrics/BlockLength:
7
+ Exclude:
8
+ - lib/codeless_code.rb
9
+
10
+ Metrics/ModuleLength:
11
+ Exclude:
12
+ - lib/codeless_code.rb
13
+
14
+ Style/DoubleNegation:
15
+ Enabled: false
16
+
17
+ Style/FormatStringToken:
18
+ Enabled: false
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.5.1
@@ -1,3 +1,4 @@
1
+ ---
1
2
  # codeless_code filters and prints fables from http://thecodelesscode.com
2
3
  # Copyright (C) 2018 Jon Sangster
3
4
  #
@@ -13,14 +14,15 @@
13
14
  #
14
15
  # You should have received a copy of the GNU General Public License along with
15
16
  # this program. If not, see <https://www.gnu.org/licenses/>.
16
- require 'helper'
17
-
18
- class TestCodelessCode < UnitTest
19
- def test_data_dir
20
- assert_kind_of Pathname, CodelessCode::DEFAULT_DATA
21
- assert_predicate CodelessCode::DEFAULT_DATA, :frozen?
22
-
23
- assert_predicate CodelessCode::DEFAULT_DATA.glob('*'), :any?
24
- end
25
- end
17
+ language: ruby
26
18
 
19
+ before_script:
20
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
21
+ - chmod +x ./cc-test-reporter
22
+ - ./cc-test-reporter before-build
23
+ env:
24
+ - COVERAGE=1
25
+ script:
26
+ - bundle exec rake
27
+ after_script:
28
+ - ./cc-test-reporter after-build -t simplecov --exit-code $TRAVIS_TEST_RESULT
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # codeless_code filters and prints fables from http://thecodelesscode.com
2
4
  # Copyright (C) 2018 Jon Sangster
3
5
  #
@@ -24,6 +26,8 @@ group :development do
24
26
  gem 'bundler', '~> 1.17'
25
27
  gem 'guard', '~> 2.14'
26
28
  gem 'guard-minitest', '~> 2.4'
29
+ gem 'guard-reek', '~> 1.2'
30
+ gem 'guard-rubocop', '~> 1.3'
27
31
  gem 'jeweler', '~> 2.0'
28
32
  gem 'minitest', '~> 5.11'
29
33
  gem 'minitest-reporters', '~> 1.3'
@@ -31,6 +35,7 @@ group :development do
31
35
  gem 'rake', '~> 12.3'
32
36
  gem 'rdoc', '~> 6.0'
33
37
  gem 'reek', '~> 5.2'
38
+ gem 'rubocop', '~> 0.60'
34
39
  gem 'simplecov', '~> 0.16', require: false
35
40
  gem 'yard', '~> 0.9'
36
41
  end
data/Gemfile.lock CHANGED
@@ -45,9 +45,16 @@ GEM
45
45
  guard-minitest (2.4.6)
46
46
  guard-compat (~> 1.2)
47
47
  minitest (>= 3.0)
48
+ guard-reek (1.2.0)
49
+ guard-compat (~> 1.1)
50
+ reek
51
+ guard-rubocop (1.3.0)
52
+ guard (~> 2.0)
53
+ rubocop (~> 0.20)
48
54
  hashie (3.6.0)
49
55
  highline (2.0.0)
50
56
  ice_nine (0.11.2)
57
+ jaro_winkler (1.5.1)
51
58
  jeweler (2.3.9)
52
59
  builder
53
60
  bundler
@@ -92,8 +99,10 @@ GEM
92
99
  multi_json (~> 1.3)
93
100
  multi_xml (~> 0.5)
94
101
  rack (>= 1.2, < 3)
102
+ parallel (1.12.1)
95
103
  parser (2.5.3.0)
96
104
  ast (~> 2.4.0)
105
+ powerpack (0.1.2)
97
106
  pry (0.11.3)
98
107
  coderay (~> 1.1.0)
99
108
  method_source (~> 0.9.0)
@@ -113,6 +122,14 @@ GEM
113
122
  kwalify (~> 0.7.0)
114
123
  parser (>= 2.5.0.0, < 2.6, != 2.5.1.1)
115
124
  rainbow (>= 2.0, < 4.0)
125
+ rubocop (0.60.0)
126
+ jaro_winkler (~> 1.5.1)
127
+ parallel (~> 1.10)
128
+ parser (>= 2.5, != 2.5.1.1)
129
+ powerpack (~> 0.1)
130
+ rainbow (>= 2.2.2, < 4.0)
131
+ ruby-progressbar (~> 1.7)
132
+ unicode-display_width (~> 1.4.0)
116
133
  ruby-progressbar (1.10.0)
117
134
  ruby_dep (1.5.0)
118
135
  semver2 (3.4.2)
@@ -125,6 +142,7 @@ GEM
125
142
  slop (4.6.2)
126
143
  thor (0.20.0)
127
144
  thread_safe (0.3.6)
145
+ unicode-display_width (1.4.0)
128
146
  virtus (1.0.5)
129
147
  axiom-types (~> 0.1)
130
148
  coercible (~> 1.0)
@@ -140,6 +158,8 @@ DEPENDENCIES
140
158
  colorize (~> 0.8)
141
159
  guard (~> 2.14)
142
160
  guard-minitest (~> 2.4)
161
+ guard-reek (~> 1.2)
162
+ guard-rubocop (~> 1.3)
143
163
  jeweler (~> 2.0)
144
164
  mediacloth (~> 0.6)
145
165
  minitest (~> 5.11)
@@ -149,6 +169,7 @@ DEPENDENCIES
149
169
  rake (~> 12.3)
150
170
  rdoc (~> 6.0)
151
171
  reek (~> 5.2)
172
+ rubocop (~> 0.60)
152
173
  simplecov (~> 0.16)
153
174
  slop (~> 4.6)
154
175
  yard (~> 0.9)
data/Guardfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # vim:ft=ruby:
2
4
  # codeless_code filters and prints fables from http://thecodelesscode.com
3
5
  # Copyright (C) 2018 Jon Sangster
@@ -14,8 +16,18 @@
14
16
  #
15
17
  # You should have received a copy of the GNU General Public License along with
16
18
  # this program. If not, see <https://www.gnu.org/licenses/>.
17
- guard :minitest do
19
+ guard :minitest, all_after_pass: true do
18
20
  watch(%r{^test/(.*)\/?test_(.*)\.rb$})
19
21
  watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
20
22
  watch(%r{^test/helper\.rb$}) { 'test' }
21
23
  end
24
+
25
+ guard :reek do
26
+ watch(%r{^lib/.+\.rb$})
27
+ watch('.reek.yml')
28
+ end
29
+
30
+ guard :rubocop do
31
+ watch(/.+\.rb$/)
32
+ watch(%r{(?:.+/)?\.rubocop(?:_todo)?\.yml$}) { |m| File.dirname(m[0]) }
33
+ end
data/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # codeless_code
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/codeless_code.svg)](https://badge.fury.io/rb/codeless_code)
4
+ [![Build Status](https://travis-ci.org/sangster/codeless_code.svg?branch=master)](https://travis-ci.org/sangster/codeless_code)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/0b67f813b9c48e639888/maintainability)](https://codeclimate.com/github/sangster/codeless_code/maintainability)
6
+ <a href="https://codeclimate.com/github/sangster/codeless_code/test_coverage"><img src="https://api.codeclimate.com/v1/badges/0b67f813b9c48e639888/test_coverage" /></a>
7
+ [![GitHub license](https://img.shields.io/github/license/sangster/codeless_code.svg)](https://github.com/sangster/codeless_code/blob/master/LICENSE)
8
+
3
9
  Search and print [The Codeless Code](http://thecodelesscode.com/contents)
4
10
  fables.
5
11
 
data/Rakefile CHANGED
@@ -1,4 +1,5 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  # codeless_code filters and prints fables from http://thecodelesscode.com
3
4
  # Copyright (C) 2018 Jon Sangster
4
5
  #
@@ -21,8 +22,8 @@ require 'bundler'
21
22
  begin
22
23
  Bundler.setup(:default, :development)
23
24
  rescue Bundler::BundlerError => e
24
- $stderr.puts e.message
25
- $stderr.puts "Run `bundle install` to install missing gems"
25
+ warn e.message
26
+ warn 'Run `bundle install` to install missing gems'
26
27
  exit e.status_code
27
28
  end
28
29
 
@@ -37,9 +38,9 @@ require 'yard'
37
38
  require 'codeless_code'
38
39
 
39
40
  Jeweler::Tasks.new do |gem|
40
- gem.name = "codeless_code"
41
- gem.homepage = "https://github.com/sangster/codeless_code"
42
- gem.license = "GPL-3.0"
41
+ gem.name = 'codeless_code'
42
+ gem.homepage = 'https://github.com/sangster/codeless_code'
43
+ gem.license = 'GPL-3.0'
43
44
  gem.summary = 'Search and print The Codeless Code fables'
44
45
  gem.description = <<-DESC.gsub(/\s+/m, ' ').strip
45
46
  http://thecodelesscode.com contains many humorous and interesting fables
@@ -48,8 +49,8 @@ Jeweler::Tasks.new do |gem|
48
49
 
49
50
  This tool provides a CLI to filter through these fables and view them.
50
51
  DESC
51
- gem.email = "jon@ertt.ca"
52
- gem.authors = ["Jon Sangster"]
52
+ gem.email = 'jon@ertt.ca'
53
+ gem.authors = ['Jon Sangster']
53
54
  gem.files.include('data/**/*.txt')
54
55
  # dependencies defined in Gemfile
55
56
  end
@@ -62,9 +63,9 @@ Rake::TestTask.new(:test) do |test|
62
63
  end
63
64
  Rake::Task[:build].prerequisites << :test
64
65
 
65
- desc "Code coverage detail"
66
+ desc 'Code coverage detail'
66
67
  task :simplecov do
67
- ENV['COVERAGE'] = "true"
68
+ ENV['COVERAGE'] = 'true'
68
69
  Rake::Task['test'].execute
69
70
  end
70
71
 
@@ -96,4 +97,18 @@ namespace :readme do
96
97
  end
97
98
  end
98
99
 
99
- task default: :test
100
+ namespace :lint do
101
+ require 'reek/rake/task'
102
+ require 'rubocop/rake_task'
103
+
104
+ Reek::Rake::Task.new do |t|
105
+ t.fail_on_error = false
106
+ end
107
+
108
+ RuboCop::RakeTask.new
109
+ end
110
+
111
+ desc 'Run all linters'
112
+ task lint: ['lint:rubocop', 'lint:reek']
113
+
114
+ task default: %i[test lint]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.7
1
+ 0.1.8
data/bin/codeless_code CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  # vim: ft=ruby:
3
5
 
4
6
  require 'pathname'
@@ -7,4 +9,4 @@ require 'pry-byebug' if ENV.key?('DEBUG')
7
9
  $LOAD_PATH << Pathname.new(__dir__).join('..', 'lib')
8
10
  require 'codeless_code'
9
11
 
10
- CodelessCode::Cli.new(File.basename($0), ARGV).call
12
+ CodelessCode::Cli.new(File.basename($PROGRAM_NAME), ARGV).call
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: codeless_code 0.1.7 ruby lib
5
+ # stub: codeless_code 0.1.8 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "codeless_code".freeze
9
- s.version = "0.1.7"
9
+ s.version = "0.1.8"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Jon Sangster".freeze]
14
- s.date = "2018-11-05"
14
+ s.date = "2018-11-09"
15
15
  s.description = "http://thecodelesscode.com contains many humorous and interesting fables and koans. The authors have open-sourced these fables, and many tanslations, available at https://github.com/aldesantis/the-codeless-code. This tool provides a CLI to filter through these fables and view them.".freeze
16
16
  s.email = "jon@ertt.ca".freeze
17
17
  s.executables = ["codeless_code".freeze]
@@ -20,8 +20,11 @@ Gem::Specification.new do |s|
20
20
  "README.md"
21
21
  ]
22
22
  s.files = [
23
- ".document",
24
23
  ".gitmodules",
24
+ ".reek.yml",
25
+ ".rubocop.yml",
26
+ ".ruby-version",
27
+ ".travis.yml",
25
28
  "Gemfile",
26
29
  "Gemfile.lock",
27
30
  "Guardfile",
@@ -31,7 +34,6 @@ Gem::Specification.new do |s|
31
34
  "VERSION",
32
35
  "bin/codeless_code",
33
36
  "codeless_code.gemspec",
34
- "data/README.md",
35
37
  "data/the-codeless-code/cs-hanzik/case-1.txt",
36
38
  "data/the-codeless-code/cs-hanzik/case-10.txt",
37
39
  "data/the-codeless-code/cs-hanzik/case-11.txt",
@@ -1487,30 +1489,40 @@ Gem::Specification.new do |s|
1487
1489
  "lib/codeless_code/filters/composite.rb",
1488
1490
  "lib/codeless_code/filters/date.rb",
1489
1491
  "lib/codeless_code/filters/from_options.rb",
1490
- "lib/codeless_code/filters/header_integer.rb",
1491
- "lib/codeless_code/filters/header_string.rb",
1492
+ "lib/codeless_code/filters/headers/base.rb",
1493
+ "lib/codeless_code/filters/headers/integer.rb",
1494
+ "lib/codeless_code/filters/headers/string.rb",
1492
1495
  "lib/codeless_code/filters/lang.rb",
1493
1496
  "lib/codeless_code/filters/translator.rb",
1494
1497
  "lib/codeless_code/formats/base.rb",
1498
+ "lib/codeless_code/formats/parsers/base.rb",
1499
+ "lib/codeless_code/formats/parsers/plain.rb",
1500
+ "lib/codeless_code/formats/parsers/term.rb",
1495
1501
  "lib/codeless_code/formats/plain.rb",
1496
- "lib/codeless_code/formats/plain_generator.rb",
1497
1502
  "lib/codeless_code/formats/raw.rb",
1498
1503
  "lib/codeless_code/formats/term.rb",
1499
- "lib/codeless_code/formats/term_generator.rb",
1500
1504
  "lib/codeless_code/language_set.rb",
1501
1505
  "lib/codeless_code/options.rb",
1502
1506
  "lib/codeless_code/renderers/fable.rb",
1503
1507
  "lib/codeless_code/renderers/term_page.rb",
1508
+ "test/codeless_code/commands/test_filter_fables.rb",
1509
+ "test/codeless_code/filters/headers/test_integer.rb",
1510
+ "test/codeless_code/filters/headers/test_string.rb",
1504
1511
  "test/codeless_code/filters/test_builders.rb",
1505
- "test/codeless_code/filters/test_header_integer.rb",
1506
- "test/codeless_code/filters/test_header_string.rb",
1512
+ "test/codeless_code/filters/test_composite.rb",
1513
+ "test/codeless_code/filters/test_date.rb",
1514
+ "test/codeless_code/filters/test_langs.rb",
1515
+ "test/codeless_code/filters/test_translator.rb",
1516
+ "test/codeless_code/renderers/test_fable.rb",
1517
+ "test/codeless_code/renderers/test_term_page.rb",
1507
1518
  "test/codeless_code/test_catalog.rb",
1519
+ "test/codeless_code/test_cli.rb",
1508
1520
  "test/codeless_code/test_fable.rb",
1509
1521
  "test/codeless_code/test_fable_set.rb",
1510
1522
  "test/codeless_code/test_language_set.rb",
1511
1523
  "test/codeless_code/test_options.rb",
1512
1524
  "test/helper.rb",
1513
- "test/test_codeless_code.rb"
1525
+ "test/support/fs.rb"
1514
1526
  ]
1515
1527
  s.homepage = "https://github.com/sangster/codeless_code".freeze
1516
1528
  s.licenses = ["GPL-3.0".freeze]
@@ -1528,6 +1540,8 @@ Gem::Specification.new do |s|
1528
1540
  s.add_development_dependency(%q<bundler>.freeze, ["~> 1.17"])
1529
1541
  s.add_development_dependency(%q<guard>.freeze, ["~> 2.14"])
1530
1542
  s.add_development_dependency(%q<guard-minitest>.freeze, ["~> 2.4"])
1543
+ s.add_development_dependency(%q<guard-reek>.freeze, ["~> 1.2"])
1544
+ s.add_development_dependency(%q<guard-rubocop>.freeze, ["~> 1.3"])
1531
1545
  s.add_development_dependency(%q<jeweler>.freeze, ["~> 2.0"])
1532
1546
  s.add_development_dependency(%q<minitest>.freeze, ["~> 5.11"])
1533
1547
  s.add_development_dependency(%q<minitest-reporters>.freeze, ["~> 1.3"])
@@ -1535,6 +1549,7 @@ Gem::Specification.new do |s|
1535
1549
  s.add_development_dependency(%q<rake>.freeze, ["~> 12.3"])
1536
1550
  s.add_development_dependency(%q<rdoc>.freeze, ["~> 6.0"])
1537
1551
  s.add_development_dependency(%q<reek>.freeze, ["~> 5.2"])
1552
+ s.add_development_dependency(%q<rubocop>.freeze, ["~> 0.60"])
1538
1553
  s.add_development_dependency(%q<simplecov>.freeze, ["~> 0.16"])
1539
1554
  s.add_development_dependency(%q<yard>.freeze, ["~> 0.9"])
1540
1555
  else
@@ -1545,6 +1560,8 @@ Gem::Specification.new do |s|
1545
1560
  s.add_dependency(%q<bundler>.freeze, ["~> 1.17"])
1546
1561
  s.add_dependency(%q<guard>.freeze, ["~> 2.14"])
1547
1562
  s.add_dependency(%q<guard-minitest>.freeze, ["~> 2.4"])
1563
+ s.add_dependency(%q<guard-reek>.freeze, ["~> 1.2"])
1564
+ s.add_dependency(%q<guard-rubocop>.freeze, ["~> 1.3"])
1548
1565
  s.add_dependency(%q<jeweler>.freeze, ["~> 2.0"])
1549
1566
  s.add_dependency(%q<minitest>.freeze, ["~> 5.11"])
1550
1567
  s.add_dependency(%q<minitest-reporters>.freeze, ["~> 1.3"])
@@ -1552,6 +1569,7 @@ Gem::Specification.new do |s|
1552
1569
  s.add_dependency(%q<rake>.freeze, ["~> 12.3"])
1553
1570
  s.add_dependency(%q<rdoc>.freeze, ["~> 6.0"])
1554
1571
  s.add_dependency(%q<reek>.freeze, ["~> 5.2"])
1572
+ s.add_dependency(%q<rubocop>.freeze, ["~> 0.60"])
1555
1573
  s.add_dependency(%q<simplecov>.freeze, ["~> 0.16"])
1556
1574
  s.add_dependency(%q<yard>.freeze, ["~> 0.9"])
1557
1575
  end
@@ -1563,6 +1581,8 @@ Gem::Specification.new do |s|
1563
1581
  s.add_dependency(%q<bundler>.freeze, ["~> 1.17"])
1564
1582
  s.add_dependency(%q<guard>.freeze, ["~> 2.14"])
1565
1583
  s.add_dependency(%q<guard-minitest>.freeze, ["~> 2.4"])
1584
+ s.add_dependency(%q<guard-reek>.freeze, ["~> 1.2"])
1585
+ s.add_dependency(%q<guard-rubocop>.freeze, ["~> 1.3"])
1566
1586
  s.add_dependency(%q<jeweler>.freeze, ["~> 2.0"])
1567
1587
  s.add_dependency(%q<minitest>.freeze, ["~> 5.11"])
1568
1588
  s.add_dependency(%q<minitest-reporters>.freeze, ["~> 1.3"])
@@ -1570,6 +1590,7 @@ Gem::Specification.new do |s|
1570
1590
  s.add_dependency(%q<rake>.freeze, ["~> 12.3"])
1571
1591
  s.add_dependency(%q<rdoc>.freeze, ["~> 6.0"])
1572
1592
  s.add_dependency(%q<reek>.freeze, ["~> 5.2"])
1593
+ s.add_dependency(%q<rubocop>.freeze, ["~> 0.60"])
1573
1594
  s.add_dependency(%q<simplecov>.freeze, ["~> 0.16"])
1574
1595
  s.add_dependency(%q<yard>.freeze, ["~> 0.9"])
1575
1596
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # codeless_code filters and prints fables from http://thecodelesscode.com
2
4
  # Copyright (C) 2018 Jon Sangster
3
5
  #
@@ -41,7 +43,7 @@ module CodelessCode
41
43
  LanguageSet.new(lang, root_dir: @root_dir)
42
44
  else
43
45
  raise LanguageSet::NotFoundError,
44
- format("No fables for language %p", lang)
46
+ format('No fables for language %p', lang)
45
47
  end
46
48
  end
47
49
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # codeless_code filters and prints fables from http://thecodelesscode.com
2
4
  # Copyright (C) 2018 Jon Sangster
3
5
  #
@@ -17,63 +19,77 @@ require 'date'
17
19
  require 'slop'
18
20
 
19
21
  module CodelessCode
22
+ # Parse command-line parameters and dispatch them to the user's chosen
23
+ # "command."
20
24
  class Cli
21
- def initialize(command_name = $0, args = ARGV)
25
+ def initialize(command_name = $PROGRAM_NAME, args = ARGV)
22
26
  @command_name = command_name
23
27
  @args = args
24
28
  end
25
29
 
26
30
  def call
27
31
  user_io = io_open
32
+ call_io(user_io)
33
+ rescue Slop::Error => err
34
+ warn format("%s\n\n%s", err, options.help)
35
+ exit 1
36
+ ensure
37
+ user_io&.close
38
+ end
39
+
40
+ private
28
41
 
42
+ def call_io(user_io)
29
43
  if options.key?(:help)
30
- (user_io || $stdout).puts options.help
44
+ io_puts(user_io, options.help)
31
45
  elsif options.key?(:version)
32
- (user_io || $stdout).puts version_str
46
+ io_puts(user_io, version_str)
33
47
  elsif options.key?(:list_translations)
34
- Commands::ListTranslations.new(catalog, io: user_io).call
48
+ list_translations(user_io)
35
49
  else
36
- Commands::FilterFables.new(catalog, options, io: user_io)
37
- .call(&method(:select))
50
+ filter_fables(user_io)
38
51
  end
39
-
40
- rescue Slop::Error => e
41
- warn format("%s\n\n%s", e, options.help)
42
- exit 1
43
- ensure
44
- user_io&.close
45
52
  end
46
53
 
47
- private
54
+ # :reek:ControlParameter
55
+ # :reek:UtilityFunction
56
+ def io_puts(io, *args)
57
+ (io || $stdout).puts(*args)
58
+ end
48
59
 
49
60
  def options
50
61
  @options ||= Options.new(@command_name, @args)
51
62
  end
52
63
 
64
+ def list_translations(user_io)
65
+ Commands::ListTranslations.new(catalog, io: user_io).call
66
+ end
67
+
68
+ def filter_fables(user_io)
69
+ Commands::FilterFables.new(catalog, options, io: user_io)
70
+ .call(&method(:select_rand))
71
+ end
72
+
53
73
  def catalog
54
74
  @catalog ||= Catalog.new(options.data_dir)
55
75
  end
56
76
 
57
77
  # @return [IO,nil] the user's chosen output stream. +nil+ if unspecified
78
+ # :reek:FeatureEnvy
58
79
  def io_open
59
- if (path = options[:output])
60
- path == '-' ? $stdout.dup : File.open(path, 'w')
61
- end
62
- end
80
+ path = options[:output]
81
+ return if path.nil?
63
82
 
64
- def select(fables)
65
- select_rand(fables)
83
+ path == '-' ? $stdout.dup : File.open(path, 'w')
66
84
  end
67
85
 
68
86
  # @return [Enumerable<Fable>] a random subset of the given collection, as
69
87
  # specified by {#options}
70
88
  def select_rand(fables)
71
89
  if options[:daily]
72
- fables.sample(1, random: Random.new(Date.today.strftime('%Y%m%d').to_i))
90
+ fables.sample(1, random: date_random_generator)
73
91
  elsif (count = options[:random_set])
74
- if count&.to_i&.to_s != count
75
- raise ArgumentError, format('not a number %p', count)
76
- end
92
+ assert_num!(count)
77
93
  fables.sample(count&.to_i)
78
94
  elsif options[:random]
79
95
  fables.sample(1)
@@ -82,6 +98,22 @@ module CodelessCode
82
98
  end
83
99
  end
84
100
 
101
+ # :reek:UtilityFunction
102
+ def date_random_generator
103
+ Random.new(::Date.today.strftime('%Y%m%d').to_i)
104
+ end
105
+
106
+ def assert_num!(num)
107
+ return unless assert_num(num)
108
+
109
+ raise ArgumentError, format('not a number %p', num)
110
+ end
111
+
112
+ # :reek:UtilityFunction
113
+ def assert_num(num)
114
+ num&.to_i&.to_s != num
115
+ end
116
+
85
117
  def version_str
86
118
  format(['%s %s', '%s', 'See <%s>'].join("\n\n"), @command_name, VERSION,
87
119
  copyright_summary, 'https://github.com/sangster/codeless_code')
@@ -92,7 +124,7 @@ module CodelessCode
92
124
  'Copyright (C) %<date>d Jon Sangster',
93
125
  'License GPL-3.0: GNU General Public License v3.0 <%<url>s>',
94
126
  'This is free software: you are free to change and redistribute it.',
95
- 'There is NO WARRANTY, to the extent permitted by law.',
127
+ 'There is NO WARRANTY, to the extent permitted by law.'
96
128
  ].join("\n")
97
129
 
98
130
  format(template, date: ::Date.today.year,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # codeless_code filters and prints fables from http://thecodelesscode.com
2
4
  # Copyright (C) 2018 Jon Sangster
3
5
  #
@@ -29,11 +31,8 @@ module CodelessCode
29
31
  @io = io
30
32
  end
31
33
 
32
- def call
33
- filter = Filters::FromOptions.new(options)
34
- fables = @catalog.select(filter)
35
- fables = yield fables if block_given?
36
- fables = sort(fables)
34
+ def call(&blk)
35
+ fables = filters_from_options(&blk)
37
36
 
38
37
  case fables.size
39
38
  when 0
@@ -47,9 +46,16 @@ module CodelessCode
47
46
 
48
47
  private
49
48
 
49
+ def filters_from_options
50
+ filter = Filters::FromOptions.new(options)
51
+ fables = @catalog.select(filter)
52
+ fables = yield fables if block_given?
53
+ sort(fables)
54
+ end
55
+
50
56
  def sort(fables)
51
57
  if options.key?(:sort)
52
- fables = fables.sort_by { |f| f[options[:sort]] || "\uffff" }
58
+ fables = fables.sort_by { |fable| fable[options[:sort]] || "\uffff" }
53
59
  end
54
60
  fables = fables.reverse if options[:reverse]
55
61
  fables
@@ -64,9 +70,7 @@ module CodelessCode
64
70
  end
65
71
 
66
72
  def pager(cmd, fable)
67
- io = open format('|%s', cmd), 'w'
68
- pid = io.pid
69
-
73
+ io = IO.popen(cmd, 'w')
70
74
  io.puts for_pager(fable)
71
75
  ensure
72
76
  io&.close
@@ -98,12 +102,13 @@ module CodelessCode
98
102
 
99
103
  def title_width(fables)
100
104
  if options[:columns]
101
- -fables.map { |f| render(f).best_title.size }.compact.max
105
+ -fables.map { |fable| render(fable).best_title.size }.compact.max
102
106
  else
103
107
  ''
104
108
  end
105
109
  end
106
110
 
111
+ # :reek:UtilityFunction
107
112
  def render(fable)
108
113
  Renderers::Fable.new(fable)
109
114
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # codeless_code filters and prints fables from http://thecodelesscode.com
2
4
  # Copyright (C) 2018 Jon Sangster
3
5
  #
@@ -15,6 +17,7 @@
15
17
  # this program. If not, see <https://www.gnu.org/licenses/>.
16
18
  module CodelessCode
17
19
  module Commands
20
+ # List all the translations available in the given {Catalog}.
18
21
  class ListTranslations
19
22
  # @param io [IO] if given, the output will be written to this stream,
20
23
  # otherwise STDOUT will be used