tablesalt 0.23.2 → 0.23.3
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 32b2974935a587bd2189cf801e9525259500458aa4ca280a072146d9135ac16a
|
4
|
+
data.tar.gz: 16f152b1f455fa7ea0f98f1e132f5becba475b45884c683780e05660106ce36c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51d8b5e463199792b30de3c8c8aaea89a0588e838fb6c1b28d444dfae9e0d91df34be6266958bb4be63c40c60a29f571c6c59c76122577697a7e31bfa99a877b
|
7
|
+
data.tar.gz: d5ca1fa8ca4ad95a5df47b03fa31dc93cbfc9dc6ce2790d1c4aad97b4089afe0ddd6d3f924305062617fd5dffd20d800a9a29b3c9d3916008c035fd28fe1c1ab
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "active_support/core_ext/hash/keys"
|
4
|
+
|
5
|
+
# RSpec matcher to assert the definition of a thread accessor
|
6
|
+
#
|
7
|
+
# class MyClass
|
8
|
+
# include Tablesalt::ConfigDelegation
|
9
|
+
#
|
10
|
+
# thread_reader :a_thread_key
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# RSpec.describe MyClass do
|
14
|
+
# subject { described_class }
|
15
|
+
#
|
16
|
+
# it { is_expected.to define_thread_reader :a_thread_key, private: false }
|
17
|
+
# end
|
18
|
+
RSpec::Matchers.define :define_thread_reader do |method_name, thread_key, **options|
|
19
|
+
attr_reader :subject, :method_name, :thread_key, :private_opt
|
20
|
+
|
21
|
+
description { "defines#{a_private} thread reader #{method_name.inspect} with thread key #{thread_key.inspect}" }
|
22
|
+
|
23
|
+
failure_message { "expected #{subject_module} to define#{a_private} thread reader #{method_name.inspect} with thread key #{thread_key.inspect}" }
|
24
|
+
failure_message_when_negated { "expected #{subject_module} not to define#{a_private} thread reader #{method_name.inspect} with thread key #{thread_key.inspect}" }
|
25
|
+
|
26
|
+
match_unless_raises do |subject|
|
27
|
+
options.assert_valid_keys(:private)
|
28
|
+
|
29
|
+
@subject = subject
|
30
|
+
@method_name = method_name
|
31
|
+
@thread_key = thread_key.to_sym
|
32
|
+
@private_opt = options.fetch(:private, true)
|
33
|
+
|
34
|
+
with_value_on_thread do
|
35
|
+
expect(instance).to be_respond_to(method_name, true)
|
36
|
+
expect(klass).to be_respond_to(method_name, true)
|
37
|
+
|
38
|
+
expect(instance.__send__(method_name)).to eq stubbed_value
|
39
|
+
expect(klass.__send__(method_name)).to eq stubbed_value
|
40
|
+
|
41
|
+
if private_opt
|
42
|
+
expect { instance.public_send(method_name) }.to raise_error NoMethodError
|
43
|
+
expect { klass.public_send(method_name) }.to raise_error NoMethodError
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def with_value_on_thread
|
53
|
+
Thread.current[thread_key] = stubbed_value
|
54
|
+
|
55
|
+
yield
|
56
|
+
|
57
|
+
Thread.current[thread_key] = nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def subject_module
|
61
|
+
subject.is_a?(Module) ? subject : subject.class
|
62
|
+
end
|
63
|
+
|
64
|
+
def klass
|
65
|
+
@klass ||=
|
66
|
+
case subject
|
67
|
+
when Class
|
68
|
+
subject
|
69
|
+
when Module
|
70
|
+
Class.new(subject)
|
71
|
+
else
|
72
|
+
subject.class
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def instance
|
77
|
+
return subject unless subject.is_a?(Module)
|
78
|
+
|
79
|
+
@instance ||= begin
|
80
|
+
allow(klass).to receive(:initialize).with(any_args)
|
81
|
+
subject.new
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def stubbed_value
|
86
|
+
@stubbed_value ||= double("Thread value")
|
87
|
+
end
|
88
|
+
|
89
|
+
def a_private
|
90
|
+
return unless private_opt
|
91
|
+
|
92
|
+
" a private"
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tablesalt
|
4
|
+
module ThreadAccessor
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
private
|
9
|
+
|
10
|
+
# Defines an instance method and a singleton method to read from a given key in Thread.current
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# class SomeClass
|
14
|
+
# include Tablesalt::ThreadAccessor
|
15
|
+
#
|
16
|
+
# thread_reader :current_foo, :foo, private: false
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# Thread.current[:foo] = "bar"
|
20
|
+
# SomeClass.current_foo
|
21
|
+
# => "bar"
|
22
|
+
#
|
23
|
+
# SomeClass.new.current_foo
|
24
|
+
# => "bar"
|
25
|
+
#
|
26
|
+
# @param method [String, Symbol] The name of the reader method
|
27
|
+
# @param thread_key [String, Symbol] The key to read from Thread.current
|
28
|
+
# @option :private [Boolean] If true, both defined methods will be private. Default: true
|
29
|
+
def thread_reader(method, thread_key, **options)
|
30
|
+
define_method(method) { Thread.current[thread_key] }
|
31
|
+
define_singleton_method(method) { Thread.current[thread_key] }
|
32
|
+
|
33
|
+
return unless options.fetch(:private, true)
|
34
|
+
|
35
|
+
private method
|
36
|
+
private_class_method method
|
37
|
+
end
|
38
|
+
|
39
|
+
# Defines an instance method and a singleton method to write to a given key in Thread.current
|
40
|
+
#
|
41
|
+
# @example
|
42
|
+
# class SomeClass
|
43
|
+
# include Tablesalt::ThreadAccessor
|
44
|
+
#
|
45
|
+
# thread_writer :current_foo, :foo, private: false
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# SomeClass.current_foo = "bar"
|
49
|
+
#
|
50
|
+
# Thread.current[:foo]
|
51
|
+
# => "bar"
|
52
|
+
#
|
53
|
+
# @param method [String, Symbol] The name of the writer method
|
54
|
+
# @param thread_key [String, Symbol] The key to write to on Thread.current
|
55
|
+
# @option :private [Boolean] If true, both defined methods will be private. Default: true
|
56
|
+
def thread_writer(method, thread_key, **options)
|
57
|
+
method_name = "#{method}="
|
58
|
+
|
59
|
+
define_method(method_name) { |value| Thread.current[thread_key] = value }
|
60
|
+
define_singleton_method(method_name) { |value| Thread.current[thread_key] = value }
|
61
|
+
|
62
|
+
return unless options.fetch(:private, true)
|
63
|
+
|
64
|
+
private method_name
|
65
|
+
private_class_method method_name
|
66
|
+
end
|
67
|
+
|
68
|
+
# Defines instance methods and singleton methods to read/write a given key in Thread.current
|
69
|
+
#
|
70
|
+
# @example
|
71
|
+
# class SomeClass
|
72
|
+
# include Tablesalt::ThreadAccessor
|
73
|
+
#
|
74
|
+
# thread_accessor :current_foo, :foo, private: false
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# SomeClass.current_foo = "bar"
|
78
|
+
# SomeClass.current_foo
|
79
|
+
# => "bar"
|
80
|
+
#
|
81
|
+
# SomeClass.new.current_foo = "baz"
|
82
|
+
# SomeClass.new.current_foo
|
83
|
+
# => "baz"
|
84
|
+
#
|
85
|
+
# Thread.current[:foo]
|
86
|
+
# => "baz"
|
87
|
+
#
|
88
|
+
# @param method [String, Symbol] The name of the writer method
|
89
|
+
# @param thread_key [String, Symbol] The key to write to on Thread.current
|
90
|
+
# @option :private [Boolean] If true, all defined methods will be private. Default: true
|
91
|
+
def thread_accessor(method, thread_key, **options)
|
92
|
+
thread_reader(method, thread_key, **options)
|
93
|
+
thread_writer(method, thread_key, **options)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/tablesalt/version.rb
CHANGED
data/lib/tablesalt.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tablesalt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.23.
|
4
|
+
version: 0.23.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Minneti
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-03-
|
11
|
+
date: 2020-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -53,9 +53,11 @@ files:
|
|
53
53
|
- lib/tablesalt/dsl_accessor.rb
|
54
54
|
- lib/tablesalt/isolation.rb
|
55
55
|
- lib/tablesalt/rspec/custom_matchers.rb
|
56
|
+
- lib/tablesalt/rspec/custom_matchers/define_thread_reader.rb
|
56
57
|
- lib/tablesalt/rspec/custom_matchers/isolate.rb
|
57
58
|
- lib/tablesalt/spec_helper.rb
|
58
59
|
- lib/tablesalt/stringable_object.rb
|
60
|
+
- lib/tablesalt/thread_accessor.rb
|
59
61
|
- lib/tablesalt/uses_hash_for_equality.rb
|
60
62
|
- lib/tablesalt/version.rb
|
61
63
|
homepage: https://github.com/Freshly/spicerack/tree/master/tablesalt
|
@@ -65,7 +67,7 @@ metadata:
|
|
65
67
|
homepage_uri: https://github.com/Freshly/spicerack/tree/master/tablesalt
|
66
68
|
source_code_uri: https://github.com/Freshly/spicerack/tree/master/tablesalt
|
67
69
|
changelog_uri: https://github.com/Freshly/spicerack/blob/master/tablesalt/CHANGELOG.md
|
68
|
-
documentation_uri: https://www.rubydoc.info/gems/tablesalt/0.23.
|
70
|
+
documentation_uri: https://www.rubydoc.info/gems/tablesalt/0.23.3
|
69
71
|
post_install_message:
|
70
72
|
rdoc_options: []
|
71
73
|
require_paths:
|