y_support 2.4.6 → 2.5.1

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
  SHA1:
3
- metadata.gz: eb3706957a1022fffe6b271c1585bf23dc27a922
4
- data.tar.gz: 9a632cf5c99aef509bc144adf2f179e3d51331ff
3
+ metadata.gz: a2e9ed33873ba6f65cec12b20001eb56cb3e217c
4
+ data.tar.gz: ea33118ef8cebea1b7a1cf8ceeeb6327a611628e
5
5
  SHA512:
6
- metadata.gz: 811f88237a88ec79297ba24a517d4f8923333e5cf49a97759e95eca881a124975b2d754addcd288fa414780ea93e18cb47d3f2c46c89e6526f9319b314e6407b
7
- data.tar.gz: c8d6ed7aa7cac621d6e576fa1ddf939c359e561a3de2f4846e34802ec4ac7d18cad42eb26d0e532915c560d88ec0cf5425a5965e90ce7b75ab6031091f204705
6
+ metadata.gz: 4e4cfcf183d1d8d24611d3b923e1da4b7f02c29f1b3e1d10ad9b8db9c933cb99f9f712c266dbec3f259b19853f69f5ec09c1f9a59deb3d747a3965692471b6f2
7
+ data.tar.gz: ab06499e3ac0deea21a0817215fe0c45748794b67dc5876dfd6f198aea5586e349a7df5ccce2d568369a0e6c8d52fa94e73acc1934b0b3adea0846274a3aabf1
data/lib/y_support/all.rb CHANGED
@@ -3,12 +3,6 @@
3
3
  require 'y_support'
4
4
  require 'y_support/flex_coerce'
5
5
  require 'y_support/name_magic'
6
- require 'y_support/typing'
7
6
  require 'y_support/unicode'
8
- require 'y_support/respond_to'
9
- require 'y_support/null_object'
10
- require 'y_support/inert_recorder'
11
- require 'y_support/local_object'
12
- require 'y_support/literate'
13
- require 'y_support/kde'
14
7
  require 'y_support/misc'
8
+ require 'y_support/typing'
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require_relative '../y_support'
3
+ require_relative '../../y_support'
4
4
 
5
5
  # Inert recorder is similar to a null object in the sense, that in response to
6
6
  # almost all messages it returns self. But in addition, it records received
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require_relative '../y_support'
3
+ require_relative '../../y_support'
4
4
 
5
5
  # Object, whose business is to stay local to methods. Optional signature
6
6
  # provides additional level of safety in ensuring object locality. (Signature
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require_relative '../y_support'
3
+ require_relative '../../y_support'
4
4
 
5
5
  # Null object pattern implementation in +YSupport+. apart from the expected null
6
6
  # object behavior (such as returning self in response to almost all messages),
@@ -1,4 +1,4 @@
1
- require_relative '../y_support'
1
+ require_relative '../../y_support'
2
2
 
3
3
  # RespondTo class for easy use of respond_to? in case statements.
4
4
  #
@@ -1,27 +1,6 @@
1
- require 'y_support'
1
+ require_relative '../y_support'
2
2
 
3
- # Typing library.
4
- #
5
- # Apart from usual <em>typing by class and ancestry</em>, supported by built-in
6
- # #kind_of?, alias #is_a? inquirerers, this typing library provides support for
7
- # provides support for <em>typing by declaration</em> and <em>duck typing</em>.
8
- #
9
- # 1. Using method <b>declare_compliance</b>, a module can explicitly declare that
10
- # it provides the interface compliant with another module. Corresponding inquirer
11
- # methods are <b>declared_compliance</b> (returning a list of modules with which
12
- # the receiver declares compliance or implicitly complies) and
13
- # <b>declares_compliance?( other_module )</b>, which anwers whether the receiver
14
- # complies with other_module. An object always implicitly complies with its class
15
- # and class ancestry.
16
- #
17
- # 2. Duck type enforcement for method parameters is supported by a collection of
18
- # enforcer methods (aka. run-time assertions). These methods look very much like
19
- # assertions, but they start with <b>tE_...</b>, meaning "enforce by raising
20
- # TypeError".
21
-
22
- [ :core_ext, :stdlib_ext ].each do |ext|
23
- Dir["#{File.dirname( __FILE__ )}/#{ext}/*/misc.rb"].sort.each { |path|
24
- dir = File.dirname( path ).match( "y_support/#{ext}" ).post_match
25
- require "y_support/#{ext}#{dir}/misc"
26
- }
27
- end
3
+ require_relative 'misc/respond_to'
4
+ require_relative 'misc/null_object'
5
+ require_relative 'misc/inert_recorder'
6
+ require_relative 'misc/local_object'
@@ -360,22 +360,11 @@ module NameMagic::Namespace
360
360
  # Checks whether a name is acceptable as a constant name.
361
361
  #
362
362
  def validate_name name
363
- # Note that the #try method (provided by 'y_support/literate')
364
- # allows us to call the methods of name without mentioning
365
- # it explicitly as the receiver, and it also allows us to
366
- # raise errors without explicitly constructing the error
367
- # messages. Thus, chars.first actually means name.chars.first.
368
- # Error message (when error occurs) is constructed from
369
- # the #try description and the #note strings, which act at
370
- # the same time as code comments. End of advertisement for
371
- # 'y_support/literate'.
372
- #
373
- name.to_s.try "to validate the suggested instance name" do
374
- note "rejecting non-capitalized names"
375
- fail NameError unless ( ?A..?Z ) === chars.first
376
- note "rejecting names with spaces"
377
- fail NameError if chars.include? ' '
378
- end
363
+ n = name.to_s
364
+ # rejecting non-capitalized names
365
+ fail NameError unless ( ?A..?Z ) === n.chars.first
366
+ # rejecting names with spaces
367
+ fail NameError if n.chars.include? ' '
379
368
  # Return value is the validated name.
380
369
  return name
381
370
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require_relative '../y_support'
4
4
  require_relative 'core_ext/hash/misc'
5
- require_relative 'literate'
6
5
 
7
6
  # Module NameMagic imitates Ruby constant magic and automates the
8
7
  # named argument :name, alias :ɴ (Character "ɴ", Unicode small
@@ -1,4 +1,4 @@
1
1
  module YSupport
2
- VERSION = "2.4.6"
2
+ VERSION = "2.5.1"
3
3
  DEBUG = false
4
4
  end
@@ -3,11 +3,9 @@
3
3
 
4
4
  require 'minitest/autorun'
