activeldap 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. data/CHANGES +34 -0
  2. data/README +13 -0
  3. data/Rakefile +2 -1
  4. data/TODO +6 -0
  5. data/benchmark/bench-al.rb +68 -17
  6. data/examples/al-admin/app/helpers/application_helper.rb +3 -5
  7. data/examples/al-admin/app/views/layouts/_footer.html.erb +2 -0
  8. data/examples/al-admin/config/boot.rb +7 -7
  9. data/examples/al-admin/config/environment.rb +27 -12
  10. data/examples/al-admin/config/environments/development.rb +0 -1
  11. data/examples/al-admin/config/environments/production.rb +6 -1
  12. data/examples/al-admin/config/environments/test.rb +1 -1
  13. data/examples/al-admin/config/initializers/gettext.rb +15 -1
  14. data/examples/al-admin/po/en/al-admin.po +1 -1
  15. data/examples/al-admin/po/ja/al-admin.po +1 -1
  16. data/examples/al-admin/po/nl/al-admin.po +1 -1
  17. data/examples/al-admin/public/dispatch.cgi +0 -0
  18. data/examples/al-admin/public/dispatch.fcgi +0 -0
  19. data/examples/al-admin/public/dispatch.rb +0 -0
  20. data/examples/al-admin/public/javascripts/controls.js +73 -73
  21. data/examples/al-admin/public/javascripts/dragdrop.js +166 -165
  22. data/examples/al-admin/public/javascripts/effects.js +174 -166
  23. data/examples/al-admin/public/javascripts/prototype.js +362 -267
  24. data/examples/al-admin/script/about +0 -0
  25. data/examples/al-admin/script/console +0 -0
  26. data/examples/al-admin/script/dbconsole +3 -0
  27. data/examples/al-admin/script/destroy +0 -0
  28. data/examples/al-admin/script/generate +0 -0
  29. data/examples/al-admin/script/performance/benchmarker +0 -0
  30. data/examples/al-admin/script/performance/profiler +0 -0
  31. data/examples/al-admin/script/performance/request +0 -0
  32. data/examples/al-admin/script/plugin +0 -0
  33. data/examples/al-admin/script/process/inspector +0 -0
  34. data/examples/al-admin/script/process/reaper +0 -0
  35. data/examples/al-admin/script/process/spawner +0 -0
  36. data/examples/al-admin/script/runner +0 -0
  37. data/examples/al-admin/script/server +0 -0
  38. data/examples/al-admin/test/run-test.sh +0 -0
  39. data/examples/groupadd +0 -0
  40. data/examples/groupdel +0 -0
  41. data/examples/groupls +0 -0
  42. data/examples/groupmod +0 -0
  43. data/examples/lpasswd +0 -0
  44. data/examples/ouadd +0 -0
  45. data/examples/useradd +0 -0
  46. data/examples/useradd-binary +0 -0
  47. data/examples/userdel +0 -0
  48. data/examples/userls +0 -0
  49. data/examples/usermod +0 -0
  50. data/examples/usermod-binary-add +0 -0
  51. data/examples/usermod-binary-add-time +0 -0
  52. data/examples/usermod-binary-del +0 -0
  53. data/examples/usermod-lang-add +0 -0
  54. data/lib/active_ldap.rb +10 -4
  55. data/lib/active_ldap/action_controller/ldap_benchmarking.rb +28 -9
  56. data/lib/active_ldap/adapter/base.rb +30 -17
  57. data/lib/active_ldap/adapter/jndi.rb +5 -1
  58. data/lib/active_ldap/adapter/ldap.rb +5 -1
  59. data/lib/active_ldap/association/has_many_utils.rb +7 -1
  60. data/lib/active_ldap/associations.rb +10 -5
  61. data/lib/active_ldap/attributes.rb +6 -1
  62. data/lib/active_ldap/base.rb +154 -52
  63. data/lib/active_ldap/configuration.rb +1 -1
  64. data/lib/active_ldap/connection.rb +7 -4
  65. data/lib/active_ldap/get_text.rb +11 -3
  66. data/lib/active_ldap/ldif.rb +16 -4
  67. data/lib/active_ldap/operations.rb +13 -5
  68. data/lib/active_ldap/schema.rb +6 -2
  69. data/lib/active_ldap/schema/syntaxes.rb +15 -3
  70. data/lib/active_ldap/user_password.rb +4 -4
  71. data/lib/active_ldap/validations.rb +32 -44
  72. data/lib/active_ldap/xml.rb +125 -0
  73. data/po/en/active-ldap.po +740 -85
  74. data/po/ja/active-ldap.po +748 -547
  75. data/rails/README +54 -0
  76. data/rails/init.rb +33 -0
  77. data/rails/plugin/active_ldap/generators/README +2 -0
  78. data/rails/plugin/active_ldap/generators/model_active_ldap/model_active_ldap_generator.rb +1 -1
  79. data/rails/plugin/active_ldap/init.rb +3 -0
  80. data/rails_generators/model_active_ldap/USAGE +17 -0
  81. data/rails_generators/model_active_ldap/model_active_ldap_generator.rb +69 -0
  82. data/rails_generators/model_active_ldap/templates/model_active_ldap.rb +3 -0
  83. data/rails_generators/model_active_ldap/templates/unit_test.rb +8 -0
  84. data/rails_generators/scaffold_active_ldap/scaffold_active_ldap_generator.rb +7 -0
  85. data/rails_generators/scaffold_active_ldap/templates/ldap.yml +18 -0
  86. data/rails_generators/scaffold_al/scaffold_al_generator.rb +20 -0
  87. data/test-unit/History.txt +50 -1
  88. data/test-unit/Manifest.txt +22 -12
  89. data/test-unit/README.txt +31 -12
  90. data/test-unit/Rakefile +14 -1
  91. data/test-unit/TODO +5 -0
  92. data/test-unit/bin/testrb +0 -0
  93. data/test-unit/lib/test/unit.rb +62 -0
  94. data/test-unit/lib/test/unit/assertions.rb +419 -75
  95. data/test-unit/lib/test/unit/autorunner.rb +70 -13
  96. data/test-unit/lib/test/unit/collector.rb +1 -1
  97. data/test-unit/lib/test/unit/collector/load.rb +1 -1
  98. data/test-unit/lib/test/unit/color-scheme.rb +86 -0
  99. data/test-unit/lib/test/unit/color.rb +40 -5
  100. data/test-unit/lib/test/unit/diff.rb +14 -0
  101. data/test-unit/lib/test/unit/fixture.rb +7 -16
  102. data/test-unit/lib/test/unit/notification.rb +9 -0
  103. data/test-unit/lib/test/unit/omission.rb +14 -0
  104. data/test-unit/lib/test/unit/pending.rb +16 -0
  105. data/test-unit/lib/test/unit/priority.rb +17 -2
  106. data/test-unit/lib/test/unit/runner/console.rb +8 -2
  107. data/test-unit/lib/test/unit/testcase.rb +188 -2
  108. data/test-unit/lib/test/unit/ui/console/testrunner.rb +51 -26
  109. data/test-unit/lib/test/unit/util/method-owner-finder.rb +28 -0
  110. data/test-unit/lib/test/unit/version.rb +1 -1
  111. data/test-unit/sample/test_user.rb +22 -0
  112. data/test-unit/test/collector/{test_descendant.rb → test-descendant.rb} +0 -0
  113. data/test-unit/test/collector/{test_load.rb → test-load.rb} +1 -1
  114. data/test-unit/test/run-test.rb +0 -0
  115. data/test-unit/test/{test_attribute.rb → test-attribute.rb} +0 -0
  116. data/test-unit/test/test-color-scheme.rb +56 -0
  117. data/test-unit/test/{test_color.rb → test-color.rb} +10 -0
  118. data/test-unit/test/{test_diff.rb → test-diff.rb} +0 -0
  119. data/test-unit/test/{test_emacs_runner.rb → test-emacs-runner.rb} +0 -0
  120. data/test-unit/test/test-fixture.rb +287 -0
  121. data/test-unit/test/{test_notification.rb → test-notification.rb} +4 -4
  122. data/test-unit/test/{test_omission.rb → test-omission.rb} +6 -6
  123. data/test-unit/test/{test_pending.rb → test-pending.rb} +12 -6
  124. data/test-unit/test/{test_priority.rb → test-priority.rb} +30 -0
  125. data/test-unit/test/test_assertions.rb +411 -69
  126. data/test-unit/test/test_testcase.rb +70 -3
  127. data/test-unit/test/{testunit_test_util.rb → testunit-test-util.rb} +4 -2
  128. data/test-unit/test/ui/test_testrunmediator.rb +1 -1
  129. data/test-unit/test/util/test-method-owner-finder.rb +38 -0
  130. data/test/run-test.rb +0 -0
  131. data/test/test_adapter.rb +3 -0
  132. data/test/test_associations.rb +50 -7
  133. data/test/test_base.rb +193 -11
  134. data/test/test_connection_per_dn.rb +1 -1
  135. data/test/test_ldif.rb +86 -0
  136. data/test/test_load.rb +7 -0
  137. data/test/test_schema.rb +31 -1
  138. data/test/test_syntax.rb +20 -0
  139. data/test/test_user_password.rb +22 -14
  140. data/test/test_validation.rb +70 -29
  141. metadata +99 -77
  142. data/data/locale/en/LC_MESSAGES/active-ldap.mo +0 -0
  143. data/data/locale/ja/LC_MESSAGES/active-ldap.mo +0 -0
  144. data/examples/al-admin/config/initializers/ralative_url_support.rb +0 -1
  145. data/examples/al-admin/lib/accept_http_rails_relative_url_root.rb +0 -9
  146. data/test-unit-ext/misc/rd2html.rb +0 -42
  147. data/test-unit/test/test_fixture.rb +0 -275
