provider_kit 0.2.0 → 0.2.1

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: ba514d53e0d9f91bec62dbe6ff0687b73038ae223a19f266a6a11321fda19b54
4
- data.tar.gz: 33ab21762119c6ca00ce6951fde0bedd45f6c9e719c4b175478592df47c7aadf
3
+ metadata.gz: da3e02d32cafa95d8718676ae02a14be2e79d520b90bee3e10f3b3738b75c507
4
+ data.tar.gz: 2276650b63b069e3ba4890f171925d903cbe603776355bb6a285194da69a3a83
5
5
  SHA512:
6
- metadata.gz: e16ff38a23a7cb98796299f1259f009d94fb5ae2b28cf6db850e38b3f58f6a0ab89eec170d25a1b537569842497694ba74fb0fd660d91df609fc3b573c578675
7
- data.tar.gz: 00ed090c391619a04d47dc39ca56d42f9bbdef1742bfa4ced62e009624508224b71e7677f4cac17a1c33e9c16b36e544c1c75b6ad07d35d1610b0b92ce80d678
6
+ metadata.gz: 1dde2f369723133094c1a28c6220713808a459f94d02f1d39ae681327e57e7cc7b86ad54234e0d09cbc24e9a262f0d729efa051f41b7a2550e489d6b35c6089e
7
+ data.tar.gz: '0204738efbe20bfa85e55f8ea9a4c48dd145836b822f2c53a047f053b969599486a49c8ce3c2b5f78ab7df905f8461d1e2728858d1da1b25c3326e1e6d025086'
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProviderKit
4
+ # serialized attribute for provider
5
+ module Attribute
6
+
7
+ extend ActiveSupport::Concern
8
+
9
+ def provider
10
+ if provider_key.present?
11
+ @provider ||= ProviderKit::ProviderAttribute.new(provider_key, record: self)
12
+ end
13
+ end
14
+
15
+ def provider=(value)
16
+ @provider = nil
17
+
18
+ write_attribute(:provider, value.to_s.presence)
19
+ end
20
+
21
+ def provider_key
22
+ read_attribute(:provider).to_s.presence
23
+ end
24
+
25
+ end
26
+ end
@@ -26,6 +26,15 @@ module ProviderKit
26
26
  end
27
27
  end
28
28
 
29
+ def respond_to_missing?(method_name, include_private = false)
30
+ if method_name.to_s.match?(/(.+)\?$/)
31
+ attribute_name = method_name.to_s.chomp("?")
32
+ return callable?(attribute_name)
33
+ end
34
+
35
+ callable?(method_name) || super
36
+ end
37
+
29
38
  def with_context(provider: @provider, **context)
