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.
- checksums.yaml +4 -4
- data/.gitmodules +1 -1
- data/.reek.yml +14 -0
- data/.rubocop.yml +18 -0
- data/.ruby-version +1 -0
- data/{test/test_codeless_code.rb → .travis.yml} +12 -10
- data/Gemfile +5 -0
- data/Gemfile.lock +21 -0
- data/Guardfile +13 -1
- data/README.md +6 -0
- data/Rakefile +26 -11
- data/VERSION +1 -1
- data/bin/codeless_code +3 -1
- data/codeless_code.gemspec +33 -12
- data/lib/codeless_code/catalog.rb +3 -1
- data/lib/codeless_code/cli.rb +56 -24
- data/lib/codeless_code/commands/filter_fables.rb +15 -10
- data/lib/codeless_code/commands/list_translations.rb +3 -0
- data/lib/codeless_code/fable.rb +42 -53
- data/lib/codeless_code/fable_set.rb +8 -6
- data/lib/codeless_code/filters/builders.rb +4 -2
- data/lib/codeless_code/filters/composite.rb +3 -1
- data/lib/codeless_code/filters/date.rb +40 -30
- data/lib/codeless_code/filters/from_options.rb +45 -28
- data/lib/codeless_code/filters/headers/base.rb +61 -0
- data/lib/codeless_code/filters/{header_integer.rb → headers/integer.rb} +16 -19
- data/lib/codeless_code/filters/{header_string.rb → headers/string.rb} +12 -22
- data/lib/codeless_code/filters/lang.rb +3 -0
- data/lib/codeless_code/filters/translator.rb +7 -2
- data/lib/codeless_code/filters.rb +16 -8
- data/lib/codeless_code/formats/base.rb +20 -7
- data/lib/codeless_code/formats/parsers/base.rb +106 -0
- data/lib/codeless_code/formats/parsers/plain.rb +49 -0
- data/lib/codeless_code/formats/parsers/term.rb +79 -0
- data/lib/codeless_code/formats/plain.rb +21 -12
- data/lib/codeless_code/formats/raw.rb +2 -0
- data/lib/codeless_code/formats/term.rb +21 -15
- data/lib/codeless_code/language_set.rb +7 -4
- data/lib/codeless_code/options.rb +5 -3
- data/lib/codeless_code/renderers/fable.rb +13 -8
- data/lib/codeless_code/renderers/term_page.rb +46 -31
- data/lib/codeless_code.rb +119 -106
- data/test/codeless_code/commands/test_filter_fables.rb +89 -0
- data/test/codeless_code/filters/headers/test_integer.rb +86 -0
- data/test/codeless_code/filters/headers/test_string.rb +86 -0
- data/test/codeless_code/filters/test_builders.rb +4 -2
- data/test/codeless_code/filters/test_composite.rb +70 -0
- data/test/codeless_code/filters/test_date.rb +99 -0
- data/test/codeless_code/filters/test_langs.rb +50 -0
- data/test/codeless_code/filters/test_translator.rb +51 -0
- data/test/codeless_code/renderers/test_fable.rb +98 -0
- data/test/codeless_code/renderers/test_term_page.rb +87 -0
- data/test/codeless_code/test_catalog.rb +12 -5
- data/test/codeless_code/test_cli.rb +85 -0
- data/test/codeless_code/test_fable.rb +19 -10
- data/test/codeless_code/test_fable_set.rb +17 -5
- data/test/codeless_code/test_language_set.rb +16 -3
- data/test/codeless_code/test_options.rb +3 -11
- data/test/helper.rb +36 -10
- data/test/support/fs.rb +103 -0
- metadata +65 -11
- data/.document +0 -5
- data/data/README.md +0 -34
- data/lib/codeless_code/formats/plain_generator.rb +0 -157
- data/lib/codeless_code/formats/term_generator.rb +0 -167
- data/test/codeless_code/filters/test_header_integer.rb +0 -82
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5154091052ec2023109ecdc022ec10fdfa3762dcec89f1dd2f6203acac57018d
|
4
|
+
data.tar.gz: f9eb3c12e08dd25885faf6d758d67e1020d324a8ce53ab7c77b486b001eeceb1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bba85e6463c19551a62b0064af87905f0bc1781bcaf198591c2513b4157ae514cc0fd17e31da864683be25c599c7d4170250ecfee8a098c45df9caab6d40600d
|
7
|
+
data.tar.gz: 4d8b4f45d6511bac204a88bb5b936a5303da0d5bbed221bdfa0531e03ee45193bcce7ae3f959c5d3c1b41f8ea75359598a5d010a09e98393dfa57dfd9a1de525
|
data/.gitmodules
CHANGED
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
|
-
|
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
|
-
#
|
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
|
-
|
25
|
-
|
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 =
|
41
|
-
gem.homepage =
|
42
|
-
gem.license =
|
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 =
|
52
|
-
gem.authors = [
|
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
|
66
|
+
desc 'Code coverage detail'
|
66
67
|
task :simplecov do
|
67
|
-
ENV['COVERAGE'] =
|
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
|
-
|
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.
|
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($
|
12
|
+
CodelessCode::Cli.new(File.basename($PROGRAM_NAME), ARGV).call
|
data/codeless_code.gemspec
CHANGED
@@ -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.
|
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.
|
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-
|
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/
|
1491
|
-
"lib/codeless_code/filters/
|
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/
|
1506
|
-
"test/codeless_code/filters/
|
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/
|
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(
|
46
|
+
format('No fables for language %p', lang)
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
data/lib/codeless_code/cli.rb
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
|
#
|
@@ -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 = $
|
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
|
44
|
+
io_puts(user_io, options.help)
|
31
45
|
elsif options.key?(:version)
|
32
|
-
(user_io
|
46
|
+
io_puts(user_io, version_str)
|
33
47
|
elsif options.key?(:list_translations)
|
34
|
-
|
48
|
+
list_translations(user_io)
|
35
49
|
else
|
36
|
-
|
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
|
-
|
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
|
-
|
60
|
-
|
61
|
-
end
|
62
|
-
end
|
80
|
+
path = options[:output]
|
81
|
+
return if path.nil?
|
63
82
|
|
64
|
-
|
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:
|
90
|
+
fables.sample(1, random: date_random_generator)
|
73
91
|
elsif (count = options[:random_set])
|
74
|
-
|
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
|
-
|
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 { |
|
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 =
|
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 { |
|
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
|