output_mode 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 +7 -0
- data/.gitignore +15 -0
- data/.rspec +3 -0
- data/.travis.yml +13 -0
- data/Gemfile +30 -0
- data/LICENSE.txt +18 -0
- data/README.md +67 -0
- data/Rakefile +32 -0
- data/bin/console +37 -0
- data/bin/demo +60 -0
- data/bin/setup +34 -0
- data/lib/output_mode.rb +34 -0
- data/lib/output_mode/builder_dsl.rb +50 -0
- data/lib/output_mode/callable.rb +138 -0
- data/lib/output_mode/default_erb.rb +19 -0
- data/lib/output_mode/errors.rb +30 -0
- data/lib/output_mode/output.rb +127 -0
- data/lib/output_mode/outputs.rb +36 -0
- data/lib/output_mode/outputs/delimited.rb +49 -0
- data/lib/output_mode/outputs/tabulated.rb +73 -0
- data/lib/output_mode/outputs/templated.rb +128 -0
- data/lib/output_mode/tldr.rb +34 -0
- data/lib/output_mode/tldr/index.rb +55 -0
- data/lib/output_mode/tldr/show.rb +56 -0
- data/lib/output_mode/version.rb +29 -0
- data/output_mode.gemspec +59 -0
- metadata +166 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
#==============================================================================
|
2
|
+
# Copyright 2020 William McCumstie
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
#
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
15
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
16
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
17
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
18
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
19
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
20
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
21
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
22
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
23
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
24
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
#==============================================================================
|
26
|
+
|
27
|
+
module OutputMode
|
28
|
+
module TLDR
|
29
|
+
Dir.glob(File.expand_path('tldr/*.rb', __dir__)).each do |path|
|
30
|
+
autoload File.basename(path).chomp('.rb').capitalize, path
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#==============================================================================
|
2
|
+
# Refer to LICENSE.txt for licensing terms
|
3
|
+
#==============================================================================
|
4
|
+
|
5
|
+
module OutputMode
|
6
|
+
module TLDR
|
7
|
+
module Index
|
8
|
+
include BuilderDSL
|
9
|
+
|
10
|
+
# Register a new column in the Index table
|
11
|
+
# @overload register_callable(header:, verbose: true)
|
12
|
+
# @param header: The column's header field when displaying to humans
|
13
|
+
# @param verbose: Whether the column will be shown in the verbose output
|
14
|
+
# @yieldparam model The subject the column is describing, some sort of data model
|
15
|
+
def register_callable(header:, verbose: nil, &b)
|
16
|
+
super(modes: { verbose: verbose }, header: header, &b)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Creates an new +output+ from the verbosity flag. This method only uses
|
20
|
+
# +$stdout+ as part of it's output class discovery logic. It does not
|
21
|
+
# print to the output directly
|
22
|
+
#
|
23
|
+
# If +$stdout+ is an interactive shell (aka a TTY), then it will display using
|
24
|
+
# {OutputMode::Outputs::Tabulated}. This is intended for human consumption
|
25
|
+
# and will obey the provided +verbose+ flag.
|
26
|
+
#
|
27
|
+
# If +$stdout+ is non-interactive, then it will display using
|
28
|
+
# {OutputMode::Outputs::Delimited} using tab delimiters. This is intended
|
29
|
+
# for consumption by machines. This output ignores the provided +verbose+
|
30
|
+
# flag as it is always verbose.
|
31
|
+
def build_output(verbose: false)
|
32
|
+
callables = if verbose || !$stdout.tty?
|
33
|
+
# Filter out columns that are explicitly not verbose
|
34
|
+
output_callables.select(&:verbose!)
|
35
|
+
else
|
36
|
+
# Filter out columns that are explicitly verbose
|
37
|
+
output_callables.reject(&:verbose?)
|
38
|
+
end
|
39
|
+
|
40
|
+
if $stdout.tty?
|
41
|
+
# Creates the human readable output
|
42
|
+
Outputs::Tabulated.new(*callables,
|
43
|
+
header: callables.map { |c| c.config.fetch(:header, 'missing') },
|
44
|
+
renderer: :unicode,
|
45
|
+
padding: [0,1],
|
46
|
+
default: '(none)',
|
47
|
+
yes: '✓', no: '✕')
|
48
|
+
else
|
49
|
+
# Creates the machine readable output
|
50
|
+
Outputs::Delimited.new(*callables, col_sep: "\t", yes: 'y', no: 'n', default: '')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#==============================================================================
|
2
|
+
# Refer to LICENSE.txt for licensing terms
|
3
|
+
#==============================================================================
|
4
|
+
|
5
|
+
require 'tty-color'
|
6
|
+
|
7
|
+
module OutputMode
|
8
|
+
module TLDR
|
9
|
+
module Show
|
10
|
+
include BuilderDSL
|
11
|
+
|
12
|
+
# Register a field when displaying a model
|
13
|
+
# @overload register_callable(header:, verbose: true)
|
14
|
+
# @param header: The human readable key to the field, uses the term 'header' for consistency
|
15
|
+
# @param verbose: Whether the field will be shown in the verbose output
|
16
|
+
# @yieldparam model The subject the column is describing, some sort of data model
|
17
|
+
def register_callable(header:, verbose: nil, &b)
|
18
|
+
super(modes: { verbose: verbose }, header: header, &b)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Creates an new +output+ from the verbosity flag. This method only uses
|
22
|
+
# +$stdout+ as part of it's output class discovery logic. It does not
|
23
|
+
# print to the io directly
|
24
|
+
#
|
25
|
+
# If +$stdout+ is an interactive shell (aka a TTY), then it will display using
|
26
|
+
# {OutputMode::Outputs::Templated}. This is intended for human consumption
|
27
|
+
# and will obey the provided +verbose+ flag.
|
28
|
+
#
|
29
|
+
# If +$stdout+ is non-interactive, then it will display using
|
30
|
+
# {OutputMode::Outputs::Delimited} using tab delimiters. This is intended
|
31
|
+
# for consumption by machines. This output ignores the provided +verbose+
|
32
|
+
# flag as it is always verbose.
|
33
|
+
def build_output(verbose: false)
|
34
|
+
callables = if verbose || !$stdout.tty?
|
35
|
+
# Filter out columns that are explicitly not verbose
|
36
|
+
output_callables.select(&:verbose!)
|
37
|
+
else
|
38
|
+
# Filter out columns that are explicitly verbose
|
39
|
+
output_callables.reject(&:verbose?)
|
40
|
+
end
|
41
|
+
|
42
|
+
if $stdout.tty?
|
43
|
+
# Creates the human readable output
|
44
|
+
Outputs::Templated.new(*callables,
|
45
|
+
fields: callables.map { |c| c.config.fetch(:header, 'missing') },
|
46
|
+
colorize: TTY::Color.color?,
|
47
|
+
default: '(none)',
|
48
|
+
yes: '✓', no: '✕')
|
49
|
+
else
|
50
|
+
# Creates the machine readable output
|
51
|
+
Outputs::Delimited.new(*callables, col_sep: "\t", yes: 'y', no: 'n', default: '')
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#==============================================================================
|
2
|
+
# Copyright 2020 William McCumstie
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
#
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
15
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
16
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
17
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
18
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
19
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
20
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
21
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
22
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
23
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
24
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
#==============================================================================
|
26
|
+
|
27
|
+
module OutputMode
|
28
|
+
VERSION = "1.0.0"
|
29
|
+
end
|
data/output_mode.gemspec
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
#==============================================================================
|
2
|
+
# Copyright 2020 William McCumstie
|
3
|
+
#
|
4
|
+
# Redistribution and use in source and binary forms, with or without
|
5
|
+
# modification, are permitted provided that the following conditions are met:
|
6
|
+
#
|
7
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
# this list of conditions and the following disclaimer.
|
9
|
+
#
|
10
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
# this list of conditions and the following disclaimer in the documentation
|
12
|
+
# and/or other materials provided with the distribution.
|
13
|
+
#
|
14
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
15
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
16
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
17
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
18
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
19
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
20
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
21
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
22
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
23
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
24
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
25
|
+
#==============================================================================
|
26
|
+
|
27
|
+
lib = File.expand_path("lib", __dir__)
|
28
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
29
|
+
require "output_mode/version"
|
30
|
+
|
31
|
+
Gem::Specification.new do |spec|
|
32
|
+
spec.name = "output_mode"
|
33
|
+
spec.version = OutputMode::VERSION
|
34
|
+
spec.authors = ["William McCumsite"]
|
35
|
+
spec.email = ["openlicense.williams@gmail.com"]
|
36
|
+
|
37
|
+
spec.summary = %q{Toggle human and machine readable outputs}
|
38
|
+
spec.homepage = "https://github.com/WilliamMcCumstie/output_mode"
|
39
|
+
|
40
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
41
|
+
|
42
|
+
# Specify which files should be added to the gem when it is released.
|
43
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
44
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
45
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
46
|
+
end
|
47
|
+
spec.bindir = "exe"
|
48
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
49
|
+
spec.require_paths = ["lib"]
|
50
|
+
|
51
|
+
spec.add_runtime_dependency 'tty-table', '~> 0.11'
|
52
|
+
spec.add_runtime_dependency 'pastel', '~> 0.7'
|
53
|
+
spec.add_runtime_dependency 'tty-color', '~> 0.5'
|
54
|
+
|
55
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
56
|
+
spec.add_development_dependency "rake", ">= 12.3.3"
|
57
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
58
|
+
spec.add_development_dependency "pry", "> 0.11"
|
59
|
+
end
|
metadata
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: output_mode
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- William McCumsite
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-06-30 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: tty-table
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.11'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.11'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: pastel
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.7'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.7'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: tty-color
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.5'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 12.3.3
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 12.3.3
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.11'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.11'
|
111
|
+
description:
|
112
|
+
email:
|
113
|
+
- openlicense.williams@gmail.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- ".gitignore"
|
119
|
+
- ".rspec"
|
120
|
+
- ".travis.yml"
|
121
|
+
- Gemfile
|
122
|
+
- LICENSE.txt
|
123
|
+
- README.md
|
124
|
+
- Rakefile
|
125
|
+
- bin/console
|
126
|
+
- bin/demo
|
127
|
+
- bin/setup
|
128
|
+
- lib/output_mode.rb
|
129
|
+
- lib/output_mode/builder_dsl.rb
|
130
|
+
- lib/output_mode/callable.rb
|
131
|
+
- lib/output_mode/default_erb.rb
|
132
|
+
- lib/output_mode/errors.rb
|
133
|
+
- lib/output_mode/output.rb
|
134
|
+
- lib/output_mode/outputs.rb
|
135
|
+
- lib/output_mode/outputs/delimited.rb
|
136
|
+
- lib/output_mode/outputs/tabulated.rb
|
137
|
+
- lib/output_mode/outputs/templated.rb
|
138
|
+
- lib/output_mode/tldr.rb
|
139
|
+
- lib/output_mode/tldr/index.rb
|
140
|
+
- lib/output_mode/tldr/show.rb
|
141
|
+
- lib/output_mode/version.rb
|
142
|
+
- output_mode.gemspec
|
143
|
+
homepage: https://github.com/WilliamMcCumstie/output_mode
|
144
|
+
licenses: []
|
145
|
+
metadata:
|
146
|
+
homepage_uri: https://github.com/WilliamMcCumstie/output_mode
|
147
|
+
post_install_message:
|
148
|
+
rdoc_options: []
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - ">="
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '0'
|
156
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
requirements: []
|
162
|
+
rubygems_version: 3.0.3
|
163
|
+
signing_key:
|
164
|
+
specification_version: 4
|
165
|
+
summary: Toggle human and machine readable outputs
|
166
|
+
test_files: []
|