pasteboard 1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,16 @@
1
+ require 'pasteboard'
2
+ require 'pp'
3
+
4
+ pb = Pasteboard.new
5
+
6
+ pb.each.with_index do |item, index|
7
+ puts "item #{index} id #{pb.get_item_identifier index + 1}"
8
+ item.map do |flavor, data|
9
+ puts "flavor: #{flavor}"
10
+ puts "encoding: #{data.encoding} valid: #{data.valid_encoding?}" if
11
+ defined?(Encoding)
12
+ puts "data: #{data.inspect[0, 70]}"
13
+ puts
14
+ end
15
+ puts
16
+ end
@@ -0,0 +1,110 @@
1
+ require 'pasteboard'
2
+
3
+ troll_tiff = %w[
4
+ 4d 4d 00 2a 00 00 04 08 00 00 00 00 00 00 00
5
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
6
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
7
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
8
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
9
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
10
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
11
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
12
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
13
+ 00 00 00 00 00 00 00 00 00 00 00 00 ff 00 00
14
+ 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff 00
15
+ 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 ff
16
+ 00 00 00 ff 00 00 00 ff 00 00 00 00 00 00 00
17
+ 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff
18
+ ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
19
+ ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
20
+ ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00
21
+ ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00
22
+ 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff
23
+ ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
24
+ ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
25
+ ff 00 00 00 ff 00 00 00 00 00 00 00 00 00 00
26
+ 00 ff ff ff ff ff 00 00 00 ff 00 00 00 ff 00
27
+ 00 00 ff ff ff ff ff 00 00 00 ff 00 00 00 ff
28
+ 00 00 00 ff 00 00 00 ff ff ff ff ff ff ff ff
29
+ ff ff ff ff ff ff ff ff ff 00 00 00 ff 00 00
30
+ 00 00 00 00 00 ff ff ff ff ff ff ff ff ff 00
31
+ 00 00 ff 00 00 00 ff ff ff ff ff ff ff ff ff
32
+ ff ff ff ff 00 00 00 ff 00 00 00 ff ff ff ff
33
+ ff 00 00 00 ff 00 00 00 ff ff ff ff ff ff ff
34
+ ff ff 00 00 00 ff 00 00 00 00 00 00 00 ff ff
35
+ ff ff ff 00 00 00 ff ff ff ff ff ff ff ff ff
36
+ 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff
37
+ ff ff ff ff ff ff ff ff ff 00 00 00 ff 00 00
38
+ 00 ff ff ff ff ff 00 00 00 ff 00 00 00 00 00
39
+ 00 00 ff ff ff ff ff ff ff ff ff 00 00 00 ff
40
+ 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff
41
+ ff 00 00 00 ff 00 00 00 ff 00 00 00 ff ff ff
42
+ ff ff 00 00 00 ff ff ff ff ff 00 00 00 ff 00
43
+ 00 00 00 00 00 00 ff 00 00 00 ff 00 00 00 ff
44
+ 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00
45
+ ff 00 00 00 ff ff ff ff ff 00 00 00 ff ff ff
46
+ ff ff ff ff ff ff ff ff ff ff 00 00 00 ff 00
47
+ 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff
48
+ 00 00 00 ff ff ff ff ff 00 00 00 ff ff ff ff
49
+ ff 00 00 00 ff ff ff ff ff 00 00 00 ff ff ff
50
+ ff ff ff ff ff ff ff ff ff ff 00 00 00 ff 00
51
+ 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ff
52
+ 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00 00
53
+ ff 00 00 00 ff 00 00 00 ff 00 00 00 ff ff ff
54
+ ff ff ff ff ff ff ff ff ff ff 00 00 00 ff 00
55
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff
56
+ ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
57
+ ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
58
+ ff ff ff ff ff ff 00 00 00 ff 00 00 00 ff 00
59
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60
+ 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff
61
+ ff ff ff ff ff ff ff ff ff 00 00 00 ff 00 00
62
+ 00 ff 00 00 00 ff 00 00 00 ff 00 00 00 00 00
63
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
64
+ 00 00 00 00 00 00 00 00 00 00 00 ff 00 00 00
65
+ ff 00 00 00 ff 00 00 00 ff 00 00 00 ff 00 00
66
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
67
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
68
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
69
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
71
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
72
+ 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 01
73
+ 00 00 03 00 00 00 01 00 10 00 00 01 01 00 03
74
+ 00 00 00 01 00 10 00 00 01 02 00 03 00 00 00
75
+ 04 00 00 04 aa 01 03 00 03 00 00 00 01 00 01
76
+ 00 00 01 06 00 03 00 00 00 01 00 02 00 00 01
77
+ 11 00 04 00 00 00 01 00 00 00 08 01 12 00 03
78
+ 00 00 00 01 00 01 00 00 01 15 00 03 00 00 00
79
+ 01 00 04 00 00 01 16 00 03 00 00 00 01 00 10
80
+ 00 00 01 17 00 04 00 00 00 01 00 00 04 00 01
81
+ 1c 00 03 00 00 00 01 00 01 00 00 01 52 00 03
82
+ 00 00 00 01 00 02 00 00 01 53 00 03 00 00 00
83
+ 04 00 00 04 b2 00 00 00 00 00 08 00 08 00 08
84
+ 00 08 00 01 00 01 00 01 00 01
85
+ ]
86
+
87
+ troll_tiff = troll_tiff.map do |byte|
88
+ byte.to_i(16)
89
+ end.pack('C*')
90
+
91
+ troll_url = <<-URL.delete("\n")
92
+ data:image/png;base64,
93
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAACVBMVEUAAAD///8AAABzxoNxAAAAA
94
+ 3RSTlP//wDXyg1BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAElJREFUGN
95
+ Ntj0EKADEIA2fy/0fvIS2WxUhBh6qR/MQCGCUhOGIDSB8loKCCzYNo+6DgfsGCI+mM4I1ny1lCEsY
96
+ GZMDxXetTrNd+jqUBCGff77QAAAAASUVORK5CYII=
97
+ URL
98
+
99
+ pb = Pasteboard.new
100
+
101
+ item = [
102
+ [Pasteboard::Type::TIFF, troll_tiff],
103
+ [Pasteboard::Type::URL, troll_url],
104
+ [Pasteboard::Type::URL_NAME, 'trollface'],
105
+ [Pasteboard::Type::UTF_8, troll_url],
106
+ ]
107
+
108
+ pb.put item
109
+
110
+ system 'open -a "Clipboard Viewer"'
@@ -0,0 +1,287 @@
1
+ # coding: utf-8
2
+
3
+ require 'minitest/unit'
4
+ require 'pasteboard'
5
+
6
+ class TestPasteboard < MiniTest::Unit::TestCase
7
+
8
+ def setup
9
+ @pb = Pasteboard.new nil
10
+ @encoding = defined?(Encoding)
11
+ end
12
+
13
+ def test_initialize
14
+ pb = Pasteboard.new
15
+
16
+ assert_equal 'Apple CFPasteboard general', pb.name
17
+ end
18
+
19
+ def test_initialize_find
20
+ pb = Pasteboard.new Pasteboard::FIND
21
+
22
+ assert_equal 'Apple CFPasteboard find', pb.name
23
+ end
24
+
25
+ def test_initialize_nil
26
+ pb = Pasteboard.new nil
27
+
28
+ assert_match %r%^CFPasteboardUnique-%, pb.name
29
+ end
30
+
31
+ def test_clear
32
+ util_put
33
+
34
+ @pb.clear
35
+
36
+ assert_equal 0, @pb.get_item_count
37
+ end
38
+
39
+ def test_copy_item_flavors
40
+ util_put
41
+
42
+ flavors = @pb.copy_item_flavors 0
43
+
44
+ assert_equal [Pasteboard::Type::PLAIN_TEXT, Pasteboard::Type::UTF_8],
45
+ flavors[0, 2]
46
+
47
+ assert flavors.all? { |flavor| flavor.encoding == Encoding::UTF_8 } if
48
+ @encoding
49
+ end
50
+
51
+ def test_copy_item_flavor_data
52
+ util_put
53
+
54
+ data = @pb.copy_item_flavor_data 0, Pasteboard::Type::PLAIN_TEXT
55
+
56
+ assert_equal 'pi', data
57
+ assert_equal Encoding::BINARY, data.encoding if @encoding
58
+
59
+ data = @pb.copy_item_flavor_data 0, Pasteboard::Type::UTF_8
60
+
61
+ assert_equal 'π', data
62
+ assert_equal Encoding::UTF_8, data.encoding if @encoding
63
+ end
64
+
65
+ def test_each
66
+ util_put_many
67
+
68
+ items = []
69
+
70
+ @pb.each do |item|
71
+ items << item[0, 2]
72
+ end
73
+
74
+ assert_equal [@item1, @item2], items
75
+ end
76
+
77
+ def test_each_enum
78
+ enum = @pb.each
79
+
80
+ enum_klass = defined?(Enumerator) ? Enumerator : Enumerable::Enumerator
81
+
82
+ assert_kind_of enum_klass, enum
83
+ end
84
+
85
+ def test_each_flavor
86
+ util_put_many
87
+
88
+ items = []
89
+
90
+ @pb.each Pasteboard::Type::UTF_8 do |item|
91
+ items << item
92
+ end
93
+
94
+ assert_equal ['π', '0°'], items
95
+ end
96
+
97
+ def test_each_flavor_missing
98
+ util_put_many
99
+
100
+ items = []
101
+
102
+ @pb.each Pasteboard::Type::JPEG do |item|
103
+ items << item
104
+ end
105
+
106
+ assert_equal [nil, nil], items
107
+ end
108
+
109
+ def test_first
110
+ util_put
111
+
112
+ item = @pb.first
113
+
114
+ assert_equal @item, item[0, 2]
115
+ end
116
+
117
+ def test_first_flavor
118
+ util_put
119
+
120
+ item = @pb.first Pasteboard::Type::UTF_8
121
+
122
+ assert_equal 'π', item
123
+ end
124
+
125
+ def test_get
126
+ util_put
127
+
128
+ item = @pb.get(0)
129
+
130
+ assert_equal @item, item[0, 2]
131
+ end
132
+
133
+ def test_get_flavor
134
+ util_put
135
+
136
+ assert_equal 'pi', @pb.get(0, Pasteboard::Type::PLAIN_TEXT)
137
+ end
138
+
139
+ def test_get_flavor_missing
140
+ util_put
141
+
142
+ assert_nil @pb.get(0, Pasteboard::Type::JPEG)
143
+ end
144
+
145
+ def test_get_item_count
146
+ assert_equal 0, @pb.get_item_count
147
+
148
+ util_put
149
+
150
+ assert_equal 1, @pb.get_item_count
151
+ end
152
+
153
+ def test_get_item_identifier
154
+ util_put
155
+
156
+ id = @pb.get_item_identifier 1
157
+
158
+ assert_equal 0, id
159
+ end
160
+
161
+ def test_ids
162
+ util_put
163
+
164
+ assert_equal [0], @pb.ids
165
+ end
166
+
167
+ def test_index
168
+ util_put
169
+
170
+ item = @pb[0]
171
+
172
+ assert_equal @item, item[0, 2]
173
+
174
+ assert_nil @pb[1]
175
+ end
176
+
177
+ def test_index_flavor
178
+ util_put
179
+
180
+ item = @pb[0, Pasteboard::Type::UTF_8]
181
+
182
+ assert_equal 'π', item
183
+
184
+ assert_nil @pb[1, Pasteboard::Type::UTF_8]
185
+ end
186
+
187
+ def test_index_multi
188
+ util_put_many
189
+
190
+ assert_equal @item1, @pb[0][0, 2]
191
+
192
+ assert_equal @item2, @pb[1][0, 2]
193
+ end
194
+
195
+ def test_inspect
196
+ expected = '#<%s:0x%x %s>' % [Pasteboard, @pb.object_id, @pb.name]
197
+
198
+ assert_equal expected, @pb.inspect
199
+ end
200
+
201
+ def test_name
202
+ assert_match %r%CFPasteboardUnique%, @pb.name
203
+ end
204
+
205
+ def test_put
206
+ util_put
207
+
208
+ assert_equal 1, @pb.get_item_count
209
+ assert_equal [Pasteboard::Type::PLAIN_TEXT, Pasteboard::Type::UTF_8],
210
+ @pb.copy_item_flavors(0)[0, 2]
211
+ end
212
+
213
+ def test_put_item_flavor
214
+ @pb.clear
215
+
216
+ @pb.put_item_flavor 5, 'flavor', 'data'
217
+
218
+ assert_equal 1, @pb.get_item_count
219
+ assert_equal 5, @pb.get_item_identifier(1)
220
+ assert_equal %w[flavor], @pb.copy_item_flavors(5)
221
+
222
+ data = @pb.copy_item_flavor_data 5, 'flavor'
223
+ assert_equal 'data', data
224
+ assert_equal Encoding::BINARY, data.encoding if @encoding
225
+ end
226
+
227
+ def test_put_jpeg_url
228
+ @pb.put_jpeg_url 'JPEG data', 'http://example', 'my cool jpeg'
229
+
230
+ assert_put [
231
+ [Pasteboard::Type::JPEG, 'JPEG data'],
232
+ [Pasteboard::Type::URL, 'http://example'],
233
+ [Pasteboard::Type::URL_NAME, 'my cool jpeg'],
234
+ [Pasteboard::Type::UTF_8, 'http://example'],
235
+ ]
236
+ end
237
+
238
+ def test_put_url
239
+ @pb.put_url 'http://example', 'my cool jpeg'
240
+
241
+ assert_put [
242
+ [Pasteboard::Type::URL, 'http://example'],
243
+ [Pasteboard::Type::URL_NAME, 'my cool jpeg'],
244
+ [Pasteboard::Type::UTF_8, 'http://example'],
245
+ ]
246
+ end
247
+
248
+ def test_sync
249
+ assert_equal 0, @pb.sync
250
+ end
251
+
252
+ def util_put
253
+ @item = [
254
+ [Pasteboard::Type::PLAIN_TEXT, 'pi'],
255
+ [Pasteboard::Type::UTF_8, 'π'],
256
+ ]
257
+
258
+ @pb.put @item
259
+ end
260
+
261
+ def util_put_many
262
+ @item1 = [
263
+ [Pasteboard::Type::PLAIN_TEXT, 'pi'],
264
+ [Pasteboard::Type::UTF_8, 'π'],
265
+ ]
266
+
267
+ @item2 = [
268
+ [Pasteboard::Type::UTF_8, '0°'],
269
+ [Pasteboard::Type::PLAIN_TEXT, '0 degrees'],
270
+ ]
271
+
272
+ @pb.put @item1, @item2
273
+ end
274
+
275
+ def assert_put *expecteds
276
+ assert_equal expecteds.length, @pb.get_item_count
277
+
278
+ expecteds.each do |expected|
279
+ expected.each_with_index do |(flavor, data), index|
280
+ assert_equal flavor, @pb.copy_item_flavors(0)[index]
281
+ assert_equal data, @pb.first(flavor)
282
+ end
283
+ end
284
+ end
285
+
286
+ end
287
+
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pasteboard
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
+ prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ version: "1.0"
10
+ platform: ruby
11
+ authors:
12
+ - Eric Hodel
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain:
16
+ - |
17
+ -----BEGIN CERTIFICATE-----
18
+ MIIDNjCCAh6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
19
+ YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
20
+ ZXQwHhcNMDcxMjIxMDIwNDE0WhcNMDgxMjIwMDIwNDE0WjBBMRAwDgYDVQQDDAdk
21
+ cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
22
+ FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
23
+ LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
24
+ U5ddZCVywn5nnAQ+Ui7jMW54CYt5/H6f2US6U0hQOjJR6cpfiymgxGdfyTiVcvTm
25
+ Gj/okWrQl0NjYOYBpDi+9PPmaH2RmLJu0dB/NylsDnW5j6yN1BEI8MfJRR+HRKZY
26
+ mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
27
+ g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
28
+ sCANiQ8BAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
29
+ BBS5k4Z75VSpdM0AclG2UvzFA/VW5DANBgkqhkiG9w0BAQUFAAOCAQEAHagT4lfX
30
+ kP/hDaiwGct7XPuVGbrOsKRVD59FF5kETBxEc9UQ1clKWngf8JoVuEoKD774dW19
31
+ bU0GOVWO+J6FMmT/Cp7nuFJ79egMf/gy4gfUfQMuvfcr6DvZUPIs9P/TlK59iMYF
32
+ DIOQ3DxdF3rMzztNUCizN4taVscEsjCcgW6WkUJnGdqlu3OHWpQxZBJkBTjPCoc6
33
+ UW6on70SFPmAy/5Cq0OJNGEWBfgD9q7rrs/X8GGwUWqXb85RXnUVi/P8Up75E0ag
34
+ 14jEc90kN+C7oI/AGCBN0j6JnEtYIEJZibjjDJTSMWlUKKkj30kq7hlUC2CepJ4v
35
+ x52qPcexcYZR7w==
36
+ -----END CERTIFICATE-----
37
+
38
+ date: 2011-03-28 00:00:00 -07:00
39
+ default_executable:
40
+ dependencies:
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ prerelease: false
44
+ requirement: &id001 !ruby/object:Gem::Requirement
45
+ none: false
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ hash: 11
50
+ segments:
51
+ - 2
52
+ - 0
53
+ - 2
54
+ version: 2.0.2
55
+ type: :development
56
+ version_requirements: *id001
57
+ - !ruby/object:Gem::Dependency
58
+ name: rake-compiler
59
+ prerelease: false
60
+ requirement: &id002 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ hash: 5
66
+ segments:
67
+ - 0
68
+ - 7
69
+ version: "0.7"
70
+ type: :development
71
+ version_requirements: *id002
72
+ - !ruby/object:Gem::Dependency
73
+ name: hoe
74
+ prerelease: false
75
+ requirement: &id003 !ruby/object:Gem::Requirement
76
+ none: false
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ hash: 41
81
+ segments:
82
+ - 2
83
+ - 9
84
+ - 1
85
+ version: 2.9.1
86
+ type: :development
87
+ version_requirements: *id003
88
+ description: |-
89
+ Pasteboard wraps the OS X system pasteboard. Pasteboard allows you to add
90
+ and retrieve multiple items and multiple item flavors to the pasteboard unlike
91
+ +pbpaste+ and +pbcopy+ which only allow text.
92
+ email:
93
+ - drbrain@segment7.net
94
+ executables: []
95
+
96
+ extensions:
97
+ - ext/pasteboard/extconf.rb
98
+ extra_rdoc_files:
99
+ - History.txt
100
+ - Manifest.txt
101
+ files:
102
+ - .autotest
103
+ - History.txt
104
+ - Manifest.txt
105
+ - README.rdoc
106
+ - Rakefile
107
+ - ext/pasteboard/extconf.rb
108
+ - ext/pasteboard/pasteboard.c
109
+ - lib/pasteboard.rb
110
+ - lib/pasteboard/type.rb
111
+ - sample/dump.rb
112
+ - sample/image.rb
113
+ - test/test_pasteboard.rb
114
+ - .gemtest
115
+ has_rdoc: true
116
+ homepage: http://github.com/drbrain/pasteboard
117
+ licenses: []
118
+
119
+ post_install_message:
120
+ rdoc_options:
121
+ - --main
122
+ - README.rdoc
123
+ require_paths:
124
+ - lib
125
+ required_ruby_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ hash: 3
131
+ segments:
132
+ - 0
133
+ version: "0"
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ hash: 3
140
+ segments:
141
+ - 0
142
+ version: "0"
143
+ requirements: []
144
+
145
+ rubyforge_project: pasteboard
146
+ rubygems_version: 1.6.2
147
+ signing_key:
148
+ specification_version: 3
149
+ summary: Pasteboard wraps the OS X system pasteboard
150
+ test_files:
151
+ - test/test_pasteboard.rb