@@ -56,6 +56,20 @@ module Test
56
56
  end
57
57
  end
58
58
 
59
+ # Omit the test of part of the test.
60
+ #
61
+ # Example:
62
+ # def test_omission
63
+ # omit
64
+ # # Not reached here
65
+ # end
66
+ #
67
+ # def test_omission_with_here
68
+ # omit do
69
+ # # Not ran here
70
+ # end
71
+ # # Reached here
72
+ # end
59
73
  def omit(message=nil, &block)
60
74
  message ||= "omitted."
61
75
  if block_given?
@@ -56,6 +56,22 @@ module Test
56
56
  end
57
57
  end
58
58
 
59
+ # Marks the test or part of the test is pending.
60
+ #
61
+ # Example:
62
+ # def test_pending
63
+ # pend
64
+ # # Not reached here
65
+ # end
66
+ #
67
+ # def test_pending_with_here
68
+ # pend do
69
+ # # Ran here
70
+ # # Fails if the block doesn't raise any error.
71
+ # # Because it means the block is passed unexpectedly.
72
+ # end
73
+ # # Reached here
74
+ # end
59
75
  def pend(message=nil, &block)
60
76
  message ||= "pended."
61
77
  if block_given?
@@ -13,6 +13,19 @@ module Test
13
13
  teardown :priority_teardown, :after => :append
