clipboard 1.3.5 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 892729b3fc00a3f989dfa1c3c5e1c05062b94a2f01af23a358d519a09b737f33
4
- data.tar.gz: 38f17ac7f06b2ff302b9498c3a3ad81bc2e7c9418f700f485569d8b8f15a18c9
3
+ metadata.gz: 36dbdb09b06bc41833ad82b692560179ea1dde1a061db1dfab093d6ddea64cb7
4
+ data.tar.gz: 2fc4772e208ee387887ba3558b4acfdc810132877664f59d30fe5605c0218c2e
5
5
  SHA512:
6
- metadata.gz: 5920c4e55b0322ac05a0df5c36e7d3c2dca41a31a481aab7ed3df6f838a10c0d4592910617c4e95b5878d5133d1b628b46cecef236118abecab608dc64b31827
7
- data.tar.gz: 4ff5e2aba0b87384d16941ed3b85ba61382c7e28bc3a07e922328e3a9faf8a23f0524b797d8a729fd34cbb11720d6271890b6d772597444793dc66dd9443ad27
6
+ metadata.gz: 73d188dcf4b8ce431da705feaa6cdf71889ab48679d584450cdf88e871f19fb0ff15b7c1d325ca65f104bdc4195c8bdbdfb01ff477e4fef8f2ab20a12ff8bd4f
7
+ data.tar.gz: c7d4e4c0e7ca463c4d3799bfbe7a15b1c1cb67aaca4fa1b84aacb9ea39794b8d64eb264d86ab773806049a1a5c6abe766c7ccb87211ebb4afb64fc7faf313259
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.4.0
4
+ * Add Wayland support via `wl-copy`, patch by @cramt
5
+ * Only silence clipboard warnings when $VERBOSE is nil
6
+
7
+ ## 1.3.6
8
+ * Fix Windows implementation (so it works on more recent Windows), patch by @P3t3rU5
9
+
3
10
  ## 1.3.5
4
11
  * Fix missing String#+@ method on Ruby <2.3, patch by @AaronC81
5
12
 
@@ -7,7 +14,6 @@
7
14
  * Don't break on Ruby 2.1, patch by @grosser
8
15
 
9
16
  ## 1.3.3
10
-
11
17
  * Fix Cygwin implementation to work when File constant is loaded, fix by @ntachino
12
18
 
13
19
  ## 1.3.2
data/MIT-LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010-2020 Jan Lelis
1
+ Copyright (c) 2010-2024 Jan Lelis
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
- # Clipboard Ruby Gem [![version](https://badge.fury.io/rb/clipboard.svg)](https://badge.fury.io/rb/clipboard) [<img src="https://travis-ci.org/janlelis/clipboard.svg" />](https://travis-ci.org/janlelis/clipboard)
1
+ # Clipboard Ruby Gem [![version](https://badge.fury.io/rb/clipboard.svg)](https://badge.fury.io/rb/clipboard) [![[ci]](https://github.com/janlelis/clipboard/workflows/Test/badge.svg)](https://github.com/janlelis/clipboard/actions?query=workflow%3ATest)
2
2
 
3
3
  Lets you access the clipboard from everywhere. Currently supported platforms:
4
4
 
5
- - Linux
5
+ - Linux (X11)
6
+ - Linux (Wayland)
6
7
  - MacOS
7
8
  - Windows
8
9
  - Cygwin (POSIX environment for Windows)
@@ -10,14 +11,14 @@ Lets you access the clipboard from everywhere. Currently supported platforms:
10
11
  - Gtk+ (Cross Platform Widget Toolkit)
11
12
  - Java (on JRuby)
12
13
 
13
- Supported Rubies: **2.7**, **2.6**, **2.5**
14
+ Supported Rubies: **3.3**, **3.2**, **3.1**, **3.0**
14
15
 
15
- Unsupported, but might still work: **2.4**, **2.3**, **2.2**, **2.1**, **2.0**
16
+ Unsupported, but might still work: **2.X**
16
17
 
17
18
  ## Usage
18
19
 
