indented_io 0.7.2 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0a203a65d6293b629e37b0e6f37f00b5c010c4d38acac313d481a44b0a50b8b
4
- data.tar.gz: 68df73e9433c325c8e6597d416222977f25e877a41ec142d7fecaa5aedee877c
3
+ metadata.gz: f678cdfa6edee19dad6a5256367071ceea8d1ca7ebb5dd4556330f260250e0e1
4
+ data.tar.gz: a2cb615747e62ca14ed25b872ae501c9f6b0dbaadd1a9ec73f3a2dbfcd519f61
5
5
  SHA512:
6
- metadata.gz: 0b01a78e6633ccca02ede79d880f3c4aec6168b11ddebbbcdc6773a48ef11abe4761919acd623386f1a3fd3cdeb0653dc0bc8f64fd587e3ca97b544fac62751c
7
- data.tar.gz: 05b55ba617d47d7b9bedfc784efec9d23f9f7284c7691baa0edca8a85f35d64eb1dd55577c1a190b9db675304b7acae7f0db584607762e3a151a3da23e84cef9
6
+ metadata.gz: 914ca7aef4d7017fc4899c2f1cc19da8a7cf6bacc7c0937bd28033bef7cb2350f3878bd0ac9380301d4e2b0cb7df6aded579085a7a52c0f48206e80dbe6b3a7a
7
+ data.tar.gz: 5dcf284b39596f7faaff975d2e703125caa157c133646a1aa9a2147bb95b7c4c852de61c3bcdc872208c08d79a7d4acc42a0170d168d66e9a56199082ed5d328
data/README.md CHANGED
@@ -1,12 +1,10 @@
1
1
  # IndentedIO
2
2
 
3
- Print indented text
4
-
5
3
  `IndentedIO` extends `Kernel`, `IO`, and `StringIO` with an `#indent` method
6
4
  that returns an `IndentedIO` object. The `IndentedIO` object acts as the
7
- original object but redefines the output methods `#print`, `#printf`, `#puts`,
8
- and `#p` to print their output indented. Indentations are stacked so that each
9
- new indentation adds to the previous indendation
5
+ original object but redefines `#print`, `#printf`, `#puts`, and `#p` to print
6
+ their output indented. Indentations are stacked so that each new indentation
7
+ adds to the previous indendation
10
8
 
11
9
  ## Usage
12
10
 
@@ -54,10 +52,10 @@ instead:
54
52
 
55
53
  ```ruby
56
54
  $stdout.puts "Not indented"
57
- $stdout.indent(2, "> ") { |f|
55
+ $stdout.indent(2, "> ") do |f|
58
56
  f.indent(string: "* ").puts "Indented three levels"
59
57
  f.indent(-1).puts "Indented one level"
60
- }
58
+ end
61
59
 
62
60
  # Not indented
63
61
  # > > * Indented three levels
@@ -74,13 +72,13 @@ indented within that block:
74
72
 
75
73
  ```ruby
76
74
  puts "Not indented"
77
- indent {
75
+ indent do
78
76
  puts "Indented one level"
79
- indent {
77
+ indent do
80
78
  puts "Indented two levels"
81
- }
79
+ end
82
80
  puts "Indented one level"
83
- }
81
+ end
84
82
  puts "Not indented"
85
83
 
86
84
  # Not indented
@@ -140,7 +138,7 @@ to get a different indentation for a part of the program
140
138
 
141
139
  In case of errors an `IndentedIO::Error` exception is raised
142
140
 
143
- ## Add support for other classes
141
+ ## Adding support for other classes
144
142
 
145
143
  You can add support for your own IO objects by including
146
144
  `IndentedIO::IndentedIOInterface` in your class. All that is required is that
@@ -155,7 +153,11 @@ class MyIO
155
153
  end
156
154
 
157
155
  my_io = MyIO.new
156
+ my_io.puts "Not indented"
158
157
  my_io.indent.puts "It works!"