14
14
  end
15
15
  end
16
+
17
+ @@enabled = false
18
+ def enabled?
19
+ @@enabled
20
+ end
21
+
22
+ def enable
23
+ @@enabled = true
24
+ end
25
+
26
+ def disable
27
+ @@enabled = false
28
+ end
16
29
  end
17
30
 
18
31
  class Checker
@@ -90,7 +103,7 @@ module Test
90
103
  def result_dir
91
104
  components = [".test-result",
92
105
  @test.class.name || "AnonymousTestCase",
93
- @test.method_name.to_s]
106
+ escaped_method_name]
94
107
  parent_directories = [File.dirname($0), Dir.pwd]
95
108
  if Process.respond_to?(:uid)
96
109
  parent_directories << File.join(Dir.tmpdir, Process.uid.to_s)
@@ -112,7 +125,7 @@ module Test
112
125
  end
113
126
 
114
127
  def escaped_method_name
115
- @method_name.to_s.gsub(/[!?=]$/) do |matched|
128
+ @test.method_name.to_s.gsub(/[!?=]$/) do |matched|
116
129
  case matched
117
130
  when "!"
118
131
  ".destructive"
@@ -135,10 +148,12 @@ module Test
135
148
  end
136
149
 
137
150
  def priority_setup
151
+ return unless Priority.enabled?
138
152
  Checker.new(self).setup
139
153
  end
140
154
 
141
155
  def priority_teardown
156
+ return unless Priority.enabled?
142
157
  Checker.new(self).teardown
143
158
  end
144
159
  end
@@ -31,8 +31,8 @@ module Test
31
31
  ["true", true],
32
32
  ]