5
5
 
6
- describe "InertRecorder" do
7
- before do
8
- require './../lib/y_support/inert_recorder'
9
- end
6
+ require_relative '../../lib/y_support/misc/inert_recorder'
10
7
 
8
+ describe "InertRecorder" do
11
9
  describe "Object" do
12
10
  it "should have #InertRecorder() constructor" do
13
11
  assert_equal InertRecorder, InertRecorder( :bull ).class
@@ -3,11 +3,9 @@
3
3
 
4
4
  require 'minitest/autorun'
5
5
 
6
- describe "LocalObject" do
7
- before do
8
- require './../lib/y_support/local_object'
9
- end
6
+ require_relative '../../lib/y_support/misc/local_object'
10
7
 
8
+ describe "LocalObject" do
11
9
  describe "Object" do
12
10
  it "should have constructor #LocalObject, alias #L!" do
13
11
  assert_equal LocalObject, LocalObject().class
@@ -3,11 +3,9 @@
3
3
 
4
4
  require 'minitest/autorun'
5
5
 
6
- describe "y_support/null_object" do
7
- before do
8
- require './../lib/y_support/null_object'
9
- end
6
+ require_relative '../../lib/y_support/misc/null_object'
10
7
 
8
+ describe "y_support/null_object" do
11
9
  describe Object do
12
10
  it "should have #null_object? (alias #null?)" do
13
11
  assert ( class Koko < NullObject; self end ).new.null_object?
@@ -3,9 +3,9 @@
3
3
 
4
4
  require 'minitest/autorun'
5
5
 
6
- describe "y_support/typing" do
6
+ describe "respond_to" do
7
7
  before do
8
- require './../lib/y_support/respond_to'
8
+ require './../lib/y_support/misc/respond_to'
9
9
  end
10
10
 
11
11
  describe Object do
data/test/misc_test.rb CHANGED
@@ -3,389 +3,7 @@
3
3
 
4
4
  require 'minitest/autorun'
5
5
 
