indented_io 0.7.3 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f678cdfa6edee19dad6a5256367071ceea8d1ca7ebb5dd4556330f260250e0e1
4
- data.tar.gz: a2cb615747e62ca14ed25b872ae501c9f6b0dbaadd1a9ec73f3a2dbfcd519f61
3
+ metadata.gz: '097c526b0eeabff0b3be7d1483a6bac19232b803ddb630457c56ca4e7d180cea'
4
+ data.tar.gz: 0a6dc9f1bdf3dbc325ea52d06298b67dd7be389297baadc85d773e4f23edd329
5
5
  SHA512:
6
- metadata.gz: 914ca7aef4d7017fc4899c2f1cc19da8a7cf6bacc7c0937bd28033bef7cb2350f3878bd0ac9380301d4e2b0cb7df6aded579085a7a52c0f48206e80dbe6b3a7a
7
- data.tar.gz: 5dcf284b39596f7faaff975d2e703125caa157c133646a1aa9a2147bb95b7c4c852de61c3bcdc872208c08d79a7d4acc42a0170d168d66e9a56199082ed5d328
6
+ metadata.gz: 516212abf50023dd89352d55f2bf2745e367cf3e0646d3f0dc1c5d6a8193cf0fdc8053beec7259e978ad7bd94791cd6e8476c9ba101e2a066b93b311d9589b84
7
+ data.tar.gz: 4b8ead522fa1830c8c31888cded99ae00679737dd6f3560ebe9214190b27c38b2af2ff224437cb8c7be5e2de7fe338ca06525d5d7d980eb088f5dbc996380e6b
data/README.md CHANGED
@@ -142,14 +142,14 @@ In case of errors an `IndentedIO::Error` exception is raised
142
142
 
143
143
  You can add support for your own IO objects by including
144
144
  `IndentedIO::IndentedIOInterface` in your class. All that is required is that
145
- the class define a `#print` method with the same semantics as the system
146
- `#print`
145
+ the class define a `#write` method with the same semantics as `IO#write`
146
+ (convert arguments to strings and then write them)
147
147
 
