indented_io 0.8.0 → 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '097c526b0eeabff0b3be7d1483a6bac19232b803ddb630457c56ca4e7d180cea'
4
- data.tar.gz: 0a6dc9f1bdf3dbc325ea52d06298b67dd7be389297baadc85d773e4f23edd329
3
+ metadata.gz: b381c1136988e46a6a79848db05b1563a6704619775b4945e879c1efeb0dfc7a
4
+ data.tar.gz: 7296f2367c4eecb9037bf9c2f4492ee21ff3d8520c841ad95f9c06527f9cf8f8
5
5
  SHA512:
6
- metadata.gz: 516212abf50023dd89352d55f2bf2745e367cf3e0646d3f0dc1c5d6a8193cf0fdc8053beec7259e978ad7bd94791cd6e8476c9ba101e2a066b93b311d9589b84
7
- data.tar.gz: 4b8ead522fa1830c8c31888cded99ae00679737dd6f3560ebe9214190b27c38b2af2ff224437cb8c7be5e2de7fe338ca06525d5d7d980eb088f5dbc996380e6b
6
+ metadata.gz: 216242b00c20a64f0a6f4394f7587bb4d663864814bfcae5ab96b76401ae9498eb0fbc9211b2aa7addbe2c2321397ad8b8cf70329eea60f8b8434346302198f3
7
+ data.tar.gz: d0dcd905b87f2c024137d3a862c1ae8ad9b345e38cec918a0e8d1a1b2a678edc66196d112d6608d98fbb94f462aae61c37d698b13fd533dc5f4125750ea2ddab
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.5.0
1
+ ruby-2.7.1
data/README.md CHANGED
@@ -11,9 +11,9 @@ adds to the previous indendation
11
11
  ```ruby
12
12
  require 'indented_io'
13
13
 
14
- puts "Not indented"
15
- indent { puts "Indented one level" }
16
- indent(2, "* ").puts "Indented two levels"
14
+ puts 'Not indented'
15
+ indent { puts 'Indented one level' }
16
+ indent(2, '* ').puts 'Indented two levels'
17
17
  ```
18
18
 
19
19
  outputs
@@ -32,9 +32,9 @@ If given a block, the block will be called with the IndentedIO object as
32
32
  argument:
33
33
 
34
34
  ```ruby
35
- $stdout.puts "Not indented"
36
- $stdout.indent.puts "Indented"
37
- $stdout.indent { |f| f.puts "Indented" }
35
+ $stdout.puts 'Not indented'
36
+ $stdout.indent.puts 'Indented'
37
+ $stdout.indent { |f| f.puts 'Indented' }
38
38
 
39
39
  # Not indented
40
40
  # Indented
@@ -51,10 +51,10 @@ symbolic argument `:string`. If level is negative, the text will be outdented
51
51
  instead:
52
52
 
53
53
  ```ruby
54
- $stdout.puts "Not indented"
55
- $stdout.indent(2, "> ") do |f|
56
- f.indent(string: "* ").puts "Indented three levels"
57
- f.indent(-1).puts "Indented one level"
54
+ $stdout.puts 'Not indented'
55
+ $stdout.indent(2, '> ') do |f|
56
+ f.indent(string: '* ').puts 'Indented three levels'
57
+ f.indent(-1).puts 'Indented one level'
58
58
  end
59
59
 
60
60
  # Not indented
@@ -71,15 +71,15 @@ that `Kernel#print`, `Kernel#printf`, `Kernel#puts`, and `Kernel#p` will output
71
71
  indented within that block:
72
72
 
73
73
  ```ruby
74
- puts "Not indented"
74
+ puts 'Not indented'
75
75
  indent do
76
- puts "Indented one level"
76
+ puts 'Indented one level'
77
77
  indent do
78
- puts "Indented two levels"
78
+ puts 'Indented two levels'
79
79
  end
80
- puts "Indented one level"
80
+ puts 'Indented one level'
81
81
  end
82
- puts "Not indented"
82
+ puts 'Not indented'
83
83
 
84
84
  # Not indented
85
85
  # Indented one level
@@ -95,8 +95,8 @@ def legacy(phrase)
95
95
  puts phrase
96
96
  end
97
97
 
98
- legacy("Not indented")
99
- indent { legacy("Indented" }
98
+ legacy('Not indented')
99
+ indent { legacy('Indented' }
100
100
 
101
101
  # Not indented
102
102
  # Indented
@@ -111,8 +111,8 @@ that specify if the output device is at the beginning of a line and that printin
111
111
  should start with an indentation string:
112
112
 
113
113
  ```ruby
114
- indent(1, bol: true).puts "Indented"
115
- indent(1, bol: false).puts "Not indented\nIndented"
114
+ indent(1, bol: true).puts 'Indented'
115
+ indent(1, bol: false).puts 'Not indented\nIndented'
116
116
 