30
39
  Capability.new(
31
40
  key,
@@ -42,8 +51,12 @@ module ProviderKit
42
51
 
43
52
  def call(method_name, *args, **kwargs)
44
53
  call_target = target
45
- return nil unless call_target
46
- return nil unless callable?(method_name)
54
+ return unless call_target
55
+
56
+ unless callable?(method_name)
57
+ raise NoMethodError,
58
+ "undefined method `#{ method_name }' for instance of #{ @target_klass }"
59
+ end
47
60
 
48
61
  raw_response = call_target.public_send(method_name, *args, **kwargs)
49
62
 
@@ -41,6 +41,13 @@ module ProviderKit
41
41
  end
42
42
  end
43
43
 
44
+ # Null provider is a placeholder for integrations that do not need a custom provider
45
+ #
46
+ # returns true if this is the null provider
47
+ def null?
48
+ key == :null
49
+ end
50
+
44
51
  def provider_key
45
52
  key
46
53
  end
@@ -66,6 +73,14 @@ module ProviderKit
66
73
  capability.callable?(method_name)
67
74
  end
68
75
 
76
+ def config
77
+ provider.config
78
+ end
79
+
80
+ def label
81
+ config[:name].presence || self.to_s.underscore.humanize
82
+ end
83
+
69
84
  def method_missing(method_name, *args, **kwargs)
70
85
  if capable_of?(method_name)
71
86
  perform_capability(method_name, *args, **kwargs)
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ProviderKit
4
+ # This is an empty provider that doesn't do anything, but can be used as a placeholder
5
+ class NullProvider
6
+
7
+ include ProviderKit::Capable
8
+
9
+ end
10
+ end
@@ -5,27 +5,12 @@ module ProviderKit
5
5
  module Provideable
6
6
 
7
7
  extend ActiveSupport::Concern
8
+ include Attribute
8
9
 
9
10
  included do
10
11
  validate :validate_provider_presence
11
12
  end
12
13
 
13
- def provider
14
- if provider_key.present?
15
- @provider ||= ProviderKit::ProviderAttribute.new(provider_key, record: self)
16
- end
17
- end
18
-
19
- def provider=(value)
20
- @provider = nil
21
-
22
- write_attribute(:provider, value.to_s.presence)
23
- end
24
-
25
- def provider_key
26
- read_attribute(:provider).to_s.presence
27
- end
28
-
29
14
  private
30
15
 
31
16
  def validate_provider_presence
@@ -29,6 +29,10 @@ module ProviderKit
29
29
  def provider_instance
30
30
  return nil unless provider
31
31
 
32
+ if provider.class == Module
33
+ raise "Provider #{ provider } is a module, not a class"
34
+ end
35
+
32
36
  instance = provider.new
33
37
 
34
38
  if instance.respond_to?(:context=) && record != key
@@ -6,6 +6,8 @@ module ProviderKit
6
6
 
7
7
  include Buildable
8
8
 
9
+ ATTRIBUTE_QUERY = /^(?<attribute>[a-z0-9_]+)\?$/.freeze
10
+
9
11
  attr_reader :key
10
12
  attr_reader :record
11
13
  attr_reader :context
@@ -25,20 +27,35 @@ module ProviderKit
25
27
  end
26
28
 
27
29
  def method_missing(method_name, *args)
28
- return nil unless provider.present?
30
+ return super unless provider.present?
29
31
 
30
32
  if provider.respond_to?(method_name)
31
33
  return provider.public_send(method_name, *args)
32
34
  end
33
35
 
34
36
  # self.amazon_selling_partner? ==> self.key == :amazon_selling_partner
35
- if match = method_name.to_s.match(/^(?<attribute>[a-z0-9_]+)\?$/)
37
+ if match = method_name.to_s.match(ATTRIBUTE_QUERY)
36
38
  return match[:attribute].to_clean_sym == key
37
39
  end
38
40
 
39
41
  provider.with_context(**context).public_send(method_name, *args)
40
42
  end
41
43
 
44
+ def respond_to_missing?(method_name, include_private = false)
45
+ return super unless provider.present?
46
+
47
+ # Check if the provider responds to the method
48
+ return true if provider.respond_to?(method_name, include_private)
49
+
50
+ # Match dynamic `attribute?` methods
51
+ return true if method_name.to_s.match?(ATTRIBUTE_QUERY)
52
+
53
+ # Check if the provider with context responds to the method
54
+ return true if provider.with_context(**context).respond_to?(method_name, include_private)
55
+
56
+ super
57
+ end
58
+
42
59
  def label
43
60
  name
44
61
  end
@@ -5,7 +5,7 @@ module ProviderKit
5
5
  module Registerable
6
6
 
7
7
  def deregister(key)
8
- if registration = registrations[key]
8
+ if registrations[key]
9
9
  config.registered_providers.delete(key)
10
10
  end
11
11
  end
@@ -20,6 +20,11 @@ module ProviderKit
20
20
  end
21
21
  end
22
22
 
23
+ # special provider for placeholders
24
+ def null
25
+ ProviderKit.registrations[:null].klass
26
+ end
27
+
23
28
  def providers(type: nil)
24
29
  registrations(type:).values.map(&:klass)
25
30
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ProviderKit
4
4
 
5
- VERSION = "0.2.0"
5
+ VERSION = "0.2.1"
6
6
 
7
7
  module Version
8
8
 
data/lib/provider_kit.rb CHANGED
@@ -35,6 +35,7 @@ module ProviderKit
35
35
  end
36
36
 
37
37
  ## Core
38
+ autoload :Attribute
38
39
  autoload :Callbacks
39
40
  autoload :EncryptedSettings
40
41
  autoload :Encryptor
@@ -42,6 +43,7 @@ module ProviderKit
42
43
  autoload :JsonClient
43
44
  autoload :JsonRequest
44
45
  autoload :Logging
46
+ autoload :NullProvider
45
47
  autoload :Provideable
46
48
  autoload :Provider
47
49
  autoload :ProviderAttribute
@@ -58,4 +60,7 @@ module ProviderKit
58
60
  extend Registerable
59
61
  extend Buildable
60
62
 
63
+ # this is just a placeholder for integrations that do not need a custom provider
64
+ register :null, class_name: "ProviderKit::NullProvider"
65
+
61
66
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: provider_kit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John D. Tornow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-09-23 00:00:00.000000000 Z
11
+ date: 2025-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -155,6 +155,7 @@ files:
155
155
  - lib/generators/provider/templates/provider.rb.tt
156
156
  - lib/generators/provider/templates/spec.rb.tt
157
157
  - lib/provider_kit.rb
158
+ - lib/provider_kit/attribute.rb
158
159
  - lib/provider_kit/buildable.rb
159
160
  - lib/provider_kit/callbacks.rb
160
161
  - lib/provider_kit/capability.rb
@@ -169,6 +170,7 @@ files:
169
170
  - lib/provider_kit/json_client.rb
170
171
  - lib/provider_kit/json_request.rb
171
172
  - lib/provider_kit/logging.rb
173
+ - lib/provider_kit/null_provider.rb
172
174
  - lib/provider_kit/provideable.rb
173
175
  - lib/provider_kit/provider.rb
174
176
  - lib/provider_kit/provider_attribute.rb