19
20
  * `Clipboard.copy` - Copies a string to system clipboard
20
- * `Clipboard.paste` - Paste contents from system clipboard as string
21
+ * `Clipboard.paste` - Paste text contents from system clipboard as string
21
22
  * `Clipboard.clear` - Empties the system clipboard
22
23
 
23
24
  ## Setup
@@ -29,7 +30,7 @@ gem "clipboard"
29
30
  gem "ffi", :platforms => [:mswin, :mingw] # Required by Clipboard on Windows
30
31
  ```
31
32
 
32
- - **Important note for Linux** users: The clipboard requires the *xsel* or the *xclip* command-line program. On debian and ubuntu, *xsel* can be installed with: `sudo apt-get install xsel`
33
+ - **Important note for Linux** users: The clipboard requires the *xsel* or the *xclip* command-line program (X11), or the *wl-copy* / *wl-paste* command-line programs (Wayland). On debian and ubuntu, *xsel* can be installed with: `sudo apt-get install xsel` and *wl-copy* / *wl-paste* with `sudo apt-get install wl-clipboard`.
33
34
 
34
35
  ## Clipboard Implementations
35
36
 
@@ -70,7 +71,7 @@ passing it as an argument. The default is *:clipboard*, other options are *:prim
70
71
 
71
72
  ### Windows: Encoding Info
72
73
 
73
- Windows uses [UTF-16LE](https://en.wikipedia.org/wiki/UTF-16) as its default encoding, so pasted strings will always come in UTF-16. You can then manually convert them to your desired encoding, for example, UTF-8, using the [String#encode](ruby-doc.org/core-2.3.0/String.html#method-i-encode) method:
74
+ Windows uses [UTF-16LE](https://en.wikipedia.org/wiki/UTF-16) as its default encoding, so pasted strings will always come in UTF-16. You can then manually convert them to your desired encoding, for example, UTF-8, using the [String#encode](https://rubyapi.org/o/string#method-i-encode) method:
74
75
 
75
76
  ```ruby
76
77
  Clipboard.paste.encode('UTF-8')
@@ -86,6 +87,14 @@ $ blip FILE_NAME
86
87
 
87
88
  Without any arguments, it will just paste the contents of the clipboard.
88
89
 
89
- ### MIT
90
+ ## Further Development
90
91
 
91
- Copyright (c) 2010-2020 Jan Lelis <https://janlelis.com> released under the MIT license. Contributions by and thanks to Michael Grosser and [all the other contributors!](https://github.com/janlelis/clipboard/graphs/contributors)
92
+ This is a list of nice-to-have features - feel free to open a PR or let me know if you want to work on one of these:
93
+
94
+ - Native support for clipboard on X11 or Wayland
95
+ - Support more platforms
96
+ - Support clipboard meta data
97
+
98
+ ## MIT
99
+
100
+ Copyright (c) 2010-2024 Jan Lelis <https://janlelis.com> released under the MIT license. Contributions by and thanks to [Michael Grosser and all the other contributors!](https://github.com/janlelis/clipboard/graphs/contributors)
data/clipboard.gemspec CHANGED
@@ -12,8 +12,9 @@ Gem::Specification.new do |s|
12
12
  s.description = "Access to the clipboard on Linux, MacOS, Windows, and Cygwin: Clipboard.copy, Clipboard.paste, Clipboard.clear"
13
13
  s.homepage = "https://github.com/janlelis/clipboard"
14
14
  s.license = "MIT"
15
+ s.metadata = { "rubygems_mfa_required" => "true" }
15
16
  s.requirements = [
16
- "Linux: You need xclip or xsel. On debian/ubuntu run: sudo apt-get install xsel",
17
+ "Linux: You need xclip / xsel (X11) or wl-clipboard (Wayland)",
17
18
  "Windows: You need the ffi gem",
18
19
  ]
19
20
  s.files = Dir.glob(%w[{lib,spec}/**/*.rb [A-Z]*.txt [A-Z]*.md]) + %w{clipboard.gemspec}