6
- describe Object do
7
- before do
8
- require './../lib/y_support/core_ext/object'
9
- end
10
-
11
- it "should have #param_class" do
12
- o = Object.new
13
- m = Module.new
14
- o.param_class( { Array: Array, foo: Hash, bar: m }, with: { mother: o } )
15
- assert o.Array < Array
16
- o.Array.mother.must_equal( o )
17
- o.foo.mother.must_equal( o )
18
- o.bar.ancestors[1].must_equal( m )
19
- o.bar.mother.must_equal( o )
20
- end
21
-
22
- it "should have #param_class!" do
23
- o = Object.new
24
- m = Module.new
25
- o.param_class!( { Array: Array, foo: Hash, bar: m }, with: { mother: o } )
26
- assert o.Array < Array
27
- o.Array.mother.must_equal( o )
28
- o.foo.mother.must_equal( o )
29
- o.bar.ancestors[1].must_equal( m )
30
- o.bar.mother.must_equal( o )
31
- end
32
-
33
- it "should have #insp method to facilitate inspection" do
34
- module Quux; class Foo; def to_s; "bar" end end end
35
- Quux::Foo.new.y_inspect.must_equal "Quux::Foo:bar"
36
- Quux::Foo.new.y_inspect( :full ).must_equal "#<Quux::Foo:bar>"
37
- Quux::Foo.new.y_inspect( :short ).must_equal "Foo:bar"
38
- end
39
- end
40
-
41
-
42
- describe Module do
43
- before do
44
- require './../lib/y_support/core_ext/module'
45
- end
46
-
47
- it "has #const_set_if_not_defined and #const_reset!" do
48
- m = Module.new
49
- hm = m.heir_module( p1: 1, p2: 2 )
50
- hm.ancestors[1].must_equal m
51
- hm.p1.must_equal 1
52
- hm.p2.must_equal 2
53
- hc = m.heir_class( Array, q1: 1, q2: 2 )
54
- hc.new.class.ancestors[1].must_equal m
55
- hc.q1.must_equal 1
56
- hc.q2.must_equal 2
57
- m.const_set_if_not_defined :Foo, 42
58
- m::Foo.must_equal 42
59
- m.const_reset! :Foo, 43
60
- m::Foo.must_equal 43
61
- m.module_exec do
62
- selector :a
63
- def initialize; @a = 42 end
64
- chain b: :a, &:to_s
65
- end
66
- Class.new do include m end.new.b.must_equal "42"
67
- end
68
- end
69
-
70
-
71
- describe Class do
72
- before do
73
- require './../lib/y_support/core_ext/class'
74
- end
75
-
76
- it "has #selector alias for #attr_reader method" do
77
- o = Class.new do
78
- selector :a
79
- def initialize a; @a = a end
80
- end.new( 42 )
81
- o.a.must_equal( 42 )
82
- end
83
-
84
- it "has #parametrize method" do
85
- a = Class.new
86
- -> { a.foo }.must_raise NoMethodError
87
- b = a.parametrize foo: 42
88
- b.foo.must_equal 42
89
- end
90
- end
91
-
92
-
93
- describe Enumerable do
94
- before do
95
- require './../lib/y_support/core_ext/enumerable'
96
- end
97
-
98
- it "should introduce #all_kind_of? collection qualifier" do
99
- assert_equal true, [ 1, 1.0 ].all_kind_of?( Numeric )
100
- assert_equal false, [ 1, [1.0] ].all_kind_of?( Numeric )
101
- end
102
-
103
- it "should introduce #all_numeric? collection qualifier" do
104
- assert_equal true, [1, 1.0].all_numeric?
105
- assert_equal false, [:a, 1].all_numeric?
106
- end
107
-
108
- it "should have #subset_of? collection qualifier" do
109
- assert_equal( true, [1,2].subset_of?( [1,2,3,4] ) )
110
- assert_equal( false, [1,2].subset_of?( [2,3] ) )
111
- assert_equal( true, [1,2].subset_of?( [1,2] ) )
112
- assert_equal( true, [1, 1.0].subset_of?( [1.0, 2.0] ) )
113
- end
114
- end
115
-
116
-
117
- describe Array do
118
- before do
119
- require './../lib/y_support/core_ext/array'
120
- end
121
-
122
- it "has #arrays_to_hash" do
123
- [ [ :a, 1 ], [ :b, 2 ] ].arrays_to_hash
124
- .must_equal( { a: 1, b: 2 } )
125
- [ [ :a, 1, 2 ], [ :b, 2, 3 ] ].arrays_to_hash
126
- .must_equal( { a: [ 1, 2 ], b: [ 2, 3 ] } )
127
- end
128
-
129
- it "has #zip_to_hash" do
130
- assert_equal( {a: 1, b: 2}, [:a, :b].zip_to_hash( [1, 2] ) )
131
- assert_equal( {a: "a"}, [:a].zip_to_hash( &:to_s ) )
132
- end
133
-
134
- it "has #>>" do
135
- assert_equal( {a: 1, b: 2}, [:a, :b] >> [1, 2] )
136
- end
137
-
138
- it "has #ascending_floor" do
139
- a = 1, 2, 3
140
- a.ascending_floor( 0.5 ).must_equal nil
141
- a.ascending_floor( 1 ).must_equal 1
142
- a.ascending_floor( 1.5 ).must_equal 1
143
- a.ascending_floor( 3.5 ).must_equal 3
144
- a.ascending_floor( 1, false ).must_equal nil
145
- a.ascending_floor( 3, false ).must_equal 2
146
- end
147
-
148
- it "has #ascending_ceiling" do
149
- a = 1, 2, 3
150
- a.ascending_ceiling( 0.5 ).must_equal 1
151
- a.ascending_ceiling( 1.5 ).must_equal 2
152
- a.ascending_ceiling( 3 ).must_equal 3
153
- a.ascending_ceiling( 3.1 ).must_equal nil
154
- a.ascending_ceiling( 3, false ).must_equal nil
155
- a.ascending_ceiling( 2, false ).must_equal 3
156
- end
157
-
158
- it "has #to_proc in style &[function, *args]" do
159
- assert_equal [2, 3], [1, 2].map( &[:+, 1] )
160
- end
161
-
162
- it "has #push/pop_ordered/named" do
163
- a = [1, 2, foo: 3]
164
- a.pop_named( :foo ).must_equal 3
165
- a.pop_named( :bar ).must_equal nil
166
- a.pop_ordered.must_equal 2
167
- a.push_ordered( 2 ).must_equal [1, 2]
168
- a.push_named( foo: 3 ).must_equal [1, 2, foo: 3]
169
- a.push_named( bar: 4 ).must_equal [1, 2, foo: 3, bar: 4]
170
- a.pop_named( :foo ).must_equal 3
171
- a.push_ordered( 42 ).must_equal [1, 2, 42, bar: 4]
172
- end
173
-
174
- it "has #to_column_vector" do
175
- [1, 2, 3].to_column_vector.must_equal Matrix[[1], [2], [3]]
176
- end
177
- end
178
-
179
- describe Hash do
180
- before do
181
- require './../lib/y_support/core_ext/hash'
182
- end
183
-
184
- it "should have #default! custom defaulter" do
185
- defaults = { a: 1, b: nil }
186
- test = {}
187
- result = test.default!( defaults )
188
- assert_equal defaults, result
189
- assert_equal result.object_id, test.object_id
190
- test = { a: 11, b: 22 }
191
- assert_equal( { a: 11, b: 22 }, test.default!( defaults ) )
192
- test = { a: 11, c: 22 }
193
- { a: 11, b: nil, c: 22 }.must_equal test.default! defaults
194
- end
195
-
196
- it "should have #with_keys and #with_keys!" do
197
- test = { "a" => :b, "c" => :d }
198
- test.with_keys( &:to_sym ).must_equal( { a: :b, c: :d } )
199
- test.must_equal( { "a" => :b, "c" => :d } )
200
- test.with_keys! &:to_sym
201
- test.must_equal( { a: :b, c: :d } )
202
- end
203
-
204
- it "should have #change_keys" do
205
- test = { a: 1, c: 2 }
206
- test.change_keys { |k, v| k.to_s + v.to_s }
207
- .must_equal( { "a1" => 1, "c2" => 2 } )
208
- end
209
-
210
- it "should have #with_values and #with_values!" do
211
- test = { a: :b, c: :d }
212
- test.with_values( &:to_s ).must_equal( { a: "b", c: "d" } )
213
- test.must_equal( { a: :b, c: :d } )
214
- test.with_values!( &:to_s )
215
- test.must_equal( { a: "b", c: "d" } )
216
- end
217
-
218
- it "should have #change_values and #change_values!" do
219
- test = { a: :b, c: :d }
220
- test.modify_values do |k, v| k.to_s + v.to_s end
221
- .must_equal( {a: "ab", c: "cd"} )
222
- test.must_equal( { a: :b, c: :d } )
223
- test.modify_values! { |k, v| k.to_s + v.to_s }
224
- test.must_equal( {a: "ab", c: "cd"} )
225
- end
226
-
227
- it "should have #modify" do
228
- assert_equal( { ab: "ba", cd: "dc" },
229
- { a: :b, c: :d }
230
- .modify { |k, v| ["#{k}#{v}".to_sym, "#{v}#{k}"] } )
231
- end
232
-
233
- it "should have #slice" do
234
- { a: 1, b: 2, c: 3 }.slice( [:a, :b] ).must_equal( { a: 1, b: 2 } )
235
- { 1 => :a, 2 => :b, 3 => :c, 4 => :d }.slice( 2..3.5 )
236
- .must_equal( { 2 => :b, 3 => :c } )
237
- { 0.0 => :a, 1.1 => :b }.slice( 1..2 ).must_equal( { 1.1 => :b } )
238
- end
239
-
240
- it "should have #dot! meta patcher for dotted access to keys" do
241
- h = Hash.new.merge!(aaa: 1, taint: 2)
242
- -> { h.dot! }.must_raise ArgumentError
243
- h.dot!( overwrite_methods: true ) # instead of #assert_nothing_raised
244
- assert_equal( {aaa: 1}, {aaa: 1}.dot! )
245
- end
246
-
247
- it "should be safeguarded against redefining #slice" do
248
- m = Hash.instance_method :slice
249
- class Hash; def slice( *args ); fail "This should not happen!" end end
250
- {}.slice( :a )
251
- end
252
- end
253
-
254
-
255
- describe "Matrix" do
256
- before do
257
- require 'matrix'
258
- require './../lib/y_support/stdlib_ext/matrix'
259
- end
260
-
261
- it "should have #pp method" do
262
- assert_respond_to Matrix[[1, 2], [3, 4]], :pretty_print
263
- assert_respond_to Matrix[[1, 2], [3, 4]], :pp
264
- end
265
-
266
- it "should have #correspondence_matrix method" do
267
- assert_respond_to Matrix, :correspondence_matrix
268
- assert_equal Matrix[[1, 0, 0], [0, 1, 0]],
269
- Matrix.correspondence_matrix( [:a, :b, :c], [:a, :b] )
270
- assert_equal Matrix.column_vector( [1, 2] ),
271
- Matrix.correspondence_matrix( [:a, :b, :c], [:a, :b] ) *
272
- Matrix.column_vector( [1, 2, 3] )
273
- assert_equal 2, Matrix.correspondence_matrix( [1, 2], [1] ).column_size
274
- end
275
-
276
- it "should have #column_to_a & #row_to_a" do
277
- assert_equal [1, 2, 3], Matrix[[1], [2], [3]].column_to_a
278
- assert_equal [2, 3, 4], Matrix[[1, 2], [2, 3], [3, 4]].column_to_a( 1 )
279
- assert_equal nil, Matrix.empty( 5, 0 ).column_to_a
280
- assert_equal [1], Matrix[[1], [2], [3]].row_to_a
281
- assert_equal [3], Matrix[[1], [2], [3]].row_to_a( 2 )
282
- end
283
-
284
- it "should have aliased #row_vector, #column_vector methods" do
285
- assert_equal Matrix.column_vector( [1, 2, 3] ),
286
- Matrix.cv( [1, 2, 3] )
287
- assert_equal Matrix.row_vector( [1, 2, 3] ),
288
- Matrix.rv( [1, 2, 3] )
289
- end
290
-
291
- it "should have #join_bottom and #join_right" do
292
- assert_equal Matrix[[1, 2], [3, 4]],
293
- Matrix[[1, 2]].join_bottom( Matrix[[3, 4]] )
294
- assert_equal Matrix[[1, 2, 3, 4]],
295
- Matrix[[1, 2]].join_right( Matrix[[3, 4]] )
296
- end
297
-
298
- it "should have aliased #row_size, #column_size methods" do
299
- assert_equal 3, Matrix.zero(3, 2).height
300
- assert_equal 3, Matrix.zero(3, 2).number_of_rows
301
- assert_equal 2, Matrix.zero(3, 2).width
302
- assert_equal 2, Matrix.zero(3, 2).number_of_columns
303
- end
304
- end
305
-
306
- describe String do
307
- before do
308
- require './../lib/y_support/core_ext/string'
309
- end
310
-
311
- it "should have #can_be_integer? returning the integer or false if not convertible" do
312
- assert_equal 33, " 33".to_Integer
313
- assert_equal 8, " 010 ".to_Integer
314
- assert_equal false, "garbage".to_Integer
315
- end
316
-
317
- it "should have #can_be_float? returning the float or false if not convertible" do
318
- assert_equal 22.2, ' 2.22e1'.to_Float
319
- assert_equal 10, " 010 ".to_Float
320
- assert_equal false, "garbage".to_Float
321
- end
322
-
323
- it "should have #default! defaulter" do
324
- assert_equal "default", "".default!("default")
325
- assert_equal "default", " ".default!(:default)
326
- assert_equal "default", " \n ".default!("default")
327
- assert_equal "kokot", "kokot".default!("default")
328
- a = ""
329
- assert_equal a.object_id, a.default!("tata").object_id
330
- end
331
-
332
- it "should have #stripn upgrade of #strip, which also strips newlines" do
333
- assert_equal "test test", " \n test test \n\n \n ".stripn
334
- end
335
-
336
- it "should have #compact for joining indented lines (esp. heredocs)" do
337
- assert_equal "test test test",
338
- "test\n test\n\n \n test\n ".wring_heredoc
339
- funny_string = <<-FUNNY_STRING.wring_heredoc
340
- This
341
- is
342
- a funny string.
343
- FUNNY_STRING
344
- assert_equal( 'This is a funny string.', funny_string )
345
- end
346
-
347
- it "should be able #underscore_spaces" do
348
- assert_equal "te_st_test", "te st test".underscore_spaces
349
- end
350
-
351
- it "should have #symbolize stripping, removing capitalization and diacritics " \
352
- 'as if to make a suitable symbol material' do
353
- assert_equal "Yes_sir!", " \nYes, sir!.; \n \n".standardize
354
- end
355
-
356
- it "should have #to_standardized_sym chaining #standardize and #to_sym" do
357
- assert_equal :Yes, " \nYes,.; \n \n".to_standardized_sym
358
- end
359
- end
360
-
361
-
362
- describe Symbol do
363
- before do
364
- require_relative '../lib/y_support/core_ext/symbol'
365
- end
366
-
367
- it "should have #default! defaulter going through String#default!" do
368
- assert_equal :default, "".to_sym.default!(:default)
369
- assert_equal :default, "".to_sym.default!("default")
370
- assert_equal :default, " ".to_sym.default!("default")
371
- assert_equal :default, " \n ".to_sym.default!("default")
372
- assert_equal :kokot, :kokot.default!("default")
373
- end
374
-
375
- it "should have #to_standardized_sym" do
376
- assert_equal :Yes, (:" \nYes, \n").to_standardized_sym
377
- end
378
- end
379
-
380
-
381
- describe Numeric do
382
- before do
383
- require './../lib/y_support/core_ext/numeric'
384
- end
385
-
386
- it "should have #zero public class methods" do
387
- assert_equal 0, Integer.zero
388
- assert_equal 0.0, Float.zero
389
- assert_equal Complex(0, 0), Complex.zero
390
- end
391
- end
6
+ require_relative 'misc/inert_recorder_test'
7
+ require_relative 'misc/local_object_test'
8
+ require_relative 'misc/null_object_test'
9
+ require_relative 'misc/respond_to_test'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: y_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.6
4
+ version: 2.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - boris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-22 00:00:00.000000000 Z
11
+ date: 2016-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -91,18 +91,16 @@ files:
91
91
  - lib/y_support/flex_coerce/class_methods.rb