117
117
  # Indented
118
118
  # Not indented
@@ -124,7 +124,7 @@ indent(1, bol: false).puts "Not indented\nIndented"
124
124
  The default indentation string is defined in `IndentedIO`:
125
125
 
126
126
  ```ruby
127
- IndentedIO.default_indent = ">> "
127
+ IndentedIO.default_indent = '>> '
128
128
  indent.puts "Indented by #{IndentedIO.default_indent.inspect}"
129
129
 
130
130
  # >> Indented by ">> "
@@ -149,12 +149,12 @@ the class define a `#write` method with the same semantics as `IO#write`
149
149
  require 'indented_io'
150
150
  class MyIO
151
151
  include IndentedIO::IndentedIOInterface
152
- def writte(*args) ... end
152
+ def write(*args) ... end
153
153
  end
154
154
 
155
155
  my_io = MyIO.new
156
- my_io.puts "Not indented"
157
- my_io.indent.puts "It works!"
156
+ my_io.puts 'Not indented'
157
+ my_io.indent.puts 'It works!'
158
158
 
159
159
  # Not indented
160
160
  # It works!
@@ -168,13 +168,13 @@ with a block without parameters manipulates `$stdout`, replacing it with an
168
168
  `IndentedIO` object for the duration of the block
169
169
 
170
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 unless you do a lot of output
171
+ indentation mechanism processes characters one-by-one which is about 7-8 times
172
+ slower than a handwritten implementation (scripts/perf.rb is a script to check
173
+ performance). It would be much faster if the inner loop was implemented in C.
174
+ However, we're talking micro-seconds here: Printing without using IndentedIO
175
+ range from around 0.25us to 1us while using IndentedIO slows it down to between
176
+ 2us and 8us, so IndentedIO won't cause a noticeable slow down of your
177
+ application unless you do a lot of output
178
178
 
179
179
  ## Installation
180
180
 
data/TODO CHANGED
@@ -1,5 +1,7 @@
1
1
 
2
2
  TODO