@@ -27,7 +27,8 @@ module Clipboard
27
27
  }.freeze
28
28
  else
29
29
  raise Clipboard::ClipboardLoadError, "clipboard: Could not find required program xclip or xsel\n" \
30
- "On debian/ubuntu, you can install it with: sudo apt-get install xsel"
30
+ "On debian/ubuntu, you can install it with: sudo apt-get install xsel\n" \
31
+ "If your system is Wayland-based, please install wl-clipboard"
31
32
  end
32
33
 
33
34
  def paste(which = nil)
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "utils"
4
+
5
+ module Clipboard
6
+ module LinuxWayland
7
+ extend self
8
+
9
+ WRITE_COMMAND = "wl-copy"
10
+ READ_COMMAND = "wl-paste"
11
+
12
+ if !Utils.executable_installed?(WRITE_COMMAND)
13
+ raise Clipboard::ClipboardLoadError, "clipboard: Could not find required program wl-copy\n" \
14
+ "Please install it or try a different implementation"
15
+ end
16
+
17
+ def paste(might_select_primary_clipboard = nil)
18
+ if might_select_primary_clipboard == "primary"
19
+ `#{READ_COMMAND} -p`
20
+ else
21
+ `#{READ_COMMAND}`
22
+ end
23
+ end
24
+
25
+ def copy(data)
26
+ Utils.popen WRITE_COMMAND, data
27
+ paste
28
+ end
29
+
30
+ def clear
31
+ `#{WRITE_COMMAND} -c`
32
+ end
33
+ end
34
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Clipboard
4
- VERSION = "1.3.5"
4
+ VERSION = "1.4.0"
5
5
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "utils"
3
+ require_relative 'utils'
4
4
 
5
5
  module Clipboard
6
6
  module Windows
@@ -19,14 +19,14 @@ module Clipboard
19
19
 
20
20
  module User32
21
21
  extend FFI::Library
22
- ffi_lib "user32"
22
+ ffi_lib 'user32'
23
23
  ffi_convention :stdcall
24
24
 
25
- attach_function :open, :OpenClipboard, [ :long ], :long
26
- attach_function :close, :CloseClipboard, [ ], :long
27
- attach_function :empty, :EmptyClipboard, [ ], :long
28
- attach_function :get, :GetClipboardData, [ :long ], :long
29
- attach_function :set, :SetClipboardData, [ :long, :long ], :long
25
+ attach_function :open, :OpenClipboard, [ :pointer ], :bool
26
+ attach_function :close, :CloseClipboard, [ ], :bool
27
+ attach_function :empty, :EmptyClipboard, [ ], :bool
28
+ attach_function :get, :GetClipboardData, [ :long ], :pointer
29
+ attach_function :set, :SetClipboardData, [ :long, :pointer ], :pointer
30
30
  end
31
31
 
32
32
  module Kernel32
@@ -34,53 +34,56 @@ module Clipboard
34
34
  ffi_lib 'kernel32'
35
35
  ffi_convention :stdcall
36
36
 
37
- attach_function :lock, :GlobalLock, [ :long ], :pointer
38
- attach_function :unlock, :GlobalUnlock, [ :long ], :long
39
- attach_function :size, :GlobalSize, [ :long ], :long
40
- attach_function :alloc, :GlobalAlloc, [ :long, :long ], :long
37
+ attach_function :lock, :GlobalLock, [ :pointer ], :pointer
38
+ attach_function :unlock, :GlobalUnlock, [ :pointer ], :bool
39
+ attach_function :size, :GlobalSize, [ :pointer ], :long
40
+ attach_function :alloc, :GlobalAlloc, [ :long, :long ], :pointer
41
41
  end
42
42
 
43
43
  # see http://www.codeproject.com/KB/clipboard/archerclipboard1.aspx
44
44
  def paste(_ = nil)