33
33
  opts.on("--[no-]use-color=[auto]", use_color_options,
34
- "Use color output",
35
- "(default is auto") do |use_color|
34
+ "Uses color output",
35
+ "(default is auto)") do |use_color|
36
36
  case use_color
37
37
  when nil
38
38
  use_color = true
@@ -41,6 +41,12 @@ module Test
41
41
  end
42
42
  auto_runner.runner_options[:use_color] = use_color
43
43
  end
44
+
45
+ opts.on("--progress-row-max=MAX", Integer,
46
+ "Uses MAX as max terminal width for progress mark",
47
+ "(default is auto)") do |max|
48
+ auto_runner.runner_options[:progress_row_max] = max
49
+ end
44
50
  end
45
51
  end
46
52
  end
@@ -17,6 +17,7 @@ require 'test/unit/priority'
17
17
  require 'test/unit/testsuite'
18
18
  require 'test/unit/assertionfailederror'
19
19
  require 'test/unit/util/backtracefilter'
20
+ require 'test/unit/util/method-owner-finder'
20
21
 
21
22
  module Test
22
23
  module Unit
@@ -26,6 +27,47 @@ module Test
26
27
  # wrapping those tests into a suite. It also does the
27
28
  # nitty-gritty of actually running an individual test and
28
29
  # collecting its results into a Test::Unit::TestResult object.
30
+ #
31
+ # You can run two hooks before/after a TestCase run.
32
+ #
33
+ # Example:
34
+ # class TestMyClass < Test::Unit::TestCase
35
+ # class << self
36
+ # def startup
37
+ # ...
38
+ # end
39
+ #
40
+ # def shutdown
41
+ # ...
42
+ # end
43
+ # end
44
+ #
45
+ # def setup
46
+ # ...
47
+ # end
48
+ #
49
+ # def teardown
50
+ # ...
51
+ # end
52
+ #
53
+ # def test_my_method1
54
+ # ...
55
+ # end
56
+ #
57
+ # def test_my_method2
58
+ # ...
59
+ # end
60
+ # end
61
+ #
62
+ # Here is a call order:
63
+ # * startup
64
+ # * setup
65
+ # * test_my_method1
66
+ # * teardown
67
+ # * setup
68
+ # * test_my_method2
69
+ # * teardown
70
+ # * shutdown
29
71
  class TestCase
30
72
  include Attribute
31
73
  include Fixture
@@ -68,6 +110,79 @@ module Test
68
110
  end
69
111
  suite
70
112
  end
113
+
114
+ # Called before every test case runs. Can be used
115
+ # to set up fixture information used in test case
116
+ # scope.
117
+ #
118
+ # Here is an example test case:
119
+ # class TestMyClass < Test::Unit::TestCase
120
+ # class << self
121
+ # def startup
122
+ # ...
123
+ # end
124
+ # end
125
+ #
126
+ # def setup
127
+ # ...
128
+ # end
129
+ #
130
+ # def test_my_class1
131
+ # ...
132
+ # end
133
+ #
134
+ # def test_my_class2
135
+ # ...
136
+ # end
137
+ # end
138
+ #
139
+ # Here is a call order:
140
+ # * startup
141
+ # * setup
142
+ # * test_my_class1 (or test_my_class2)
143
+ # * setup
144
+ # * test_my_class2 (or test_my_class1)
145
+ #
146
+ # Note that you should not assume test order. Tests
147
+ # should be worked in any order.
148
+ def startup
149
+ end
150
+
151
+ # Called after every test case runs. Can be used to tear
152
+ # down fixture information used in test case scope.
153
+ #
154
+ # Here is an example test case:
155
+ # class TestMyClass < Test::Unit::TestCase
156
+ # class << self
157
+ # def shutdown
158
+ # ...
159
+ # end
160
+ # end
161
+ #
162
+ # def teardown
163
+ # ...
164
+ # end
165
+ #
166
+ # def test_my_class1
167
+ # ...
168
+ # end
169
+ #
170
+ # def test_my_class2
171
+ # ...
172
+ # end
173
+ # end
174
+ #
175
+ # Here is a call order:
176
+ # * test_my_class1 (or test_my_class2)
177
+ # * teardown
178
+ # * test_my_class2 (or test_my_class1)
179
+ # * teardown
180
+ # * shutdown
181
+ #
182
+ # Note that you should not assume test order. Tests
183
+ # should be worked in any order.
184
+ def shutdown
185
+ end
71
186
  end
72
187
 