3
+ o Find a solution for the inclusion of StringIO and Tempfile (the last is
4
+ required by ruby 2.7 - see also note in lib/indented_io/tempfile.rb
3
5
  o Check if IO object is writable - no good solution ?
4
6
  o better name for @this_indent ? 'string' ?
5
7
  o Reimplement core loop in C
@@ -7,8 +9,8 @@ TODO
7
9
  o Transmogrify instances variables and protected methods in IndentedIO to
8
10
  avoid collision with names from the underlying device
9
11
  o Explain name collision issues in the docs
10
- o Remove IndentedIO#dump
11
12
 
13
+ + Remove IndentedIO#dump
12
14
  + Change dependency in IndentedIOInterface from #print to #write and bump
13
15
  version to 0.8 as this is the last user-visible change to be made
14
16
  + Oops. #print reimplemention doesn't do this:
data/indented_io.gemspec CHANGED
@@ -37,6 +37,6 @@ Gem::Specification.new do |spec|
37
37
  spec.require_paths = ["lib"]
38
38
 
39
39
  spec.add_development_dependency "bundler", "~> 1.16"
40
- spec.add_development_dependency "rake", "~> 10.0"
40
+ spec.add_development_dependency "rake", ">= 12.3.3"
41
41
  spec.add_development_dependency "rspec", "~> 3.0"
42
42
  end
data/lib/indented_io.rb CHANGED
@@ -6,6 +6,7 @@ require 'indented_io/indented_io_interface'
6
6
  require 'indented_io/kernel'
7
7
  require 'indented_io/io'
8
8
  require 'indented_io/stringio'
9
+ require 'indented_io/tempfile'
9
10
 
10
11
  # IndentedIO module. See {IndentedIO::IndentedIO} for documentation on how to
11
12
  # use this module
@@ -23,17 +23,11 @@ module IndentedIO
23
23
  # Indent and print args to the underlying device. #write has the same semantic
24
24
  # as IO#write
25
25
  def write(*args)
26
- n_bytes = 0
27
- args.join.each_char { |c|
28
- if c == "\n"
29
- self.bol = true
30
- elsif bol
31
- n_bytes += @device.write(@combined_indent)
32
- self.bol = false
33
- end
34
- n_bytes += @device.write(c)
35
- }
36
- n_bytes
26
+ str = args.join
27
+ return if str.empty?
28
+ s = (bol && str[0] != "\n" ? @combined_indent : "") + str.gsub(/\n([^\n])/m, "\n#{@combined_indent}\\1")
29
+ self.bol = (s[-1] == "\n")
30
+ @device.write(s)
37
31
  end
38
32
 
39
33
  # Indent and print args to the underlying device. #print has the same semantic
@@ -59,8 +53,8 @@ module IndentedIO
59
53
  end
60
54
 
61
55
  # Indent and print args to the underlying device. #p has the same semantic
62
- # as Kernel#p. Please note that #p is usually not defined on other classes
63
- # than Kernel but can be used on any IndentedIO object
56
+ # as Kernel#p. Please note that #p is only defined on Kernel in the Ruby core
57
+ # library but can be used on any IndentedIO object
64
58
  def p(*args)
65
59
  if bol
66
60
  args.each { |arg| write(arg.inspect, "\n") }
@@ -74,8 +68,8 @@ module IndentedIO
74
68
 
75
69
  # Make IndentedIO behave like the underlying @device
76
70
  # @!visibility private
77
- def respond_to?(method)
78
- [:indent, :level, :print, :puts, :p].include?(method) || device.respond_to?(method)
71
+ def respond_to?(method, include_all = false)
72
+ [:indent, :level, :print, :printf, :puts, :p].include?(method) || device.respond_to?(method)
79
73
  end
80
74
 
81
75
  # Make IndentedIO behave like the underlying @device
@@ -91,8 +85,8 @@ module IndentedIO
91
85
  attr_reader :device
92
86
 
93
87
  # First IndentedIO object on the stack. Equal to self if self is the first
94
- # indentation object. #base is used to keep track of #bol for the whole
95
- # stack of IndentedIO objects
88
+ # indentation object. The #base object is used to keep track of #bol for
89
+ # the whole stack of IndentedIO objects
96
90
  attr_reader :base
97
91
 
98
92
  # Parent IndentedIO or IO object
@@ -4,6 +4,7 @@ module IndentedIO
4
4
  # #write method like this:
5
5
  #
6
6
  # require 'indented_io'
7
+ #
7
8
  # class MyIO
8
9
  # include IndentedIO::IndentedIOInterface
9
10
  # def write(*args) ... end
@@ -18,7 +19,7 @@ module IndentedIO
18
19
  #
19
20
  module IndentedIOInterface
20
21
  # Returns a IndentedIO object that can be used for printing. The IO object
21
- # will pass-through all method to the underlying device except #print,
22
+ # will pass-through all methods to the underlying device except #print,
22
23
  # #printf, #puts, and #p
23
24
  #
24
25
  # +level+ is the number of leves to indent and +string+ is the string used
@@ -3,7 +3,7 @@ require 'indented_io/indented_io_interface'
3
3
  module Kernel
4
4
  # Like {IndentedIO::IndentedIOInterface#indent} except the underlying device is
5
5
  # not the receiver (Kernel) but $stdout. Kernel#indent also allows a block without
6
- # and argument. In that case it manipulates $stdout to print indented:
6
+ # an argument. In that case it manipulates $stdout to print indented:
7
7
  #
8
8
  # puts "Not indented
9
9
  # indent do
@@ -1,3 +1,4 @@
1
+ require 'stringio' # Requiered to avoid 'superclass mismatch' errors in other modules
1
2
  require 'indented_io/indented_io_interface'
2
3
 
3
4
  # Includes the IndentedIOInterface that define the #indent method
@@ -1,4 +1,4 @@
1
1
  module IndentedIO
2
2
  # Version number
3
- VERSION = '0.8.0'
3
+ VERSION = '0.8.5'
4
4
  end
data/scripts/perf.rb CHANGED
@@ -7,15 +7,24 @@ RUNS = 1_000_000
7
7
  saved_stdout = $stdout
8
8
  $stdout = File.open("/dev/null", "w")
9
9
 
10
- def timeit(&block)
10
+ $base = 0.0
11
+
12
+ def timeit_impl(&block)
11
13
  t0 = Time.now
12
14
  RUNS.times {
13
15
  yield
14
16
  }
15
17
  t1 = Time.now
16
- (1000 * (t1 - t0)).round(0)
18
+ t1 - t0 - $base
17
19
  end
18
20
 
21
+ $base = timeit_impl {}
22
+
23
+ def timeit(&block)
24
+ (1000 * timeit_impl(&block)).round(0)
25
+ end
26
+
27
+
19
28
  def report(title, wo_indent, w_indent)
20
29
  times = (w_indent / wo_indent).round(1)
21
30
  if times < 1.1
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.8.0
4
+ version: 0.8.5
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-13 00:00:00.000000000 Z
11
+ date: 2021-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -104,8 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
104
  - !ruby/object:Gem::Version
105
105
  version: '0'
106
106
  requirements: []
107
- rubyforge_project:
108
- rubygems_version: 2.7.3
107
+ rubygems_version: 3.1.4
109
108
  signing_key:
110
109
  specification_version: 4
111
110
  summary: Print indented text