45
- data = "".dup
46
- if 0 != User32.open( 0 )
47
- hclip = User32.get( CF_UNICODETEXT )
48
- if hclip && 0 != hclip
49
- pointer_to_data = Kernel32.lock( hclip )
50
- # Windows Unicode is ended by two null bytes, so get the whole string
51
- size = Kernel32.size( hclip )
52
- data << pointer_to_data.get_bytes( 0, size - 2 )
53
- data.force_encoding("UTF-16LE")
54
- Kernel32.unlock( hclip )
55
- end
56
- User32.close( )
57
- end
58
- data
45
+ return String.new unless User32.open(nil)
46
+
47
+ hclip = User32.get( CF_UNICODETEXT )
48
+ return String.new if hclip.null?
49
+
50
+ pointer_to_data = Kernel32.lock( hclip )
51
+ # Windows Unicode is ended by two null bytes, so get the whole string
52
+ size = Kernel32.size( hclip )
53
+ data = pointer_to_data.read_string( size - 2 )
54
+ data.force_encoding(Encoding::UTF_16LE)
55
+ ensure
56
+ Kernel32.unlock(hclip) if hclip && !hclip.null?
57
+ User32.close
59
58
  end
60
59
 
61
60
  def clear
62
- if 0 != User32.open( 0 )
63
- User32.empty( )
64
- User32.close( )
65
- end
61
+ User32.empty if User32.open(nil)
66
62
  paste
63
+ ensure
64
+ User32.close
67
65
  end
68
66
 
69
67
  def copy(data_to_copy)
70
- if 0 != User32.open( 0 )
71
- User32.empty( )
72
- data = data_to_copy.encode("UTF-16LE") # TODO: catch bad encodings
68
+ if User32.open(nil)
69
+ User32.empty
70
+ data = data_to_copy.encode(Encoding::UTF_16LE) # TODO: catch bad encodings
73
71
  data << 0
74
72
  handler = Kernel32.alloc( GMEM_MOVEABLE, data.bytesize )
75
73
  pointer_to_data = Kernel32.lock( handler )
76
- pointer_to_data.put_bytes( 0, data, 0, data.bytesize )
77
- Kernel32.unlock( handler )
74
+ begin
75
+ pointer_to_data.write_string( data )
76
+ ensure
77
+ Kernel32.unlock( handler )
78
+ end
78
79
  User32.set( CF_UNICODETEXT, handler )
79
- User32.close( )
80
+ data.chop
80
81
  else # don't touch anything
81
82
  Utils.popen "clip", data_to_copy # depends on clip (available by default since Vista)
83
+ paste
82
84
  end
83
- paste
85
+ ensure
86
+ User32.close
84
87
  end
85
88
  end
86
89
  end
data/lib/clipboard.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rbconfig'
4
- require File.dirname(__FILE__) + '/clipboard/version'
4
+
5
+ require_relative 'clipboard/version'
6
+ require_relative 'clipboard/utils'
5
7
 
6
8
  module Clipboard
7
9
  extend self
@@ -10,12 +12,13 @@ module Clipboard
10
12
  end
11
13
 
12
14
  unless defined? Ocra # see gh#9
13
- autoload :Linux, 'clipboard/linux'
14
- autoload :Mac, 'clipboard/mac'
15
- autoload :Java, 'clipboard/java'
16
- autoload :Cygwin, 'clipboard/cygwin'
17
- autoload :Wsl, 'clipboard/wsl'
18
- autoload :Gtk, 'clipboard/gtk'
15
+ autoload :Linux, 'clipboard/linux'
16
+ autoload :LinuxWayland, 'clipboard/linux_wayland'
17
+ autoload :Mac, 'clipboard/mac'
18
+ autoload :Java, 'clipboard/java'
19
+ autoload :Cygwin, 'clipboard/cygwin'
20
+ autoload :Wsl, 'clipboard/wsl'
21
+ autoload :Gtk, 'clipboard/gtk'
19
22
  end
20
23
  autoload :Windows, 'clipboard/windows'
21
24
  autoload :File, 'clipboard/file'
@@ -29,20 +32,23 @@ module Clipboard
29
32
  when /mswin|mingw/ then :Windows
30
33
  when /cygwin/ then :Cygwin