73
188
  attr_reader :method_name
@@ -76,9 +191,15 @@ module Test
76
191
  # test represented by test_method_name.
77
192
  def initialize(test_method_name)
78
193
  throw :invalid_test unless respond_to?(test_method_name)
79
- throw :invalid_test if method(test_method_name).arity > 0
194
+ test_method = method(test_method_name)
195
+ throw :invalid_test if test_method.arity > 0
196
+ owner = Util::MethodOwnerFinder.find(self, test_method_name)
197
+ if owner.class != Module and self.class != owner
198
+ throw :invalid_test
199
+ end
80
200
  @method_name = test_method_name
81
201
  @test_passed = true
202
+ @interrupted = false
82
203
  end
83
204
 
84
205
  # Runs the individual test method represented by this
@@ -90,8 +211,9 @@ module Test
90
211
  yield(STARTED, name)
91
212
  begin
92
213
  run_setup
93
- __send__(@method_name)
214
+ run_test
94
215
  rescue Exception
216
+ @interrupted = true
95
217
  raise unless handle_exception($!)
96
218
  ensure
97
219
  begin
@@ -109,11 +231,67 @@ module Test
109
231
 
110
232
  # Called before every test method runs. Can be used
111
233
  # to set up fixture information.
234
+ #
235
+ # You can add additional setup tasks by the following
236
+ # code:
237
+ # class TestMyClass < Test::Unit::TestCase
238
+ # def setup
239
+ # ...
240
+ # end
241
+ #
242
+ # setup
243
+ # def my_setup1
244
+ # ...
245
+ # end
246
+ #
247
+ # setup
248
+ # def my_setup2
249
+ # ...
250
+ # end
251
+ #
252
+ # def test_my_class
253
+ # ...
254
+ # end
255
+ # end
256
+ #
257
+ # Here is a call order:
258
+ # * setup
259
+ # * my_setup1
260
+ # * my_setup2
261
+ # * test_my_class
112
262
  def setup
113
263
  end
114
264
 
115
265
  # Called after every test method runs. Can be used to tear
116
266
  # down fixture information.
267
+ #
268
+ # You can add additional teardown tasks by the following
269
+ # code:
270
+ # class TestMyClass < Test::Unit::TestCase
271
+ # def teardown
272
+ # ...
273
+ # end
274
+ #
275
+ # teardown
276
+ # def my_teardown1
277
+ # ...
278
+ # end
279
+ #
280
+ # teardown
281
+ # def my_teardown2
282
+ # ...
283
+ # end
284
+ #
285
+ # def test_my_class
286
+ # ...
287
+ # end
288
+ # end
289
+ #
290
+ # Here is a call order:
291
+ # * test_my_class
292
+ # * my_teardown2
293
+ # * my_teardown1
294
+ # * teardown
117
295
  def teardown
118
296
  end
119
297
 
@@ -143,11 +321,19 @@ module Test
143
321
  self.class == other.class
144
322
  end
145
323
 
324
+ def interrupted?
325
+ @interrupted
326
+ end
327
+
146
328
  private
147
329
  def current_result
148
330
  @_result
149
331
  end
150
332
 
333
+ def run_test
334
+ __send__(@method_name)
335
+ end
336
+
151
337
  def handle_exception(exception)
152
338
  self.class.exception_handlers.each do |handler|
153
339
  return true if send(handler, exception)
@@ -4,7 +4,7 @@
4
4
  # Copyright:: Copyright (c) 2000-2003 Nathaniel Talbott. All rights reserved.
5
5
  # License:: Ruby license.
6
6
 
7
- require 'test/unit/color'
7
+ require 'test/unit/color-scheme'
8
8
  require 'test/unit/ui/testrunner'
9
9
  require 'test/unit/ui/testrunnermediator'
10
10
  require 'test/unit/ui/console/outputlevel'
@@ -18,17 +18,6 @@ module Test
18
18
  class TestRunner < UI::TestRunner
19
19
  include OutputLevel
20
20
 
21
- COLOR_SCHEMES = {
22
- :default => {
23
- "success" => Color.new("green", :bold => true),
24
- "failure" => Color.new("red", :bold => true),
25
- "pending" => Color.new("magenta", :bold => true),
26
- "omission" => Color.new("blue", :bold => true),
27
- "notification" => Color.new("cyan", :bold => true),
28
- "error" => Color.new("yellow", :bold => true),
29
- },
30
- }
31
-
32
21
  # Creates a new TestRunner for running the passed
