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 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
@@ -0,0 +1,3 @@
1
+ .DS_Store
2
+ Gemfile.lock
3
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1 @@
1
+ FIXME
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ Bundler.require
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new do |t|
6
+ t.test_files = FileList['test/*_test.rb']
7
+ end
8
+
9
+ task :default => :test
@@ -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