31
34
  else
32
- raise ClipboardLoadError, "Your OS(#{ RbConfig::CONFIG['host_os'] }) is not supported, using file-based (fake) clipboard"
35
+ raise ClipboardLoadError, "Your OS(#{ RbConfig::CONFIG['host_os'] }) is not supported"
33
36
  end
34
37
 
35
- # Running additional check to detect if running in Microsoft WSL
38
+ # Running additional check to detect if running in Microsoft WSL or Wayland
36
39
  if os == :Linux
37
40
  require "etc"
38
41
  if Etc.respond_to?(:uname) && Etc.uname[:release] =~ /Microsoft/ # uname was added in ruby 2.2
39
42
  os = :Wsl
43
+ # Only choose Wayland implementation if wl-copy is found, since xclip / xsel *might* work
44
+ elsif ENV["XDG_SESSION_TYPE"] == "wayland" && Utils.executable_installed?("wl-copy")
45
+ os = :LinuxWayland
40
46
  end
41
47
  end
42
48
 
43
49
  @implementation = Clipboard.const_get(os)
44
50
  rescue ClipboardLoadError => e
45
- $stderr.puts e.message if $VERBOSE
51
+ $stderr.puts "#{e.message}\nUsing file-based (fake) clipboard" unless $VERBOSE == nil
46
52
  @implementation = Clipboard::File
47
53
  end
48
54
 
@@ -2,11 +2,13 @@
2
2
 
3
3
  require_relative "spec_helper"
4
4
 
5
+ require "fileutils"
6
+
5
7
  describe 'Clipboard::File' do
6
8
  before :all do
7
9
  Clipboard.implementation = Clipboard::File
8
10
  cache = Clipboard::File::FILE
9
- FileUtils.rm cache if File.exist?(cache)
11
+ FileUtils.rm_f cache
10
12
  end
11
13
 
12
14
  it "can paste with empty file" do
@@ -9,31 +9,37 @@ os_to_restore = RbConfig::CONFIG['host_os']
9
9
  describe Clipboard do
10
10
  before do
11
11
  RbConfig::CONFIG['host_os'] = os_to_restore
12
+ @is_windows = Clipboard.implementation.name == 'Clipboard::Windows'
12
13
  end
13
14
 
15
+ let(:expected) { ->(text) { @is_windows ? text.encode(Encoding::UTF_16LE) : text } }
16
+
14
17
  it "has a VERSION" do
15
18
  expect( Clipboard::VERSION ).to match /^\d+\.\d+\.\d+$/
16
19
  end
17
20
 
18
21
  it "can copy & paste" do
19
- Clipboard.copy("FOO\nBAR")
20
- expect( Clipboard.paste ).to eq "FOO\nBAR"
22
+ text = "FOO\nBAR"
23
+ Clipboard.copy(text)
24
+ expect( Clipboard.paste.bytes ).to eq expected.(text).bytes
21
25
  end
22
26
 
23
27
  it "can copy & paste with multibyte char" do
24
- Encoding.default_external = "utf-8"
25
- Clipboard.copy("日本語")
26
- expect( Clipboard.paste ).to eq "日本語"
28
+ Encoding.default_external = 'utf-8'
29
+ text = '日本語'
30
+ Clipboard.copy(text)
31
+ expect( Clipboard.paste ).to eq expected.(text)
27
32
  end
28
33
 
29
34
  it "returns data on copy" do
30
- expect( Clipboard.copy('xxx') ).to eq 'xxx'
35
+ text = 'xxx'
36
+ expect( Clipboard.copy(text) ).to eq expected.(text)
31
37
  end
32
38
 
33
39
  it "can clear" do
34
40
  Clipboard.copy('xxx')
35
41
  Clipboard.clear
36
- expect( Clipboard.paste ).to eq ''
42
+ expect( Clipboard.paste ).to eq expected.('')
37
43
  end
38
44
 
39
45
  describe "when included" do
@@ -43,10 +49,11 @@ describe Clipboard do
43
49
 
44
50
  it "can copy & paste & clear" do