92
92
  - lib/y_support/flex_coerce/flex_proxy.rb
93
93
  - lib/y_support/flex_coerce/module_methods.rb
94
- - lib/y_support/inert_recorder.rb
95
- - lib/y_support/kde.rb
96
- - lib/y_support/literate.rb
97
- - lib/y_support/local_object.rb
98
94
  - lib/y_support/misc.rb
95
+ - lib/y_support/misc/inert_recorder.rb
96
+ - lib/y_support/misc/local_object.rb
97
+ - lib/y_support/misc/null_object.rb
98
+ - lib/y_support/misc/respond_to.rb
99
99
  - lib/y_support/name_magic.rb
100
100
  - lib/y_support/name_magic/array_methods.rb
101
101
  - lib/y_support/name_magic/class_methods.rb
102
102
  - lib/y_support/name_magic/hash_methods.rb
103
103
  - lib/y_support/name_magic/namespace.rb
104
- - lib/y_support/null_object.rb
105
- - lib/y_support/respond_to.rb
106
104
  - lib/y_support/stdlib_ext.rb
107
105
  - lib/y_support/stdlib_ext/matrix.rb
108
106
  - lib/y_support/stdlib_ext/matrix/misc.rb
@@ -119,21 +117,16 @@ files:
119
117
  - lib/y_support/typing/object/typing.rb