33
22
  # suite. If quiet_mode is true, the output while
34
23
  # running is limited to progress dots, errors and
@@ -41,8 +30,11 @@ module Test
41
30
  @output = @options[:output] || STDOUT
42
31
  @use_color = @options[:use_color]
43
32
  @use_color = guess_color_availability if @use_color.nil?
44
- @color_scheme = COLOR_SCHEMES[:default]
33
+ @color_scheme = @options[:color_scheme] || ColorScheme.default
45
34
  @reset_color = Color.new("reset")
35
+ @progress_row = 0
36
+ @progress_row_max = @options[:progress_row_max]
37
+ @progress_row_max ||= guess_progress_row_max
46
38
  @already_outputted = false
47
39
  @faults = []
48
40
  end
@@ -84,9 +76,7 @@ module Test
84
76
 
85
77
  def add_fault(fault)
86
78
  @faults << fault
87
- output_single(fault.single_character_display,
88
- fault_color(fault),
89
- PROGRESS_ONLY)
79
+ output_progress(fault.single_character_display, fault_color(fault))
90
80
  @already_outputted = true
91
81
  end
92
82
 
@@ -124,7 +114,7 @@ module Test
124
114
 
125
115
  def test_finished(name)
126
116
  unless @already_outputted
127
- output_single(".", @color_scheme["success"], PROGRESS_ONLY)
117
+ output_progress(".", color("success"))
128
118
  end
129
119
  nl(VERBOSE)
130
120
  @already_outputted = false
@@ -141,7 +131,7 @@ module Test
141
131
  end
142
132
 
143
133
  def output_single(something, color=nil, level=NORMAL)
144
- return unless output?(level)
134
+ return false unless output?(level)
145
135
  if @use_color and color
146
136
  something = "%s%s%s" % [color.escape_sequence,
147
137
  something,
@@ -149,31 +139,47 @@ module Test
149
139
  end
150
140
  @output.write(something)
151
141
  @output.flush
142
+ true
152
143
  end
153
-
144
+
145
+ def output_progress(mark, color=nil)
146
+ if output_single(mark, color, PROGRESS_ONLY)
147
+ return unless @progress_row_max > 0
148
+ @progress_row += mark.size
149
+ if @progress_row >= @progress_row_max
150
+ nl unless @output_level == VERBOSE
151
+ @progress_row = 0
152
+ end
153
+ end
154
+ end
155
+
154
156
  def output?(level)
155
157
  level <= @output_level
156
158
  end
157
159
 
160
+ def color(name)
161
+ @color_scheme[name] || ColorScheme.default[name]
162
+ end
163
+
158
164
  def fault_color(fault)
159
- @color_scheme[fault.class.name.split(/::/).last.downcase]
165
+ color(fault.class.name.split(/::/).last.downcase)
160
166
  end
161
167
 
162
168
  def result_color
163
169
  if @result.passed?
164
170
  if @result.pending_count > 0
165
- @color_scheme["pending"]
171
+ color("pending")
166
172
  elsif @result.omission_count > 0
167
- @color_scheme["omission"]
173
+ color("omission")
168
174
  elsif @result.notification_count > 0
169
- @color_scheme["notification"]
175
+ color("notification")
170
176
  else
171
- @color_scheme["success"]
177
+ color("success")
172
178
  end
173
179
  elsif @result.error_count > 0
174
- @color_scheme["error"]
180
+ color("error")
175
181
  elsif @result.failure_count > 0
176
- @color_scheme["failure"]
182
+ color("failure")
177
183
  end
178
184
  end
179
185
 
@@ -184,6 +190,25 @@ module Test
184
190
  return true if ENV["EMACS"] == "t"
185
191
  false
186
192
  end
193
+
194
+ def guess_progress_row_max
195
+ term_width = guess_term_width
196
+ if term_width.zero?
197
+ if ENV["EMACS"] == "t"
198
+ -1
199
+ else
200
+ 79
201
+ end
202
+ else
203
+ term_width
204
+ end
205
+ end
206
+
207
+ def guess_term_width
208
+ Integer(ENV["TERM_WIDTH"] || 0)
209
+ rescue ArgumentError
210
+ 0
211
+ end
187
212
  end
188
213
  end
189
214
  end