simple-printer 0.3

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