120
118
  - lib/y_support/unicode.rb
121
119
  - lib/y_support/version.rb
122
- - lib/y_support/x.rb
123
120
  - test/core_ext_test.rb
124
121
  - test/flex_coerce_test.rb
125
- - test/inert_recorder_test.rb
126
- - test/kde_test.rb
127
- - test/literate_test.rb
128
- - test/local_object_test.rb
122
+ - test/misc/inert_recorder_test.rb
123
+ - test/misc/local_object_test.rb
124
+ - test/misc/null_object_test.rb
125
+ - test/misc/respond_to_test.rb
129
126
  - test/misc_test.rb
130
- - test/misc_test/test_module/fixture_class.rb
131
127
  - test/name_magic_test.rb
132
- - test/null_object_test.rb
133
- - test/respond_to_test.rb
134
128
  - test/typing_test.rb
135
129
  - test/unicode_test.rb
136
- - test/x_test.rb
137
130
  - y_support.gemspec
138
131
  homepage: ''
139
132
  licenses:
@@ -162,15 +155,11 @@ summary: Support library used by Y gems.
162
155
  test_files:
163
156
  - test/core_ext_test.rb
164
157
  - test/flex_coerce_test.rb
165
- - test/inert_recorder_test.rb
166
- - test/kde_test.rb
167
- - test/literate_test.rb
168
- - test/local_object_test.rb
158
+ - test/misc/inert_recorder_test.rb
159
+ - test/misc/local_object_test.rb
160
+ - test/misc/null_object_test.rb
161
+ - test/misc/respond_to_test.rb
169
162
  - test/misc_test.rb
170
- - test/misc_test/test_module/fixture_class.rb
171
163
  - test/name_magic_test.rb
172
- - test/null_object_test.rb
173
- - test/respond_to_test.rb
174
164
  - test/typing_test.rb
175
165
  - test/unicode_test.rb
