ruble 0.0.3.alpha
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gdbinit +21 -0
- data/.gitignore +18 -0
- data/.rubocop.yml +96 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +6 -0
- data/CMakeLists.txt +4 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +21 -0
- data/Gemfile.lock +98 -0
- data/LICENSE.txt +21 -0
- data/README.md +63 -0
- data/Rakefile +41 -0
- data/ext/ruble/.gitignore +5 -0
- data/ext/ruble/CMakeLists.txt +157 -0
- data/ext/ruble/RuBLEHelpers.cmake +240 -0
- data/ext/ruble/bindings/Adapter.cpp +193 -0
- data/ext/ruble/bindings/Adapter.hpp +85 -0
- data/ext/ruble/bindings/Characteristic.cpp +171 -0
- data/ext/ruble/bindings/Characteristic.hpp +132 -0
- data/ext/ruble/bindings/Descriptor.cpp +34 -0
- data/ext/ruble/bindings/Descriptor.hpp +69 -0
- data/ext/ruble/bindings/Peripheral.cpp +212 -0
- data/ext/ruble/bindings/Peripheral.hpp +108 -0
- data/ext/ruble/bindings/RuBLE.cpp +115 -0
- data/ext/ruble/bindings/Service.cpp +112 -0
- data/ext/ruble/bindings/Service.hpp +61 -0
- data/ext/ruble/bindings/common.hpp +48 -0
- data/ext/ruble/bindings/globals.cpp +43 -0
- data/ext/ruble/cmake.mk +62 -0
- data/ext/ruble/concerns/CharacteristicValueTracker.cpp +18 -0
- data/ext/ruble/concerns/CharacteristicValueTracker.hpp +40 -0
- data/ext/ruble/concerns/Rubyable.cpp +4 -0
- data/ext/ruble/concerns/Rubyable.hpp +46 -0
- data/ext/ruble/config.h.in +25 -0
- data/ext/ruble/containers/ByteArray.cpp +64 -0
- data/ext/ruble/containers/ByteArray.hpp +161 -0
- data/ext/ruble/containers/Callback.hpp +52 -0
- data/ext/ruble/containers/NamedBitSet.hpp +140 -0
- data/ext/ruble/containers/NamedBitSet.ipp +71 -0
- data/ext/ruble/extconf.rb +30 -0
- data/ext/ruble/management/Registry.cpp +63 -0
- data/ext/ruble/management/Registry.hpp +170 -0
- data/ext/ruble/management/RegistryFactory.hpp +113 -0
- data/ext/ruble/management/RubyQueue.cpp +152 -0
- data/ext/ruble/management/RubyQueue.hpp +69 -0
- data/ext/ruble/modularize.diff +28 -0
- data/ext/ruble/types/SimpleBLE.hpp +21 -0
- data/ext/ruble/types/declarations.hpp +91 -0
- data/ext/ruble/types/helpers.hpp +12 -0
- data/ext/ruble/types/ruby.hpp +36 -0
- data/ext/ruble/types/stl.hpp +41 -0
- data/ext/ruble/utils/RubyCallbackTraits.cpp +28 -0
- data/ext/ruble/utils/RubyCallbackTraits.hpp +48 -0
- data/ext/ruble/utils/async.cpp +10 -0
- data/ext/ruble/utils/async.hpp +76 -0
- data/ext/ruble/utils/containers.hpp +41 -0
- data/ext/ruble/utils/exception_handling.cpp +50 -0
- data/ext/ruble/utils/exception_handling.hpp +53 -0
- data/ext/ruble/utils/garbage_collection.cpp +82 -0
- data/ext/ruble/utils/garbage_collection.hpp +22 -0
- data/ext/ruble/utils/hash.cpp +83 -0
- data/ext/ruble/utils/hash.hpp +52 -0
- data/ext/ruble/utils/hexadecimal.hpp +116 -0
- data/ext/ruble/utils/human_type_names.hpp +38 -0
- data/ext/ruble/utils/inspection.cpp +24 -0
- data/ext/ruble/utils/inspection.hpp +108 -0
- data/ext/ruble/utils/ruby.hpp +103 -0
- data/ext/ruble/utils/ruby_context.hpp +73 -0
- data/lib/ruble/build/.rubocop.yml +19 -0
- data/lib/ruble/build/boost.rb +34 -0
- data/lib/ruble/build/cmake.rb +134 -0
- data/lib/ruble/build/core_ext.rb +5 -0
- data/lib/ruble/build/data/bundler.rb +24 -0
- data/lib/ruble/build/data/extension.rb +101 -0
- data/lib/ruble/build/data/os.rb +21 -0
- data/lib/ruble/build/data/rice.rb +24 -0
- data/lib/ruble/build/data.rb +22 -0
- data/lib/ruble/build/extconf.rb +76 -0
- data/lib/ruble/build/github_repo.rb +129 -0
- data/lib/ruble/build/simpleble.rb +56 -0
- data/lib/ruble/build.rb +28 -0
- data/lib/ruble/version.rb +7 -0
- data/lib/ruble.rb +46 -0
- data/lib/tasks/dev/dev_tasks.rb +130 -0
- data/lib/tasks/dev/pager.rb +218 -0
- data/lib/tasks/dev/paths.rb +30 -0
- data/lib/tasks/dev/state_hash.rb +65 -0
- data/lib/tasks/dev.rake +41 -0
- data/lib/tasks/simpleble.rake +29 -0
- data/sig/rubble.rbs +4 -0
- metadata +263 -0
@@ -0,0 +1,218 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'openssl'
|
4
|
+
require 'shellwords'
|
5
|
+
require 'pathname'
|
6
|
+
require 'concurrent-ruby'
|
7
|
+
|
8
|
+
Thread.report_on_exception = true
|
9
|
+
|
10
|
+
class Pager
|
11
|
+
# INSTANCE_LOCK = Mutex.new
|
12
|
+
LOCK_LOCAL = Concurrent::ThreadLocalVar.new
|
13
|
+
private_constant :LOCK_LOCAL
|
14
|
+
#noinspection RubyArgCount
|
15
|
+
INSTANCE_USE_COUNT = Concurrent::Semaphore.new(1)
|
16
|
+
CMD = %W[less -FXeR]
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def reset_fds!
|
20
|
+
STDERR.reopen REAL_STDERR
|
21
|
+
STDOUT.reopen REAL_STDOUT
|
22
|
+
end
|
23
|
+
|
24
|
+
def atom
|
25
|
+
@atom ||= Concurrent::AtomicReference.new
|
26
|
+
end
|
27
|
+
|
28
|
+
private :new
|
29
|
+
def instance
|
30
|
+
return atom.get if atom.get
|
31
|
+
|
32
|
+
atom.update do |current|
|
33
|
+
next current if current
|
34
|
+
|
35
|
+
@instance = new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def reset = atom.update { false }
|
40
|
+
end
|
41
|
+
|
42
|
+
attr_reader *%i[cmdline pid status started_at finished_at duration waiter _lock]
|
43
|
+
|
44
|
+
# def set_as_singleton_instance!(...) =
|
45
|
+
# def unset_as_singleton_instance!(...) = @lock.unlock!(...)
|
46
|
+
|
47
|
+
def initialize
|
48
|
+
# @lock = Concurrent::ReentrantReadWriteLock.new
|
49
|
+
@mtx = Mutex.new
|
50
|
+
# @guard = LockGuard.new
|
51
|
+
# @_lock = Concurrent::ReentrantReadWriteLock.new
|
52
|
+
# @guards = Concurrent::ThreadLocalVar.new
|
53
|
+
@cmdline = CMD.shelljoin.freeze
|
54
|
+
@status = nil
|
55
|
+
end
|
56
|
+
|
57
|
+
# def guard
|
58
|
+
# @guard
|
59
|
+
# # @guards.value ||= LockGuard.new(@_lock, type: :write)
|
60
|
+
# end
|
61
|
+
|
62
|
+
# def lock
|
63
|
+
# LOCK_LOCAL.value ||= LockGuard.new(INSTANCE_LOCK)
|
64
|
+
# end
|
65
|
+
def io = @in
|
66
|
+
def started? = !!started_at
|
67
|
+
def finished? = !!finished_at
|
68
|
+
def alive? = pid && Process.kill(0, pid)
|
69
|
+
def status? = !!status
|
70
|
+
|
71
|
+
def start
|
72
|
+
return
|
73
|
+
raise "Pager already stopped. You need to create a new instance" if finished?
|
74
|
+
return self if @waiter
|
75
|
+
|
76
|
+
@mtx.synchronize do
|
77
|
+
return self if @waiter
|
78
|
+
|
79
|
+
@out, @in = IO.pipe
|
80
|
+
[@out, @in].each { _1.sync = true }
|
81
|
+
@waiter ||= Thread.new { _pager! }
|
82
|
+
end
|
83
|
+
self
|
84
|
+
end
|
85
|
+
|
86
|
+
def wait!
|
87
|
+
return status if status?
|
88
|
+
raise "Pager is not running. Nothing to wait for." unless @waiter
|
89
|
+
|
90
|
+
@waiter.join
|
91
|
+
status
|
92
|
+
end
|
93
|
+
|
94
|
+
def close!(ignore_repeats: false)
|
95
|
+
# lck = guard.lock(ignore_repeats: ignore_repeats)
|
96
|
+
@mtx.synchronize do
|
97
|
+
self.class.reset_fds!
|
98
|
+
io&.close unless io&.closed?
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# def stop!(wait: true)
|
103
|
+
# close!
|
104
|
+
# Process.kill(:SIGTERM, pid) if alive? # TODO: kill if we don't shutdown cleanly?
|
105
|
+
# wait! if wait
|
106
|
+
# end
|
107
|
+
|
108
|
+
def use(&block)
|
109
|
+
start
|
110
|
+
@mtx.synchronize(&block)
|
111
|
+
rescue
|
112
|
+
# stop!
|
113
|
+
raise
|
114
|
+
end
|
115
|
+
|
116
|
+
def eval_paginated(&block)
|
117
|
+
use do
|
118
|
+
@real_stdout = STDOUT.dup
|
119
|
+
@real_stderr = STDERR.dup
|
120
|
+
STDOUT.reopen io
|
121
|
+
STDERR.reopen io
|
122
|
+
block.yield self
|
123
|
+
ensure
|
124
|
+
STDOUT.reopen @real_stdout
|
125
|
+
STDERR.reopen @real_stderr
|
126
|
+
self.class.reset_fds!
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
#noinspection RbsMissingTypeSignature
|
131
|
+
def exec_unpaginated!(cmdargs, *args, chdir: ROOT_PATH, allow_fail: false, env: {}, **kwargs)
|
132
|
+
status = nil
|
133
|
+
out = String.new
|
134
|
+
err = String.new
|
135
|
+
rout, wout = IO.pipe
|
136
|
+
rerr, werr = IO.pipe
|
137
|
+
Bundler.with_unbundled_env do
|
138
|
+
cmd = cmdargs.is_a?(Array) ? cmdargs.shelljoin : cmdargs
|
139
|
+
puts "Running: #{cmd} in directory #{chdir}"
|
140
|
+
pid = Process.spawn(env, cmd, *args, **kwargs, chdir: chdir.to_s, in: File.open(OS.dev_null, 'wt'), out: wout, err: werr)
|
141
|
+
[wout, werr].each(&:close)
|
142
|
+
result = nil
|
143
|
+
open_ios = [rout, rerr]
|
144
|
+
close_io = ->(io) { io.close unless io.closed?; open_ios.delete(io) }
|
145
|
+
|
146
|
+
until (result ||= Process.wait2(pid, Process::WNOHANG)) || open_ios.empty?
|
147
|
+
rd_io, _, err_io = IO.select(open_ios, [], open_ios, 5)
|
148
|
+
err_io&.each { |io| close_io[io] }
|
149
|
+
rd_io&.each do |io|
|
150
|
+
next close_io[io] if io.eof? || io.closed?
|
151
|
+
|
152
|
+
buf = io == rout ? out : err
|
153
|
+
buf << io.read_nonblock(8192)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
open_ios.each do |io|
|
158
|
+
buf = io == rout ? out : err
|
159
|
+
until io.closed? || io.eof?
|
160
|
+
buf << io.read_nonblock(8192)
|
161
|
+
end
|
162
|
+
io.close unless io.closed?
|
163
|
+
end
|
164
|
+
|
165
|
+
result ||= Process.wait2(pid)
|
166
|
+
_, status = result
|
167
|
+
|
168
|
+
unless status.success? && !allow_fail
|
169
|
+
STDERR.puts "Execution of #{cmd.inspect} failed with code #{status.inspect}.\n"\
|
170
|
+
"Output:\n#{out}\nError:\n#{err}"
|
171
|
+
exit(status.exitstatus.to_i)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
[status, out, err]
|
175
|
+
end
|
176
|
+
|
177
|
+
#noinspection RbsMissingTypeSignature
|
178
|
+
def exec_paginated!(cmdargs, *args, chdir: ROOT_PATH, env: {}, **kwargs)
|
179
|
+
status = nil
|
180
|
+
use do
|
181
|
+
Bundler.with_unbundled_env do
|
182
|
+
cmd = cmdargs.is_a?(Array) ? cmdargs.shelljoin : cmdargs
|
183
|
+
puts "Running: #{cmd} in directory #{chdir}"
|
184
|
+
pid = Process.spawn(env, cmd, *args, **kwargs, chdir: chdir.to_s)
|
185
|
+
_, status = Process.wait2(pid)
|
186
|
+
|
187
|
+
unless status.success?
|
188
|
+
STDERR.puts "Execution of #{cmd.inspect} failed with code #{status.inspect}"
|
189
|
+
exit(status.exitstatus.to_i)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
status
|
194
|
+
end
|
195
|
+
|
196
|
+
private
|
197
|
+
def _pager!
|
198
|
+
Thread.current.abort_on_exception = true
|
199
|
+
Thread.current.report_on_exception = true
|
200
|
+
|
201
|
+
@pid = Process.fork
|
202
|
+
|
203
|
+
unless @pid
|
204
|
+
@in.close
|
205
|
+
STDIN.reopen(@out)
|
206
|
+
Process.exec(cmdline)
|
207
|
+
end
|
208
|
+
|
209
|
+
@out.close
|
210
|
+
@started_at ||= Time.now
|
211
|
+
at_exit { wait! }
|
212
|
+
_, @status = Process.wait2(@pid)
|
213
|
+
|
214
|
+
@finished_at = Time.now
|
215
|
+
@duration = @finished_at - @started_at
|
216
|
+
status
|
217
|
+
end
|
218
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require 'rbconfig'
|
5
|
+
require_relative '../../ruble/build'
|
6
|
+
|
7
|
+
module Paths
|
8
|
+
class << self
|
9
|
+
include RuBLE::Build::Data::Extension
|
10
|
+
end
|
11
|
+
|
12
|
+
GEM_NAME = Paths.gem_name
|
13
|
+
EXTENSION_NAME = GEM_NAME.downcase
|
14
|
+
ROOT_DIR = Paths.gem_full_path.cleanpath(false)
|
15
|
+
TMP_DIR = ROOT_DIR / 'tmp'
|
16
|
+
EXT_DIR = ROOT_DIR / 'ext' / EXTENSION_NAME
|
17
|
+
TEST_DIR = ROOT_DIR / 'test'
|
18
|
+
LIB_DIR = ROOT_DIR / 'lib' / GEM_NAME.downcase
|
19
|
+
LIB_FILE = LIB_DIR / "#{EXTENSION_NAME}.so"
|
20
|
+
BUILD_LIBS_DIR = LIB_DIR / 'build'
|
21
|
+
BUILD_DIR = TMP_DIR / RbConfig::MAKEFILE_CONFIG['arch'] /
|
22
|
+
EXTENSION_NAME / RbConfig::CONFIG['RUBY_PROGRAM_VERSION']
|
23
|
+
EXT_DIR_FROM_BUILD_DIR = EXT_DIR.relative_path_from(BUILD_DIR)
|
24
|
+
BUILD_INFO_FILE = BUILD_DIR / 'build-config.cmake'
|
25
|
+
NINJA_FILE = BUILD_DIR / 'build.ninja'
|
26
|
+
HASH_FILE = BUILD_DIR / '.state_hash'
|
27
|
+
SRC_GLOB = '{**/,}*.{{h,c}{,pp},ipp}'
|
28
|
+
OBJFILES_DIR = BUILD_DIR / 'CMakeFiles' / "#{EXTENSION_NAME}.dir"
|
29
|
+
CMAKE_CXX_COMPILER = '/usr/bin/g++-13'
|
30
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require_relative 'paths'
|
3
|
+
|
4
|
+
module StateHash
|
5
|
+
READ_BUFFER_SIZE = 8192
|
6
|
+
|
7
|
+
def hash_file(path, digest: 'SHA256')
|
8
|
+
hasher = OpenSSL::Digest.new(digest.to_s)
|
9
|
+
File.open(path.to_s, 'rb') do |f|
|
10
|
+
hasher << f.readpartial(READ_BUFFER_SIZE) until f.eof?
|
11
|
+
end
|
12
|
+
hasher.hexdigest
|
13
|
+
rescue RefError # TODO: catch file not found errors (this is placeholder)
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def watched_files = [
|
18
|
+
*basic_gem_files,
|
19
|
+
*build_libs_files,
|
20
|
+
*cmake_files,
|
21
|
+
*build_output_files,
|
22
|
+
# TODO(?): Include lib/tasks/dev/*.rb
|
23
|
+
].select(&:file?)
|
24
|
+
|
25
|
+
def watched_file_hashes = watched_files.to_h do
|
26
|
+
[_1, hash_file(_1)]
|
27
|
+
end
|
28
|
+
|
29
|
+
def state_hash
|
30
|
+
fields = [
|
31
|
+
watched_file_hashes
|
32
|
+
]
|
33
|
+
|
34
|
+
JSON.pretty_generate(fields)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def basic_gem_files = [
|
40
|
+
Paths::ROOT_DIR / '.ruby-version',
|
41
|
+
Paths::ROOT_DIR / 'Gemfile',
|
42
|
+
Paths::ROOT_DIR / 'Gemfile.lock',
|
43
|
+
*Paths::ROOT_DIR.glob('*.gemspec'),
|
44
|
+
Paths::ROOT_DIR / 'Rakefile',
|
45
|
+
]
|
46
|
+
|
47
|
+
def build_libs_files = [
|
48
|
+
Paths::BUILD_LIBS_DIR.sub_ext('.rb'),
|
49
|
+
*Paths::BUILD_LIBS_DIR.glob('*.rb'),
|
50
|
+
*Paths::BUILD_LIBS_DIR.glob('**/*.rb')
|
51
|
+
]
|
52
|
+
|
53
|
+
def cmake_files = [
|
54
|
+
Paths::EXT_DIR / 'extconf.rb',
|
55
|
+
Paths::EXT_DIR / 'CMakeLists.txt',
|
56
|
+
*Paths::EXT_DIR.glob('*.cmake'),
|
57
|
+
]
|
58
|
+
|
59
|
+
def build_output_files = [
|
60
|
+
Paths::BUILD_INFO_FILE,
|
61
|
+
Paths::NINJA_FILE,
|
62
|
+
Paths::BUILD_DIR / 'CMakeCache.txt',
|
63
|
+
Paths::BUILD_DIR / 'config.h',
|
64
|
+
]
|
65
|
+
end
|
data/lib/tasks/dev.rake
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
namespace :dev do
|
2
|
+
task :initialize, %i[flags] do |task, args|
|
3
|
+
# Bundler.require
|
4
|
+
Bundler.setup
|
5
|
+
require_relative './dev/dev_tasks'
|
6
|
+
flags = (args.flags || '').split(/,\s*/).each(&:strip!).reject(&:empty?).map(&:to_sym).to_set
|
7
|
+
@devTasks = DevTasks.new(*flags)
|
8
|
+
end
|
9
|
+
desc 'Cleans/Clobbers all generated files'
|
10
|
+
task :pristine, %i[flags] do |task, args|
|
11
|
+
Rake::Task['dev:initialize'].invoke(args.flags)
|
12
|
+
@devTasks.pristine!
|
13
|
+
end
|
14
|
+
|
15
|
+
desc 'Cleans/Clobbers, generates Makefiles/etc before build'
|
16
|
+
task :reconfigure, %i[flags] do |task, args|
|
17
|
+
Rake::Task['dev:initialize'].invoke(args.flags)
|
18
|
+
@devTasks.reconfigure!
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Reconfigures only if needed'
|
22
|
+
task :maybe_reconfigure, %i[flags] do |task, args|
|
23
|
+
Rake::Task['dev:initialize'].invoke(args.flags)
|
24
|
+
@devTasks.maybe_reconfigure!
|
25
|
+
end
|
26
|
+
|
27
|
+
desc 'Compiles code for debugging'
|
28
|
+
task :build, %i[flags] do |task, args|
|
29
|
+
Rake::Task['dev:initialize'].invoke(args.flags)
|
30
|
+
@devTasks.build!
|
31
|
+
end
|
32
|
+
|
33
|
+
desc 'Audit missing symbols in built object files'
|
34
|
+
task :audit_objfile_symbols, %i[flags] do |task, args|
|
35
|
+
Rake::Task['dev:initialize'].invoke(args.flags)
|
36
|
+
@devTasks.audit_objfile_symbols!
|
37
|
+
end
|
38
|
+
end
|
39
|
+
task(:dev, %i[flags]) { |task, args| Rake::Task['dev:build'].invoke(args.flags) }
|
40
|
+
|
41
|
+
task audit_objfile_symbols: %i[dev:audit_objfile_symbols]
|
@@ -0,0 +1,29 @@
|
|
1
|
+
desc 'Fetch SimpleBLE release'
|
2
|
+
namespace :SimpleBLE do
|
3
|
+
task :initialize, %i[release] do |task, args|
|
4
|
+
opts = { tag: args.release }.compact
|
5
|
+
|
6
|
+
require_relative '../ruble/build/simpleble'
|
7
|
+
@simpleble = SimpleBLE.new(**opts)
|
8
|
+
end
|
9
|
+
|
10
|
+
task info: %i[initialize] do
|
11
|
+
pp @assets = @simpleble.assets
|
12
|
+
pp @asset = @simpleble.matching_asset
|
13
|
+
pp @url = @simpleble.download_url
|
14
|
+
pp @hash = @simpleble.download_md5_checksum
|
15
|
+
end
|
16
|
+
|
17
|
+
task download: %i[initialize] do
|
18
|
+
@simpleble.download!
|
19
|
+
end
|
20
|
+
|
21
|
+
task extract: %i[download] do
|
22
|
+
@simpleble.extract!
|
23
|
+
end
|
24
|
+
|
25
|
+
task install: %i[extract] do
|
26
|
+
@simpleble.install!
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
data/sig/rubble.rbs
ADDED
metadata
ADDED
@@ -0,0 +1,263 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruble
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3.alpha
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mike Vastola
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-11-11 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: zeitwerk
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.6.12
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.6.12
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rice
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.1'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '4.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: concurrent-ruby
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.2.2
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.2.2
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: faraday
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.7.11
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.7.11
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: faraday-follow_redirects
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.3.0
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.3.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: faraday-retry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.2.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.2.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: memery
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.5'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.5'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: os
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.1'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.1'
|
125
|
+
description: RuBLE is a ruby interface to the SimpleBLE library, providing a cross-platform
|
126
|
+
DSL for interacting with Bluetooth Low Energy (BLE) devices.
|
127
|
+
email:
|
128
|
+
- Mike@Vasto.la
|
129
|
+
executables: []
|
130
|
+
extensions:
|
131
|
+
- ext/ruble/extconf.rb
|
132
|
+
extra_rdoc_files:
|
133
|
+
- "./CHANGELOG.md"
|
134
|
+
- "./CODE_OF_CONDUCT.md"
|
135
|
+
- "./README.md"
|
136
|
+
files:
|
137
|
+
- "./CHANGELOG.md"
|
138
|
+
- "./CODE_OF_CONDUCT.md"
|
139
|
+
- "./README.md"
|
140
|
+
- ".gdbinit"
|
141
|
+
- ".gitignore"
|
142
|
+
- ".rubocop.yml"
|
143
|
+
- ".ruby-version"
|
144
|
+
- CHANGELOG.md
|
145
|
+
- CMakeLists.txt
|
146
|
+
- CODE_OF_CONDUCT.md
|
147
|
+
- Gemfile
|
148
|
+
- Gemfile.lock
|
149
|
+
- LICENSE.txt
|
150
|
+
- README.md
|
151
|
+
- Rakefile
|
152
|
+
- ext/ruble/.gitignore
|
153
|
+
- ext/ruble/CMakeLists.txt
|
154
|
+
- ext/ruble/RuBLEHelpers.cmake
|
155
|
+
- ext/ruble/bindings/Adapter.cpp
|
156
|
+
- ext/ruble/bindings/Adapter.hpp
|
157
|
+
- ext/ruble/bindings/Characteristic.cpp
|
158
|
+
- ext/ruble/bindings/Characteristic.hpp
|
159
|
+
- ext/ruble/bindings/Descriptor.cpp
|
160
|
+
- ext/ruble/bindings/Descriptor.hpp
|
161
|
+
- ext/ruble/bindings/Peripheral.cpp
|
162
|
+
- ext/ruble/bindings/Peripheral.hpp
|
163
|
+
- ext/ruble/bindings/RuBLE.cpp
|
164
|
+
- ext/ruble/bindings/Service.cpp
|
165
|
+
- ext/ruble/bindings/Service.hpp
|
166
|
+
- ext/ruble/bindings/common.hpp
|
167
|
+
- ext/ruble/bindings/globals.cpp
|
168
|
+
- ext/ruble/cmake.mk
|
169
|
+
- ext/ruble/concerns/CharacteristicValueTracker.cpp
|
170
|
+
- ext/ruble/concerns/CharacteristicValueTracker.hpp
|
171
|
+
- ext/ruble/concerns/Rubyable.cpp
|
172
|
+
- ext/ruble/concerns/Rubyable.hpp
|
173
|
+
- ext/ruble/config.h.in
|
174
|
+
- ext/ruble/containers/ByteArray.cpp
|
175
|
+
- ext/ruble/containers/ByteArray.hpp
|
176
|
+
- ext/ruble/containers/Callback.hpp
|
177
|
+
- ext/ruble/containers/NamedBitSet.hpp
|
178
|
+
- ext/ruble/containers/NamedBitSet.ipp
|
179
|
+
- ext/ruble/extconf.rb
|
180
|
+
- ext/ruble/management/Registry.cpp
|
181
|
+
- ext/ruble/management/Registry.hpp
|
182
|
+
- ext/ruble/management/RegistryFactory.hpp
|
183
|
+
- ext/ruble/management/RubyQueue.cpp
|
184
|
+
- ext/ruble/management/RubyQueue.hpp
|
185
|
+
- ext/ruble/modularize.diff
|
186
|
+
- ext/ruble/types/SimpleBLE.hpp
|
187
|
+
- ext/ruble/types/declarations.hpp
|
188
|
+
- ext/ruble/types/helpers.hpp
|
189
|
+
- ext/ruble/types/ruby.hpp
|
190
|
+
- ext/ruble/types/stl.hpp
|
191
|
+
- ext/ruble/utils/RubyCallbackTraits.cpp
|
192
|
+
- ext/ruble/utils/RubyCallbackTraits.hpp
|
193
|
+
- ext/ruble/utils/async.cpp
|
194
|
+
- ext/ruble/utils/async.hpp
|
195
|
+
- ext/ruble/utils/containers.hpp
|
196
|
+
- ext/ruble/utils/exception_handling.cpp
|
197
|
+
- ext/ruble/utils/exception_handling.hpp
|
198
|
+
- ext/ruble/utils/garbage_collection.cpp
|
199
|
+
- ext/ruble/utils/garbage_collection.hpp
|
200
|
+
- ext/ruble/utils/hash.cpp
|
201
|
+
- ext/ruble/utils/hash.hpp
|
202
|
+
- ext/ruble/utils/hexadecimal.hpp
|
203
|
+
- ext/ruble/utils/human_type_names.hpp
|
204
|
+
- ext/ruble/utils/inspection.cpp
|
205
|
+
- ext/ruble/utils/inspection.hpp
|
206
|
+
- ext/ruble/utils/ruby.hpp
|
207
|
+
- ext/ruble/utils/ruby_context.hpp
|
208
|
+
- lib/ruble.rb
|
209
|
+
- lib/ruble/build.rb
|
210
|
+
- lib/ruble/build/.rubocop.yml
|
211
|
+
- lib/ruble/build/boost.rb
|
212
|
+
- lib/ruble/build/cmake.rb
|
213
|
+
- lib/ruble/build/core_ext.rb
|
214
|
+
- lib/ruble/build/data.rb
|
215
|
+
- lib/ruble/build/data/bundler.rb
|
216
|
+
- lib/ruble/build/data/extension.rb
|
217
|
+
- lib/ruble/build/data/os.rb
|
218
|
+
- lib/ruble/build/data/rice.rb
|
219
|
+
- lib/ruble/build/extconf.rb
|
220
|
+
- lib/ruble/build/github_repo.rb
|
221
|
+
- lib/ruble/build/simpleble.rb
|
222
|
+
- lib/ruble/version.rb
|
223
|
+
- lib/tasks/dev.rake
|
224
|
+
- lib/tasks/dev/dev_tasks.rb
|
225
|
+
- lib/tasks/dev/pager.rb
|
226
|
+
- lib/tasks/dev/paths.rb
|
227
|
+
- lib/tasks/dev/state_hash.rb
|
228
|
+
- lib/tasks/simpleble.rake
|
229
|
+
- sig/rubble.rbs
|
230
|
+
homepage: https://github.com/mvastola/RuBLE
|
231
|
+
licenses:
|
232
|
+
- MIT
|
233
|
+
metadata:
|
234
|
+
homepage_uri: https://github.com/mvastola/RuBLE
|
235
|
+
bug_tracker_uri: https://github.com/mvastola/RuBLE/issues
|
236
|
+
source_code_uri: https://github.com/mvastola/RuBLE
|
237
|
+
changelog_uri: https://github.com/mvastola/RuBLE/blob/master/CHANGELOG.md
|
238
|
+
documentation_uri: https://rubydoc.info/gems/RuBLE
|
239
|
+
rubygems_mfa_required: 'true'
|
240
|
+
boost_library_release_tag: boost-1.83.0
|
241
|
+
simpleble_library_release_tag: v0.6.1
|
242
|
+
post_install_message:
|
243
|
+
rdoc_options: []
|
244
|
+
require_paths:
|
245
|
+
- lib
|
246
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: 3.2.0
|
251
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
252
|
+
requirements:
|
253
|
+
- - ">"
|
254
|
+
- !ruby/object:Gem::Version
|
255
|
+
version: 1.3.1
|
256
|
+
requirements:
|
257
|
+
- C++ compiler supporting standard c++23 (e.g. g++-13)
|
258
|
+
- CMake version 3.25.1 or higher
|
259
|
+
rubygems_version: 3.4.21
|
260
|
+
signing_key:
|
261
|
+
specification_version: 4
|
262
|
+
summary: Ru(by Simple)BLE library
|
263
|
+
test_files: []
|