heredoc_unindent 1.0.6 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/History.rdoc CHANGED
@@ -1,3 +1,15 @@
1
+ === 1.1.0 / 2011-01-29
2
+
3
+ * 3 minor enhancements
4
+
5
+ * Added a new #unindent_base implementation
6
+ * 50--62% faster on ruby-1.9.2-p136, jruby-1.5.6 and rbx-1.2.0
7
+ * 10--20% slower in ruby-1.8.7-p330 and ree-1.8.7-2010.02
8
+ * so the old one is kept and the fastest for your VM is automatically chosen on load-time
9
+ * Created a couple scripts to benchmark unindenting implementations
10
+ * available on the GitHub repository, but not included in the gem
11
+ * Improved ALTERNATIVES section of README with performance results extracted from benchmarking
12
+
1
13
  === 1.0.6 / 2011-01-27
2
14
 
3
15
  * 1 minor enhancement
data/README.rdoc CHANGED
@@ -70,14 +70,28 @@ Based on the answer by Rene Saarsoo to the question
70
70
 
71
71
  == ALTERNATIVES
72
72
 
73
- Despite minor API differences, extra-features availability or edge-case behaviour, the
74
- following gems implement the same unindenting functionality and are essentially equivalent to heredoc_unindent:
75
- * {outdent}[http://rubygems.org/gems/outdent] (formerly {unindentable}[http://rubygems.org/gems/unindentable])
76
- * {unindent}[http://rubygems.org/gems/unindent]
77
-
78
- And the following gem, which has a much broader scope, also features a method
79
- with equivalent functionality:
80
- * {indentation}[http://rubygems.org/gems/indentation] -- String#reset_indentation method
73
+ Despite minor API differences or edge-case behaviour, the following gems
74
+ implement equivalent unindenting functionality:
75
+
76
+ 1. {outdent}[http://rubygems.org/gems/outdent] (formerly {unindentable}[http://rubygems.org/gems/unindentable])
77
+ 2. {unindent}[http://rubygems.org/gems/unindent]
78
+ 3. {indentation}[http://rubygems.org/gems/indentation] -- this gem has a broader scope, besides String#reset_indentation
79
+
80
+ === So why another one?
81
+
82
+ Well, the Fact is that the author only found about the other gems after he had
83
+ already implemented heredoc_unindent. And, frankly, that was fortunate:
84
+ benchmarking revealed that heredoc_unindent is by far the most efficient, both
85
+ in space (memory) and time (cycles).
86
+
87
+ === Efficiency!
88
+
89
+ Depending on the Ruby implementation, heredoc_unindent is is about *1.6--2.4x*
90
+ *faster* than {unindent}[http://rubygems.org/gems/unindent], *1.9--6.6x*
91
+ *faster* than {indentation}[http://rubygems.org/gems/indentation],
92
+ and *4--19x* *faster* than {outdent}[http://rubygems.org/gems/outdent].
93
+ In addition, heredoc_unindent has the *lowest* *memory* *consumption*,
94
+ requiring only between a fifth and a sixth of the competitors.
81
95
 
82
96
  == LICENSE:
83
97
 
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ require 'hoe'
6
6
  Hoe.spec 'heredoc_unindent' do
7
7
  developer('Adriano Mitre', 'adriano.mitre@gmail.com')
8
8
 
9
- self.version = '1.0.6'
9
+ self.version = '1.1.0'
10
10
 
11
11
  self.readme_file = 'README.rdoc'
12
12
  self.history_file = 'History.rdoc'
@@ -8,23 +8,56 @@ module CoreExt
8
8
 
9
9
  private
10
10
 
11
- # Actual implementation of the unindentation mechanism,
11
+ # Actual implementations of the unindentation mechanism,
12
12
  # both for in and out-of-place processing.
13
13
  #
14
+ # @note The only reason there are two implementations is because the new
15
+ # one is slower than the old one on MRI and REE 1.8.7. The fastest
16
+ # implementation is automatically chosen based on the virtual
17
+ # machine being executed.
18
+ #
14
19
  # @param [Boolean] warn_first_not_min
15
20
  # @param [Boolean] in_place
16
21
  # @return [String, nil]
17
22
  #
18
- def unindent_base(in_place, warn_first_not_min)
23
+
24
+ # about 50% faster in jruby, 56% in ruby-1.9.2, 62% in rbx-1.2.0 (new vs old)
25
+ #
26
+ def unindent_base_new(in_place, warn_first_not_min)
27
+ m_first = nil
28
+ m_min = nil
29
+ self.scan(/^\s*/) do |m|
30
+ ms = m.size
31
+ m_first ||= ms
32
+ m_min = ms if !m_min || ms < m_min
33
+ # break if ms == 0 ## only worth if the probability of marginless line above certain threshold
34
+ end
35
+ if m_first != m_min && warn_first_not_min
36
+ puts "warning: margin of the first line differs from minimum margin"
37
+ end
38
+ return in_place ? nil : self.dup unless m_min > 0
39
+ re = Regexp.new('^\s{' + m_min.to_s + '}' )
40
+ in_place ? gsub!(re, '') : gsub(re, '')
41
+ end
42
+
43
+ # about 10% faster in ree, 20% in ruby-1.8.7 (old vs new)
44
+ #
45
+ def unindent_base_old(in_place, warn_first_not_min)
19
46
  margins = self.scan(/^\s*/).map(&:size)
20
47
  margins_min = margins.min
21
48
  if margins.first != margins_min && warn_first_not_min
22
49
  puts "warning: margin of the first line differs from minimum margin"
23
50
  end
24
51
  return in_place ? nil : self.dup unless margins_min != 0
25
- re = Regexp.new('^\s{0,' + margins_min.to_s + '}' ) # omitting the lower limit produces warnings and wrong behavior in ruby-1.8.7-p330 and ree-1.8.7-2010.02
52
+ re = Regexp.new('^\s{' + margins_min.to_s + '}' )
26
53
  in_place ? gsub!(re, '') : gsub(re, '')
27
54
  end
55
+
56
+ if RUBY_VERSION >= '1.9' || defined?(RUBY_DESCRIPTION) && (RUBY_DESCRIPTION =~ /jruby/i || RUBY_DESCRIPTION =~ /rubinius/i)
57
+ alias unindent_base unindent_base_new
58
+ else
59
+ alias unindent_base unindent_base_old
60
+ end
28
61
 
29
62
  public
30
63
 
@@ -37,7 +37,7 @@ EOS
37
37
  def prep_sing3
38
38
  ugly = <<-EOS
39
39
  The first line
40
-
40
+
41
41
  The third line
42
42
  EOS
43
43
 
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heredoc_unindent
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 19
5
+ prerelease:
5
6
  segments:
6
7
  - 1
8
+ - 1
7
9
  - 0
8
- - 6
9
- version: 1.0.6
10
+ version: 1.1.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Adriano Mitre
@@ -35,7 +36,7 @@ cert_chain:
35
36
  9u8N6mQNneIVRh6Xfdko/Q==
36
37
  -----END CERTIFICATE-----
37
38
 
38
- date: 2011-01-27 00:00:00 -02:00
39
+ date: 2011-01-29 00:00:00 -02:00
39
40
  default_executable:
40
41
  dependencies:
41
42
  - !ruby/object:Gem::Dependency
@@ -46,6 +47,7 @@ dependencies:
46
47
  requirements:
47
48
  - - ">="
48
49
  - !ruby/object:Gem::Version
50
+ hash: 47
49
51
  segments:
50
52
  - 2
51
53
  - 8
@@ -97,6 +99,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
99
  requirements:
98
100
  - - ">="
99
101
  - !ruby/object:Gem::Version
102
+ hash: 3
100
103
  segments:
101
104
  - 0
102
105
  version: "0"
@@ -105,13 +108,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
108
  requirements:
106
109
  - - ">="
107
110
  - !ruby/object:Gem::Version
111
+ hash: 3
108
112
  segments:
109
113
  - 0
110
114
  version: "0"
111
115
  requirements: []
112
116
 
113
117
  rubyforge_project: heredoc_unindent
114
- rubygems_version: 1.3.7
118
+ rubygems_version: 1.4.1
115
119
  signing_key:
116
120
  specification_version: 3
117
121
  summary: This gem removes common margin from indented strings, such as the ones produced by indented heredocs
metadata.gz.sig CHANGED
Binary file