158
+
159
+ # Not indented
160
+ # It works!
159
161
  ```
160
162
 
161
163
  ## Implementation & performance
@@ -165,10 +167,14 @@ my_io.indent.puts "It works!"
165
167
  with a block without parameters manipulates `$stdout`, replacing it with an
166
168
  `IndentedIO` object for the duration of the block
167
169
 
168
- The implementation carries no overhead if it is not used but the core indentation
169
- mechanism processes characters one-by-one which is slow compared to what could
170
- be achived with a native C implementation
171
-
170
+ The implementation carries no overhead if it is not used but the core
171
+ indentation mechanism processes characters one-by-one which is about 10-15
172
+ times slower than a handwritten implementation (scripts/perf.rb is a script to
173
+ check performance). It would be much faster if the inner loop was implemented
174
+ in C. However, we're talking micro-seconds here: Printing without using
175
+ IndentedIO range from around 0.25ms to 1ms while using IndentedIO slows it down
176
+ to between 4 and 12 microseconds, so IndentedIO won't cause a noticeable slow
177
+ down of your application
172
178
 
173
179
  ## Installation
174
180
 
data/TODO CHANGED
@@ -2,6 +2,13 @@
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
+ o Reimplement core loop in C
8
+ o Create BaseIndentedIO to hold bol status and remove it from IndentedIO
9
+ o Transmogrify instances variables and protected methods in IndentedIO to
10
+ avoid collision with names from the underlying device
11
+ o Explain name collision issues in the docs
5
12
 
6
13
  + explain bol
7
14
  + Allow a symbolic :string argument
@@ -15,5 +22,3 @@ TODO
15
22
  + Rename Device -> IndentedIO
16
23
 
17
24
  - Make Kernel.indent behave like Kernel ?
18
-
19
- ? Create a BaseIndentedIO class ?
data/indented_io.gemspec CHANGED
@@ -11,13 +11,11 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = %q{Print indented text}
13
13
  spec.description = %q{
14
- IndentedIO extends Kernel, IO, and StringIO
15
- with an #indent method that returns an IndentedIO
16
- object. The IndentedIO object acts as the original
17
- object but redefines the output methods #print,
18
- #printf, #puts, and #p to print their output
19
- indented. Indentations are stacked so that each new
20
- indentation adds to the previous indendation
14
+ IndentedIO extends Kernel, IO, and StringIO with an
15
+ #indent method that redefines #print, printf, #puts,
16
+ and #p to print their output indented. Indentations
17
+ are stacked so that each new indentation adds to the
18
+ previous indendation
21
19
  }
22
20
  spec.homepage = "https://github.com/clrgit/indented_io"
23
21
  spec.license = "MIT"
data/lib/indented_io.rb CHANGED
@@ -7,8 +7,9 @@ require 'indented_io/kernel'
7
7
  require 'indented_io/io'
8
8
  require 'indented_io/stringio'
9
9
 
10
- # IndentedIO module
11
-
10
+ # IndentedIO module. See {IndentedIO::IndentedIO} for documentation on how to
11
+ # use this module
12
+ #
12
13
  module IndentedIO
13
14
  # Returns default indentation. Two spaces is the default but it can be set by
14
15
  # #default_indent
@@ -1,11 +1,11 @@
1
1
 
2
2
  module IndentedIO
3
- # Error class. To rescue errors form IndentedIO do
3
+ # Error class derived from RuntimeError. To rescue errors from IndentedIO do
4
4
  #
5
5
  # begin
6
- # do_some_stuff()
6
+ # # do_some_stuff
7
7
  # rescue IndentedIO::Error => ex
8
- # handle_error()
8
+ # # handle_error
9
9
  # end
10
10
  #
11
11
  class Error < RuntimeError; end
@@ -8,7 +8,7 @@ module IndentedIO
8
8
  # levels rise or fall IndentedIO objects are moved on and off the stack
9
9
  #
10
10
  # Note that #new is private. The only way to create a IndentedIO object is to
11
- # call #indent on an object that supports it
11
+ # call #indent on an object that supports it ({Kernel}, {IO}, or {StringIO})
12
12
  class IndentedIO
13
13
  include IndentedIOInterface
14
14
 
@@ -1,6 +1,6 @@
1
1
  module IndentedIO
2
- # IndentedIO interface that provides the #indent method. Used by IO,
3
- # StringIO, and IndentedIO. It can be included in any class that define a
2
+ # IndentedIO interface that provides the #indent method. It is used by IO,
3
+ # StringIO, and IndentedIO but can be included in any class that define a
4
4
  # #print method like this:
5
5
  #
6
6
  # require 'indented_io'
@@ -6,12 +6,12 @@ module Kernel
6
6
  # and argument. In that case it manipulates $stdout to print indented:
7
7
  #
8
8
  # puts "Not indented
9
- # indent {
9
+ # indent do
10
10
  # puts "Indented"
11
- # indent {
11
+ # indent do
12
12
  # puts "Even more indented"
13
- # }
14
- # }
13
+ # end
14
+ # end
15
15
  #
16
16
  # # Not indented
17
17
  # # Indented
@@ -1,4 +1,4 @@
1
1
  module IndentedIO
2
2
  # Version number
3
- VERSION = "0.7.2"
3
+ VERSION = "0.7.3"
4
4
  end
data/scripts/perf.rb ADDED
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ exec("bundle exec #$0 '#{ARGV.join("' '")}'") if !ENV.key?('BUNDLE_BIN_PATH')
4
+
5
+ RUNS = 1_000_000
6
+
7
+ saved_stdout = $stdout
8
+ $stdout = File.open("/dev/null", "w")
9
+
10
+ def timeit(&block)
11
+ t0 = Time.now
12
+ RUNS.times {
13
+ yield
14
+ }
15
+ t1 = Time.now
16
+ (1000 * (t1 - t0)).round(0)
17
+ end
18
+
19
+ def report(title, wo_indent, w_indent)
20
+ times = (w_indent / wo_indent).round(1)
21
+ if times < 1.1
22
+ slower = "same speed"
23
+ else
24
+ slower = "#{times} times slower"
25
+ end
26
+
27
+ puts title
28
+ indent {
29
+ puts "w/o indented_io: #{wo_indent}ms"
30
+ puts "w/indented_io : #{w_indent}ms (#{slower})"
31
+ }
32
+ end
33
+
34
+ # No indent
35
+ #
36
+ flat_output_wo_indent = timeit { puts "Not indented" }
37
+
38
+ require 'indented_io'
39
+
40
+ flat_output_w_indent = timeit { puts "Not indented" }
41
+
42
+ # Indented one level
43
+ #
44
+ static_wo_indent = timeit { puts " Indented" }
45
+
46
+ static_w_indent = nil
47
+ indent {
48
+ static_w_indent = timeit { puts "Indented" }
49
+ }
50
+
51
+ # Indented by a dynamic string
52
+ #
53
+ indent = " "
54
+ dynamic_wo_indent = timeit {
55
+ puts "#{indent}Indented"
56
+ }
57
+
58
+ dynamic_w_indent = nil
59
+ indent(" ") {
60
+ dynamic_w_indent = timeit { puts "Indented" }
61
+ }
62
+
63
+ # Recursive indentation
64
+ #
65
+ def recur_wo_indent(level, indent)
66
+ puts "#{indent}Indented"
67
+ if level > 0
68
+ recur_wo_indent(level - 1, "#{indent} ")
69
+ end
70
+ end
71
+
72
+ def recur_w_indent(level)
73
+ puts "Indented"
74
+ if level > 0
75
+ indent { recur_w_indent(level - 1) }
76
+ end
77
+ end
78
+
79
+ recursive_wo_indent = timeit { recur_wo_indent(2, " ") }
80
+ recursive_w_indent = timeit { recur_w_indent(2) }
81
+
82
+ $stdout = saved_stdout
83
+
84
+ puts "Performance with #{RUNS} runs"
85
+ puts
86
+
87
+ report "Flat output", flat_output_wo_indent, flat_output_w_indent
88
+ report "Static indent", static_wo_indent, static_w_indent
89
+ report "Dynamic indent", dynamic_wo_indent, dynamic_w_indent
90
+ report "Recursive indent", recursive_wo_indent, recursive_w_indent
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: indented_io
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.2
4
+ version: 0.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claus Rasmussen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-05-11 00:00:00.000000000 Z
11
+ date: 2018-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,13 +52,11 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
- description: "\n IndentedIO extends Kernel, IO, and StringIO\n
56
- \ with an #indent method that returns an IndentedIO\n object.
57
- The IndentedIO object acts as the original\n object but
58
- redefines the output methods #print,\n #printf, #puts,
59
- and #p to print their output\n indented. Indentations are
60
- stacked so that each new\n indentation adds to the previous
61
- indendation\n "
55
+ description: "\n IndentedIO extends Kernel, IO, and StringIO
56
+ with an\n #indent method that redefines #print, printf,
57
+ #puts,\n and #p to print their output indented. Indentations
58
+ \n are stacked so that each new indentation adds to the\n
59
+ \ previous indendation\n "
62
60
  email:
63
61
  - claus.l.rasmussen@gmail.com
64
62
  executables: []
@@ -85,6 +83,7 @@ files:
85
83
  - lib/indented_io/kernel.rb
86
84
  - lib/indented_io/stringio.rb
87
85
  - lib/indented_io/version.rb
86
+ - scripts/perf.rb
88
87
  homepage: https://github.com/clrgit/indented_io
89
88
  licenses:
90
89
  - MIT