45
51
  a = A.new
46
- expect( a.send(:copy, "XXX") ).to eq 'XXX'
47
- expect( a.send(:paste) ).to eq "XXX"
52
+ text = 'XXX'
53
+ expect( a.send(:copy, text) ).to eq expected.(text)
54
+ expect( a.send(:paste) ).to eq expected.(text)
48
55
  a.send(:clear)
49
- expect( a.send(:paste) ).to eq ''
56
+ expect( a.send(:paste) ).to eq expected.('')
50
57
  end
51
58
  end
52
59
 
@@ -56,23 +63,24 @@ describe Clipboard do
56
63
  data1 = Random.new.bytes(2**14).unpack("H*").first
57
64
  data2 = Clipboard.copy(data1)
58
65
 
59
- expect(data2).to eq data1
66
+ expect(data2).to eq expected.(data1)
60
67
 
61
68
  # second batch
62
69
  data1 = Random.new.bytes(2**14).unpack("H*").first
63
70
  data2 = Clipboard.copy(data1)
64
71
 
65
- expect(data2).to eq data1
72
+ expect(data2).to eq expected.(data1)
66
73
  end
67
74
 
68
75
  describe :implementation do
69
76
  before do
70
- $VERBOSE = true
77
+ $VERBOSE = false
71
78
  Clipboard.implementation = nil
72
79
  end
73
80
 
74
81
  it "does not warn on normal detection" do
75
- if system('which xclip >/dev/null 2>&1') || system('which xsel >/dev/null 2>&1')
82
+ if ( ENV["XDG_SESSION_TYPE"] != "wayland" && (system('which xclip >/dev/null 2>&1') || system('which xsel >/dev/null 2>&1') ) ) ||
83
+ ( ENV["XDG_SESSION_TYPE"] == "wayland" && system('which wl-copy >/dev/null 2>&1') )
76
84
  expect( $stderr ).not_to receive(:puts)
77
85
  end
78
86
  Clipboard.implementation
@@ -84,8 +92,8 @@ describe Clipboard do
84
92
  expect( Clipboard.implementation ).to eq Clipboard::File
85
93
  end
86
94
 
87
- it "does not warn when $VERBOSE is false" do
88
- $VERBOSE = false
95
+ it "does not warn when $VERBOSE is nil" do
96
+ $VERBOSE = nil
89
97
  RbConfig::CONFIG['host_os'] = 'Fooo OS'
90
98
  expect( $stderr ).not_to receive(:puts)
91
99
  Clipboard.implementation
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clipboard
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.5
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Lelis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-05 00:00:00.000000000 Z
11
+ date: 2024-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -57,6 +57,7 @@ files:
57
57
  - lib/clipboard/gtk.rb
58
58
  - lib/clipboard/java.rb
59
59
  - lib/clipboard/linux.rb
60
+ - lib/clipboard/linux_wayland.rb
60
61
  - lib/clipboard/mac.rb
61
62
  - lib/clipboard/utils.rb
62
63
  - lib/clipboard/version.rb
@@ -68,7 +69,8 @@ files:
68
69
  homepage: https://github.com/janlelis/clipboard
69
70
  licenses:
70
71
  - MIT
71
- metadata: {}
72
+ metadata:
73
+ rubygems_mfa_required: 'true'
72
74
  post_install_message:
73
75
  rdoc_options: []
74
76
  require_paths:
@@ -84,9 +86,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
86
  - !ruby/object:Gem::Version
85
87
  version: '0'
86
88
  requirements:
87
- - 'Linux: You need xclip or xsel. On debian/ubuntu run: sudo apt-get install xsel'
89
+ - 'Linux: You need xclip / xsel (X11) or wl-clipboard (Wayland)'
88
90
  - 'Windows: You need the ffi gem'
89
- rubygems_version: 3.1.2
91
+ rubygems_version: 3.5.3
90
92
  signing_key:
91
93
  specification_version: 4
92
94
  summary: Access to the clipboard on Linux, MacOS, Windows, and Cygwin.