simple-printer 0.3
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 +3 -0
- data/Gemfile +3 -0
- data/README.md +1 -0
- data/Rakefile +9 -0
- data/lib/simple-printer.rb +103 -0
- data/simple-printer.gemspec +22 -0
- data/test/printer_test.rb +128 -0
- metadata +106 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8d89abf8ff83bbe41f913625df7dad960f6514d2687ef46a74430fbe77a2e661
|
4
|
+
data.tar.gz: bca76d47d03b09f140acf897b55f62c8d97a8a4edeb77a524ab1e3ecff073224
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2aa0b274470e167818a93d7d3bef82adebed21662ee057a9b8fc2b57cc864f288e87aa9890b47eee681c0031205cc3461bf8abd2c96ac7c916d3eeaeec04c91a
|
7
|
+
data.tar.gz: 62b74812de8b3f78fc7a1ee79117c3e5fa8525a9b403617c4eaae56db0237ff4bed4c59debd041f4c2748b25acdcccabbab8e9d3f9c17e2ce39a7de2e8936141
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
FIXME
|
data/Rakefile
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
|
3
|
+
module Simple
|
4
|
+
|
5
|
+
class Printer
|
6
|
+
|
7
|
+
def self.print(*fields, **params)
|
8
|
+
new(fields).print(**params)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(fields)
|
12
|
+
@fields = fields.map { |s| Field.make(spec: s) }
|
13
|
+
end
|
14
|
+
|
15
|
+
def print(output: STDOUT, indent: 0)
|
16
|
+
output ||= StringIO.new
|
17
|
+
max_label_width = @fields.map { |f| f.label.length }.max
|
18
|
+
@fields.each do |field|
|
19
|
+
output.puts '%s%*s:%s' % [
|
20
|
+
' ' * indent,
|
21
|
+
max_label_width,
|
22
|
+
field.label,
|
23
|
+
field.value.nil? ? '' : " #{field.value}",
|
24
|
+
]
|
25
|
+
if field.children
|
26
|
+
field.children.each_with_index do |o, i|
|
27
|
+
output.puts if i > 0
|
28
|
+
o.print(output: output, indent: indent + 2 + max_label_width)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
if output.kind_of?(StringIO)
|
33
|
+
output.rewind
|
34
|
+
output.read
|
35
|
+
else
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Field
|
41
|
+
|
42
|
+
attr_accessor :key
|
43
|
+
attr_accessor :label
|
44
|
+
attr_accessor :value
|
45
|
+
attr_accessor :children
|
46
|
+
|
47
|
+
def self.make(spec:, object: nil)
|
48
|
+
return spec if spec.kind_of?(Field)
|
49
|
+
Field.new.tap do |field|
|
50
|
+
case spec
|
51
|
+
when Symbol
|
52
|
+
field.key = spec
|
53
|
+
when Array
|
54
|
+
spec = spec.dup
|
55
|
+
field.key = spec.shift if spec.first.kind_of?(Symbol)
|
56
|
+
field.label = spec.shift if spec.first.kind_of?(String)
|
57
|
+
case (v = spec.shift)
|
58
|
+
when Array
|
59
|
+
field.children = v
|
60
|
+
else
|
61
|
+
field.value = v
|
62
|
+
end
|
63
|
+
when Hash
|
64
|
+
field.key, field.label, field.value, field.children = spec[:key], spec[:label], spec[:value], spec[:children]
|
65
|
+
else
|
66
|
+
raise "Unknown field specification: #{spec.inspect}"
|
67
|
+
end
|
68
|
+
if field.key
|
69
|
+
field.label ||= field.key.to_s.tr('_', ' ').capitalize
|
70
|
+
if field.value.nil?
|
71
|
+
raise "No object specified" unless object
|
72
|
+
v = object.send(field.key)
|
73
|
+
if v.kind_of?(Array)
|
74
|
+
field.children = v
|
75
|
+
else
|
76
|
+
field.value = v
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def initialize(params={})
|
84
|
+
params.each { |k, v| send("#{k}=", v) }
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
module Printable
|
90
|
+
|
91
|
+
def printable
|
92
|
+
[]
|
93
|
+
end
|
94
|
+
|
95
|
+
def print(**params)
|
96
|
+
Printer.new(printable.map { |s| Field.make(spec: s, object: self) }).print(**params)
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'simple-printer'
|
3
|
+
s.version = '0.3'
|
4
|
+
s.summary = 'Print objects easier'
|
5
|
+
s.author = 'John Labovitz'
|
6
|
+
s.email = 'johnl@johnlabovitz.com'
|
7
|
+
s.description = %q{
|
8
|
+
Simple::Printer makes it easier to print objects.
|
9
|
+
}.strip
|
10
|
+
s.license = 'MIT'
|
11
|
+
s.homepage = 'http://github.com/jslabovitz/simple-printer'
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
15
|
+
s.require_path = 'lib'
|
16
|
+
|
17
|
+
s.add_development_dependency 'bundler', '~> 2.5'
|
18
|
+
s.add_development_dependency 'minitest', '~> 5.22'
|
19
|
+
s.add_development_dependency 'minitest-power_assert', '~> 0.3'
|
20
|
+
s.add_development_dependency 'rake', '~> 13.2'
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/power_assert'
|
3
|
+
|
4
|
+
require 'simple-printer'
|
5
|
+
|
6
|
+
class Test < Minitest::Test
|
7
|
+
|
8
|
+
class A
|
9
|
+
|
10
|
+
attr_accessor :x
|
11
|
+
attr_accessor :y
|
12
|
+
|
13
|
+
include Simple::Printer::Printable
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@x = 'x'
|
17
|
+
@y = 'y'
|
18
|
+
end
|
19
|
+
|
20
|
+
def printable
|
21
|
+
[
|
22
|
+
:x,
|
23
|
+
[:y, 'Y', @y],
|
24
|
+
]
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
class B < A
|
30
|
+
|
31
|
+
attr_accessor :z
|
32
|
+
|
33
|
+
def initialize
|
34
|
+
super
|
35
|
+
@z = 'z'
|
36
|
+
end
|
37
|
+
|
38
|
+
def printable
|
39
|
+
super + [
|
40
|
+
Simple::Printer::Field.new(key: :z, label: 'Z', value: @z),
|
41
|
+
]
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
class D
|
47
|
+
|
48
|
+
attr_accessor :d
|
49
|
+
|
50
|
+
include Simple::Printer::Printable
|
51
|
+
|
52
|
+
def initialize
|
53
|
+
@d = 'd'
|
54
|
+
end
|
55
|
+
|
56
|
+
def printable
|
57
|
+
[
|
58
|
+
:d,
|
59
|
+
]
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
class C < A
|
65
|
+
|
66
|
+
attr_accessor :d
|
67
|
+
|
68
|
+
def initialize
|
69
|
+
super
|
70
|
+
@d = 3.times.map { D.new }
|
71
|
+
end
|
72
|
+
|
73
|
+
def printable
|
74
|
+
super + [:d]
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_simple
|
80
|
+
a = A.new
|
81
|
+
output = a.print(output: nil)
|
82
|
+
expected_output = <<~END
|
83
|
+
X: x
|
84
|
+
Y: y
|
85
|
+
END
|
86
|
+
assert { output == expected_output }
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_inherited
|
90
|
+
b = B.new
|
91
|
+
output = b.print(output: nil)
|
92
|
+
expected_output = <<~END
|
93
|
+
X: x
|
94
|
+
Y: y
|
95
|
+
Z: z
|
96
|
+
END
|
97
|
+
assert { output == expected_output }
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_nested
|
101
|
+
c = C.new
|
102
|
+
output = c.print(output: nil)
|
103
|
+
expected_output = <<~END
|
104
|
+
X: x
|
105
|
+
Y: y
|
106
|
+
D:
|
107
|
+
D: d
|
108
|
+
|
109
|
+
D: d
|
110
|
+
|
111
|
+
D: d
|
112
|
+
END
|
113
|
+
assert { output == expected_output }
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_standalone
|
117
|
+
output = Simple::Printer.print(
|
118
|
+
['Foo', 'foo'],
|
119
|
+
['Bar', 2],
|
120
|
+
output: nil)
|
121
|
+
expected_output = <<~END
|
122
|
+
Foo: foo
|
123
|
+
Bar: 2
|
124
|
+
END
|
125
|
+
assert { output == expected_output }
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple-printer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.3'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- John Labovitz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-05-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.5'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '5.22'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '5.22'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest-power_assert
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '13.2'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '13.2'
|
69
|
+
description: Simple::Printer makes it easier to print objects.
|
70
|
+
email: johnl@johnlabovitz.com
|
71
|
+
executables: []
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files: []
|
74
|
+
files:
|
75
|
+
- ".gitignore"
|
76
|
+
- Gemfile
|
77
|
+
- README.md
|
78
|
+
- Rakefile
|
79
|
+
- lib/simple-printer.rb
|
80
|
+
- simple-printer.gemspec
|
81
|
+
- test/printer_test.rb
|
82
|
+
homepage: http://github.com/jslabovitz/simple-printer
|
83
|
+
licenses:
|
84
|
+
- MIT
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubygems_version: 3.5.10
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: Print objects easier
|
105
|
+
test_files:
|
106
|
+
- test/printer_test.rb
|