176
- - test/x_test.rb
data/lib/y_support/kde.rb DELETED
@@ -1,14 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require_relative '../y_support'
4
-
5
- module YSupport::KDE
6
- class << self
7
- # Open a file with kioclient (using KDE file-viewer associations).
8
- #
9
- def show_file_with_kioclient( fɴ_with_path )
10
- system "sleep 0.2; kioclient exec 'file:%s'" % fɴ_with_path
11
- end
12
- end
13
- end # module YSupport::KDE
14
-
@@ -1,253 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require_relative '../y_support'
4
- require_relative '../y_support/core_ext/array/misc'
5
-
6
- # Did you ever get in the situation that your code does not work
7
- # and you don't know what the problem is? In Ruby, error messages
8
- # are supposed to help you, but how often have you seen error
9
- # messages telling you completely unhelpful things, such as that
10
- # some method is not defined for nil:NilClass? Anyone who
11
- # programmed in Ruby for some time knows that raising good error
12
- # messages is a pain and the code that raises them tends to make
13
- # all your methods look ugly. YSupport's answer to this is Literate
14
- # (loaded by require 'y_support/literate'). Literate offers +#try+
15
- # block, inside which you can construct verbose error messages with
16
- # k +#note+ statements. Note that this +#try+ method has nothing to
17
- # do with the infamous error-swallowing +#try+ method seen and
18
- # denounced elsewhere. Literate's +#try+ method does not swallow
19
- # errors – on the contrary, it helps to raise them. Comments you
20
- # make via +#note+ method (or its alias #») inside +#try+ blocks
21
- # will be used to construct more informative error messages. Good
22
- # error messages ultimately lead to better code and more scalable
23
- # development. Simple example:
24
- #
25
- # "lorem ipsum dolor sit amet".try "to split it into words" do
26
- # note is: "a natural language sentence"
27
- # note has: "#{size} characters"
28
- # words = split ' '
29
- # end
30
- #
31
- # This is not really such a good example, because #try method is
32
- # intended for risky operation, and splitting a string into words
33
- # is not risky at all. But it clearly shows how Literate works.
34
- # Since the era of programs written on punch cards, programmers
35
- # already understood that writing code comments is a good
36
- # practice. The keystrokes you waste by literate coding will pay
37
- # off as soon as you start doing any serious programming. With
38
- # Literate, you can take literate coding to the next level by
39
- # writing self-documenting code, in which comments introduced by
40
- # #note method are read by the interpeter and used to construct
41
- # error messages. All you need to learn is how to use +#try+ and
42
- # +#note+ methods.
43
- #
44
- # Literate relies on +Literate::Attempt+ class, which stays hidden
45
- # behind the scene, but defines all the error-raising capabilities
46
- # of +#try+ blocks.
47
- #
48
- module Literate
49
- # Represents a commented attempt to perform a risky operation,
50
- # which may result in errors. The operation code is supplied as
51
- # a block. Method #comment defined by this class helps to
52
- # increase the informative value of error messages.
53
- #
54
- class Attempt < BasicObject
55
- # String construction closures are defined below.
56
- CONSTRUCT = -> string, prefix: '', postfix: '' do
57
- s = string.to_s
58
- if s.empty? then '' else prefix + s + postfix end
59
- end
60
-
61
- # Hash of transitive verb forms.
62
- TRANSITIVE = ::Hash.new do |_, key| "#{key}ing %s" end
63
- .update( is: "being %s", has: "having %s" )
64
-
65
- # Hash for construction of statements (error message parts).
66
- STATE = ::Hash.new do |ꜧ, key| "#{key} %s" end
67
- .update( is: "%s", has: "has %s" )
68
-
69
- # An Attempt instance has 4 properties.
70
- attr_reader :__subject__ # Grammatical subject of the attempt.
71
- attr_reader :__block__ # Block that performs the attempt.
72
- attr_reader :__text__ # NL description of the attempt.
73
- attr_reader :__knowledge_base__
74
-
75
- # Attempt constructor expects two parameters (:subject and
76
- # :text) and one block. Argument of the :subject parameter is
77
- # the main subject of the risky operation attempted inside the
78
- # block. Argument of the :text parameter is the natural
79
- # language textual description of the risky opration.
80
- #
81
- def initialize( subject: nil, text: nil, &block )
82
- @__subject__ = subject
83
- @__text__ = text
84
- @__block__ = block
85
- # Knowledge base is a list of subjects and facts known
86
- # about them.
87
- @__knowledge_base__ = ::Hash.new do |hash, missing_key|
88
- hash[ missing_key ] = [ {} ]
89
- end
90
- end
91
-
92
- # Method #note is available inside the #try block
93
- #
94
- # note "Concatenation of Foo and Bar",
95
- # is: "FooBar",
96
- # has: "6 letters"
97
- #
98
- def note *subjects, **statements, &block
99
- if statements.empty? then
100
- # No statements were supplied to #note.
101
- subjects.each { |subject|
102
- # Fill in the knowledge base ...
103
- # FIXME: I wonder how the code here works.
104
- __knowledge_base__[ subject ].push_ordered subject
105
- }
106
- # FIXME: I wonder whether returning this is OK.
107
- return subjects
108
- end
109
- # Here, we know that variable statements is not empty.
110
- # If subjects variable is empty, assume main subject.
111
- subjects << __subject__ if subjects.empty?
112
- # Fill the knowledge base ...
113
- # FIXME: I wonder how the code here works.
114
- subjects.each { |subject|
115
- statements.each do |verb, object|
116
- __knowledge_base__[ subject ].push_named verb => object
117
- end
118
- }
119
- # Return the second element of the first statement.
120
- return statements.first[ 1 ]
121
- end
122
-
123
- # Alias of #note method that allows comments such as this:
124
- #
125
- # a = []
126
- # a.try "to insert number one in it" do
127
- # » is: "an empty array"
128
- # push 1
129
- # end
130
- #
131
- alias » note
132
-
133
- # Runs the attempt.
134
- #
135
- def __run__ *args
136
- begin
137
- instance_exec *args, &__block__
138
- rescue ::StandardError => error
139
- # Error has occured. Show time for Literate::Attempt.
140
- raise error, __error_message__( error )
141
- end
142
- end
143
-
144
- # Facilitating error messages is the main purpose of Literate.
145
- # This method is invoked when an error occurs inside the block
146
- # run by Literate::Attempt instance and it constructs a verbose
147
- # error message using the facts the Attempt instance knows.
148
- #
149
- def __error_message__ error
150
- # Write the first part of the error message.
151
- part1 = "When trying #{__text__}"
152
- # Get the description of the main subject.
153
- subject, statements = __describe__( __subject__ )
154
- # Write the 2nd part of the error message.
155
- part2 = CONSTRUCT.( subject, prefix: ' ' )
156
- # Construct the descriptive string of the main subject.
157
- subject_description = statements.map { |verb, object|
158
- # Generate the statement string.
159
- STATE[ verb ] % object
160
- }.join ', ' # join the statement strings with commas
161
- # Write the third part of the error message.
162
- part3 = CONSTRUCT.( subject_description,
163
- prefix: ' (', postfix: ')' )
164
- # Write the fourth part of the error message.
165
- part4 = CONSTRUCT.( __circumstances__, prefix: ', ' )
166
- # Write the fifth part of the error message.
167
- part5 = ": #{error}"
168
- part6 = ['.', '!', '?'].include?( part5[-1] ) ? '' : '!'
169
- return [ part1, part2, part3, part4, part5, part6 ].join
170
- end
171
-
172
- # Inside the block, +#try method is delegated to the subject
173
- # of the attempt.
174
- #
175
- def try *args, &block
176
- __subject__.try *args, &block
177
- end
178
-
179
- # Method missing delegates all methods not recognized by
180
- # Literate::Attempt class (which is a subclass of BasicObject)
181
- # to the subject of the attempt.
182
- #
183
- def method_missing symbol, *args
184
- __subject__.send symbol, *args
185
- end
186
-
187
- # Produces a description of the subject supplied to the method.
188
- #
189
- def __describe__ subject
190
- # Start with the facts known about the subject.
191
- facts = __knowledge_base__[ subject ].dup
192
- # FIXME: I wonder what this method is *really* doing.
193
- # It seems that I wrote this library too quickly and didn't
194
- # bother with properly defining its list of facts.
195
- # I did not define what is a "fact", what is a "statement"
196
- # etc., I just go around using the words and hoping I will
197
- # understand it after myself later. I found it's quite hard.
198
- statements = if facts.last.is_a? ::Hash then
199
- facts.pop
200
- else {} end
201
- fs = facts.join ', '
202
- if statements.empty? then
203
- return fs, statements
204
- else
205
- return facts.empty? ? subject.to_s : fs, statements
206
- end
207
- end
208
-
209
- # Produces description of the circumstances, that is,
210
- # concatenated descriptions of all facts known to the Attempt
211
- # instance except those about the main subject of the attempt.
212
- #
213
- def __circumstances__
214
- # Start with all facts known to the Attempt instance.
215
- base = __knowledge_base__
216
- # Ignore the facts about the main subject.
217
- circumstances = base.reject { |s, _| s == __subject__ }
218
- # Construct descriptive strings of the remaining facts.
219
- fact_strings = circumstances.map { |subject, _|
220
- subject, statements = __describe__( subject )
221
- statements = statements.map { |verb, object|
222
- TRANSITIVE[ verb ] % object
223
- }.join( ', ' )
224
- # Create the fact string.
225
- subject + CONSTRUCT.( statements, prefix: ' ' )
226
- }
227
- # Concatenate the fact strings and return the result.
228
- return fact_strings.join( ', ' )
229
- end
230
- end
231
- end
232
-
233
- class Object
234
- # Try method takes two textual arguments and one block. The first
235
- # (optional) argument is a natural language description of the
236
- # method's receiver (with #to_s of the receiver used by
237
- # default). The second argument is a natural language description
238
- # of the supplied block's _contract_ -- in other words, what the
239
- # supplied block tries to do. Finally, the block contains the
240
- # code to perform the described risky action. Inside the block,
241
- # +#note+ method is available, which builds up the context
242
- # information for a good error message, should the risky action
243
- # raise one.
244
- #
245
- def try attempt_description, &block
246
- # Construct a new Attempt instance.
247
- attempt = Literate::Attempt.new subject: self,
248
- text: attempt_description,
249
- &block
250
- # Run the block.
251
- attempt.__run__
252
- end
253
- end
data/lib/y_support/x.rb DELETED
@@ -1,86 +0,0 @@
1
- require_relative '../y_support'
2
- require 'gtk2'
3
-
4
- # Assets related to X windows control.
5
- #
6
- module YSupport::X
7
- # ==================================================================
8
- #
9
- # Notice: Assets related to X windows control do not really belong
10
- # to YSupport. I should keep them somewhere else. I will keep this
11
- # file in YSupport 2.x for historical reasons. Module YSupport::X
12
- # will be removed in YSupport 3.0, which will no longer cover tools
13
- # for X windows control.
14
- #
15
- warn "YSupport::X is obsolete!"
16
- #
17
- # ==================================================================
18
-
19
- # Echo a string to the primary X clip; `xsel -b -i`.
20
- #
21
- def echo_primary_clipboard string
22
- s = 'echo -n ' + string.inspect + ' | xsel -b -i'
23
- system s
24
- end
25
-
26
- # Echo a string to the secondary X clip; `xsel -b -i`.
27
- #
28
- def echo_secondary_clipboard string
29
- s = 'echo -n ' + string.inspect + ' | xsel -s -i'
30
- system s
31
- end
32
-
33
- # Dialog box querying for a string.
34
- #
35
- def query_box( dialog_text, prompt: '> ', title_bar: 'User input required', &block )
36
- title_bar_text = title_bar
37
- prompt_label_text = prompt
38
-
39
- w = Gtk::Window.new( Gtk::Window::TOPLEVEL )
40
- w.set_title( title_bar_text )
41
- w.border_width = 10
42
- w.signal_connect 'delete_event' do Gtk.main_quit end # cc
43
-
44
- tlabel_widget = Gtk::Label.new( dialog_text )
45
- plabel_widget = Gtk::Label.new( prompt_label_text )
46
- ebox_widget = Gtk::Entry.new
47
- ebox_widget.visibility = true # cc
48
-
49
- hbox = Gtk::HBox.new(false, 5) # cc
50
- hbox.pack_start_defaults( plabel_widget ) # cc
51
- hbox.pack_start_defaults( ebox_widget )
52
- vbox = Gtk::VBox.new(false, 5)
53
- vbox.pack_start_defaults( tlabel_widget )
54
- vbox.pack_start_defaults( hbox )
55
- w.add(vbox)
56
-
57
- memo = ""
58
- memo_closure = -> txt { memo << txt }
59
-
60
- ebox_widget.signal_connect "key-release-event" do |sender, event| # cc
61
- kn = Gdk::Keyval.to_name( event.keyval )
62
- if kn == "Return"
63
- memo_closure.( sender.text )
64
- block.( sender.text ) if block
65
- Gtk.main_quit
66
- end
67
- end
68
-
69
- memo.tap { w.show_all; Gtk.main }
70
- end
71
-
72
- # Message box.
73
- #
74
- def message_box( message="Press any key to close this window!" )
75
- w = Gtk::Window.new
76
- w.add_events Gdk::Event::KEY_PRESS
77
- w.add Gtk::Label.new( message )
78
- w.signal_connect "key-release-event" do Gtk.main_quit end
79
- w.set_default_size( 600, 120 )
80
- w.show_all
81
- Gtk.main
82
- end
83
- alias popup message_box
84
-
85
- extend self
86
- end # module YSupport::X
data/test/kde_test.rb DELETED
@@ -1,11 +0,0 @@
1
- #! /usr/bin/ruby
2
- #encoding: utf-8
3
-
4
- require 'minitest/autorun'
5
- require './../lib/y_support/kde'
6
-
7
- describe YSupport::KDE do
8
- it "should at least respond to certain messages" do
9
- assert_respond_to YSupport::KDE, :show_file_with_kioclient
10
- end
11
- end
@@ -1,231 +0,0 @@
1
- #! /usr/bin/ruby
2
- # coding: utf-8
3
-
4
- require 'minitest/autorun'
5
- # require 'y_support/literate' # tested component itself
6
- require './../lib/y_support/literate'
7
-
8
- describe Literate::Attempt do
9
- before do
10
- @str = "lorem ipsum dolor sit amet"
11
- @txt = "split the sentence into words"
12
- # A simple attempt block.
13
- @a = Literate::Attempt.new subject: @str, text: @txt do
14
- note is: "natural language sentence"
15
- split ' '
16
- end
17
- # More verbose attempt block.
18
- chosen_word = 3
19
- @b = Literate::Attempt.new subject: @str, text: @txt do
20
- » is: "natural language sentence"
21
- » has: "#{size} characters"
22
- words = split ' '
23
- » "number of words", is: words.size
24
- » "chosen word", is: words[ chosen_word ]
25
- words
26
- end
27
- end
28
-
29
- it "should have 4 basic properties" do
30
- @a.__text__.must_equal @txt
31
- @a.__subject__.must_equal @str
32
- @a.__block__.must_be_kind_of Proc
33
- @a.__knowledge_base__.must_be_empty
34
- # Fact list is empty because the block hasn't been run yet.
35
- # Let's run the block:
36
- @a.__run__
37
- # Now the fact list includes the comment made in the block.
38
- @a.__knowledge_base__.size.must_equal 1
39
- end
40
-
41
- describe "#__run__" do
42
- it "must run the attempt's block" do
43
- expected_result = "lorem", "ipsum", "dolor", "sit", "amet"
44
- @a.__run__.must_equal expected_result
45
- end
46
- end
47
-
48
- describe "Object#try method" do
49
- before do
50
- error = false
51
- @error_switch = -> arg { error = arg }
52
- @text = "to split into words"
53
- @block = proc do
54
- note is: "a string with several words"
55
- fail error if error
56
- split ' '
57
- end
58
- end
59
-
60
- it "must execute the block allowing subject's methods" do
61
- "hello world".try( @text, &@block )
62
- .must_equal [ "hello", "world" ]
63
- @error_switch.( TypeError )
64
- -> { "hello world".try @text, &@block }.must_raise TypeError
65
- @error_switch.( NameError )
66
- -> { "hello world".try @text, &@block }.must_raise NameError
67
- end
68
-
69
- it "must allow Literate::Attempt#comment inside the block" do
70
- begin
71
- @error_switch.( TypeError )
72
- "hello world".try @text, &@block
73
- rescue => error
74
- # Proof that Literate::Attemp#comment activated.
75
- m = error.message
76
- m.must_include "When trying to split into words"
77
- m.must_include "a string with several words"
78
- else
79
- flunk "Error expected but nothing raised!"
80
- end
81
- end
82
- end
83
-
84
- describe "#note" do
85
- it "must write entries into @__knowledge_base__" do
86
- @a.__run__
87
- x = { @str => [ is: "natural language sentence" ] }
88
- @a.__knowledge_base__.must_equal x
89
- end
90
-
91
- it "must write entries into @__knowledge_base__" do
92
- @b.__run__
93
- x = { @str => [ is: "natural language sentence",
94
- has: "26 characters" ],
95
- "number of words" => [ is: 5 ],
96
- "chosen word" => [ is: "sit" ] }
97
- @b.__knowledge_base__ .must_equal x
98
- end
99
- end
100
-
101
- describe "#__describe__" do
102
- it "must produce description of the main subject" do
103
- @a.__run__
104
- @a.__describe__( @a.__subject__ )
105
- .must_equal [ "lorem ipsum dolor sit amet",
106
- { is: "natural language sentence" } ]
107
- @b.__run__
108
- @b.__describe__( @a.__subject__ )
109
- .must_equal [ "lorem ipsum dolor sit amet",
110
- { is: "natural language sentence",
111
- has: "26 characters" } ]
112
- end
113
- end
114
-
115
- describe "#__circumstances__" do
116
- it "..." do
117
- @a.__run__
118
- @a.__circumstances__.must_equal ""
119
- @b.__run__
120
- @b.__circumstances__
121
- .must_equal "number of words being 5, " +
122
- "chosen word being sit"
123
- end
124
- end
125
- end
126
-
127
- describe "usecase 1: name validator" do
128
- before do
129
- @name_validator = Object.new
130
- @name_validator.define_singleton_method :validate do |name|
131
- name.to_s.try "to validate the requested name" do
132
- note "rejecting non-capitalized names"
133
- fail NameError unless ( ?A..?Z ) === self[0]
134
- note "rejecting names with spaces"
135
- fail NameError unless split( ' ' ).size == 1
136
- end
137
- return name
138
- end
139
- end
140
-
141
- it "should validate good names" do
142
- @name_validator.validate( :Fred ).must_equal :Fred
143
- @name_validator.validate( "Su_san" ).must_equal "Su_san"
144
- end
145
-
146
- it "should reject bad names with a good error message" do
147
- expected_message =
148
- "When trying to validate the requested name, rejecting " +
149
- "non-capitalized names: NameError!"
150
- begin
151
- @name_validator.validate( :fred )
152
- rescue => error
153
- error.message.must_equal expected_message
154
- end
155
- end
156
- end
157
-
158
- # describe 'case 1' do
159
- # it "should work" do
160
- # # begin
161
- # # @a.__run__
162
- # # rescue TypeError => err
163
- # # expected_msg = "When trying concatenation of an array " +
164
- # # "with 2 elements, TypeError occurred: " +
165
- # # "Lorem ipsum dolor sit amet!"
166
- # # # Make sure the last 45 characters is OK.
167
- # # assert_equal expected_msg[-45..-1], err.message[-45..-1]
168
- # # # # Make sure that whole message is as expected.
169
- # # # assert_equal expected_msg, err.message
170
- # # else
171
- # # flunk "Expected TypeError error not raised!"
172
- # # end
173
- # end
174
- # end
175
-
176
- # describe 'case 2' do
177
- # it "should work" do
178
- # begin
179
- # try "to call constant Nothing" do Nothing end
180
- # rescue NameError => err
181
- # expected_msg = 'When trying to call constant Nothing, ' +
182
- # 'NameError occurred: uninitialized constant Nothing'
183
- # assert_equal( expected_msg, err.message )
184
- # else
185
- # flunk "Expected NameError error not raised!"
186
- # end
187
- # end
188
- # end
189
-
190
- # describe 'case 3' do
191
- # it "should work" do
192
- # o = Object.new
193
- # class << o
194
- # def to_s; "THIS OBJECT" end
195
- # def hello!; "hello hello" end
196
- # end
197
- # # Object's methods must be callable
198
- # o.try "to say hello" do hello! end.must_equal "hello hello"
199
- # begin
200
- # o.try "to call a weird method" do goodbye! end
201
- # rescue NoMethodError => err
202
- # err.message.must_include "When trying to call a weird " +
203
- # "method, NoMethodError occurred: undefined method"
204
- # err.message.must_include "goodbye!"
205
- # end
206
- # end
207
- # end
208
-
209
- # describe 'case 4' do
210
- # it "should work" do
211
- # begin
212
- # "FooBar".try "to do something" do
213
- # comment has: "#{size} letters",
214
- # is: "a #{self.class} instance"
215
- # unless include? "Quux"
216
- # comment "Quux", is: "not a part of it"
217
- # try "to append Quux to it" do
218
- # self << "Quux"
219
- # fail "EPIC FAIL"
220
- # end
221
- # end
222
- # end
223
- # rescue => err
224
- # err.message.must_equal "When trying to do something, " +
225
- # "FooBar having 6 letters, being a String instance, " +
226
- # "Quux being not a part of it, RuntimeError occurred: " +
227
- # "When trying to append Quux to it, RuntimeError " +
228
- # "occurred: EPIC FAIL"
229
- # end
230
- # end
231
- # end
@@ -1,8 +0,0 @@
1
- class MiscTest
2
- module TestModule
3
- class FixtureClass
4
- def hello; "world" end
5
- end
6
- end
7
- end
8
-
data/test/x_test.rb DELETED
@@ -1,21 +0,0 @@
1
- #! /usr/local/bin/ruby
2
- # encoding: utf-8
3
-
4
- require 'minitest/autorun'
5
-
6
- describe "y_support/x" do
7
- before do
8
- require './../lib/y_support/x'
9
- YSupport::X.echo_primary_clipboard '"foo & bar"'
10
- YSupport::X.echo_secondary_clipboard "baz"
11
- end
12
-
13
- it "should have clipboard as expected" do
14
- assert_equal '"foo & bar" baz', [`xsel -b`, `xsel -s`].join(' ')
15
- end
16
-
17
- it "should know #query_box and #message_box methods" do
18
- assert_respond_to YSupport::X, :query_box
19
- assert_respond_to YSupport::X, :message_box
20
- end
21
- end # describe "y_support/x"