clipboard 1.3.5 → 1.4.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.
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.