pasteboard 1.0

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.
@@ -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