148
148
  ```ruby
149
149
  require 'indented_io'
150
150
  class MyIO
151
151
  include IndentedIO::IndentedIOInterface
152
- def print(*args) ... end
152
+ def writte(*args) ... end
153
153
  end
154
154
 
155
155
  my_io = MyIO.new
@@ -174,7 +174,7 @@ check performance). It would be much faster if the inner loop was implemented
174
174
  in C. However, we're talking micro-seconds here: Printing without using
175
175
  IndentedIO range from around 0.25ms to 1ms while using IndentedIO slows it down
176
176
  to between 4 and 12 microseconds, so IndentedIO won't cause a noticeable slow
177
- down of your application
177
+ down of your application unless you do a lot of output
178
178
 
179
179
  ## Installation
180
180
 
data/TODO CHANGED
@@ -2,14 +2,20 @@
2
2
  TODO
3
3
  o Check if IO object is writable - no good solution ?
4
4
  o better name for @this_indent ? 'string' ?
5
- o Change dependency in IndentedIOInterface from #print to #write and bump
6
- version to 0.8 as this is the last user-visible change to be made
7
5
  o Reimplement core loop in C
8
6
  o Create BaseIndentedIO to hold bol status and remove it from IndentedIO
9
7
  o Transmogrify instances variables and protected methods in IndentedIO to
10
8
  avoid collision with names from the underlying device
11
9
  o Explain name collision issues in the docs
10
+ o Remove IndentedIO#dump
12
11
 
12
+ + Change dependency in IndentedIOInterface from #print to #write and bump
13
+ version to 0.8 as this is the last user-visible change to be made
14
+ + Oops. #print reimplemention doesn't do this:
15
+ If the output field separator ($,) is not nil, it is inserted between
16
+ objects. If the output record separator ($\) is not nil, it is appended to
17
+ the output
18
+ + Tests for #write
13
19
  + explain bol
14
20
  + Allow a symbolic :string argument
15
21
  + #printf !
@@ -20,48 +20,54 @@ module IndentedIO
20
20
  interface_indent(levels, string, bol: bol, &block)
21
21
  end
22
22
 
23
- # Indent and print args to the underlying device. #print has the same semantic
24
- # as Kernel#print
25
- def print(*args)
26
- if bol
27
- @device.print @combined_indent
28
- self.bol = false
29
- end
23
+ # Indent and print args to the underlying device. #write has the same semantic
24
+ # as IO#write
25
+ def write(*args)
26
+ n_bytes = 0
30
27
  args.join.each_char { |c|
31
28
  if c == "\n"
32
29
  self.bol = true
33
30
  elsif bol
34
- @device.print @combined_indent
31
+ n_bytes += @device.write(@combined_indent)
35
32
  self.bol = false
36
33
  end
37
- @device.print c
34
+ n_bytes += @device.write(c)
38
35
  }
36
+ n_bytes
37
+ end
38
+
39
+ # Indent and print args to the underlying device. #print has the same semantic
40
+ # as Kernel#print
41
+ def print(*args)
42
+ return nil if args.empty?
43
+ write(args.join($, || ''))
44
+ write($\) if $\
39
45
  nil
40
46
  end
41
47
 
42
48
  # Indent and print args to the underlying device. #printf has the same semantic
43
49
  # as Kernel#printf
44
50
  def printf(format, *args)
45
- print format % args
51
+ write format % args
46
52
  end
47
53
 
48
54
  # Indent and print args to the underlying device. #puts has the same semantic
49
55
  # as Kernel#puts
50
56
  def puts(*args)
51
- args.each { |arg| print(arg, "\n") }
57
+ write args.join("\n"), "\n"
52
58
  nil
53
59
  end
54
60
 
55
61
  # Indent and print args to the underlying device. #p has the same semantic
56
62
  # as Kernel#p. Please note that #p is usually not defined on other classes
57
- # then Kernel but can be used on any IndentedIO object
63
+ # than Kernel but can be used on any IndentedIO object
58
64
  def p(*args)
59
65
  if bol
60
- args.each { |arg| print(arg.inspect, "\n") }
66
+ args.each { |arg| write(arg.inspect, "\n") }
61
67
  else
62
- @device.print args.first.inspect, "\n"
68
+ @device.write(args.first.inspect, "\n")
63
69
  bol = true
64
- args[1..-1].each { |arg| print(arg.inspect, "\n") }
70
+ args[1..-1].each { |arg| write(arg.inspect, "\n") }
65
71
  end
66
72
  args.size == 1 ? args.first : args
67
73
  end
@@ -146,18 +152,5 @@ module IndentedIO
146
152
  self.bol = (bol.nil? ? true : bol)
147
153
  end
148
154
  end
149
-
150
- public
151
- # @!visibility private
152
- def dump
153
- $stderr.puts "#{self.class} [#{self.object_id}]"
154
- $stderr.puts " device: #{device.class} [#{device.object_id}]"
155
- $stderr.puts " base : #{base.class} [#{base.object_id}]"
156
- $stderr.puts " parent: #{parent.class} [#{parent.object_id}]"
157
- $stderr.puts " levels: #{levels}"
158
- $stderr.puts " this_indent: #{this_indent.inspect}"
159
- $stderr.puts " combined_indent: #{combined_indent.inspect}"
160
- $stderr.puts " bol: #{bol}"
161
- end
162
155
  end
163
156
  end
@@ -1,12 +1,12 @@
1
1
  module IndentedIO
2
2
  # IndentedIO interface that provides the #indent method. It is used by IO,
3
3
  # StringIO, and IndentedIO but can be included in any class that define a
4
- # #print method like this:
4
+ # #write method like this:
5
5
  #
6
6
  # require 'indented_io'
7
7
  # class MyIO
8
8
  # include IndentedIO::IndentedIOInterface
9
- # def print(*args) ... end
9
+ # def write(*args) ... end
10
10
  # end
11
11
  #
12
12
  # my_io = MyIO.new
@@ -1,4 +1,4 @@
1
1
  module IndentedIO
2
2
  # Version number
3
- VERSION = "0.7.3"
3
+ VERSION = '0.8.0'
4
4
  end
@@ -56,7 +56,7 @@ dynamic_wo_indent = timeit {
56
56
  }
57
57
 
58
58
  dynamic_w_indent = nil
59
- indent(" ") {
59
+ indent(:string => " ") {
60
60
  dynamic_w_indent = timeit { puts "Indented" }
61
61
  }
62
62
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: indented_io
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claus Rasmussen