codeless_code 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
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