pears 0.0.1 → 0.0.5

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: 6027c30390f8c8c7eb777118ac67a2c92ab1492c9e56cbf8bfd7f0b3af7dd9b4
4
- data.tar.gz: 55a01b652c8f57945d864b9b35b2a0ae974cbf434f26012541eb5a62e8fe4f36
3
+ metadata.gz: 94c6430efedf1e3534fcd99df29979522f063ec66682217d2f1a6188661be319
4
+ data.tar.gz: 01f7319c47e4a0fecaa5831c9a53e804112b0b25c42f2a558ef2a2909a1756f6
5
5
  SHA512:
6
- metadata.gz: 805d0cdae121ba3fc165de1e12177bc63eab1396af53d661652062253b85b40dec8487c7cb49e673784f3cfc4420adc7ef4cd7737f9a10b381655c4ca6e9cacd
7
- data.tar.gz: c18a180c02015f9a8816f177fdfca43119552e2e5b584cace0877aceab9108a28a21ceeb1099501060599fdacbb22629ae016d5046c766e3e5b7d34886286176
6
+ metadata.gz: 5b8d6036fb96e72313fd72317f8ed757b2bf71c2af89f06c999a357582654517c3fe7f2dc3ad7bffa3ccbbafcfa519ae3d5fa0fc98bf4a2dd1b15cc427318ba6
7
+ data.tar.gz: 98ef7be8b052f2f82a34015d05cee4e537a604d8d9d134d1ff7b671773fa99c06d1361caeb32508aa6efbfdca231b60179c981500f5b688ed272b3f2bc329b08
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- pears (0.1.0)
4
+ pears (0.0.5)
5
5
  activesupport
6
6
  dry-configurable (>= 0.13.0)
7
7
  redis
@@ -9,7 +9,7 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- activesupport (6.1.4.1)
12
+ activesupport (6.1.4.3)
13
13
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
14
  i18n (>= 1.6, < 2)
15
15
  minitest (>= 5.1)
@@ -25,7 +25,7 @@ GEM
25
25
  concurrent-ruby (~> 1.0)
26
26
  i18n (1.8.11)
27
27
  concurrent-ruby (~> 1.0)
28
- minitest (5.14.4)
28
+ minitest (5.15.0)
29
29
  rake (13.0.6)
30
30
  redis (4.5.1)
31
31
  rspec (3.10.0)
@@ -1,44 +1,53 @@
1
1
  require 'active_support/core_ext/module'
2
2
 
3
3
  module Pears
4
- module Providers
4
+ module Provider
5
5
  class Builder
6
+ # Evil meta programming.
7
+ def self.enable_provider(provider, yielder: false)
8
+ method_name = provider.name.split('::').last.underscore.to_sym
9
+ if yielder
10
+ define_method(method_name) do |*args, &block|
11
+ pr = provider.new(builder: self, &block)
12
+ push pr
13
+ pr
14
+ end
15
+ else
16
+ define_method(method_name) do |*args, **opts, &block|
17
+ pr = provider.new(*args, **opts, &block)
18
+ push pr
19
+ pr
20
+ end
21
+ end
22
+ end
23
+
24
+ # define Providers
25
+ enable_provider LocalFile
26
+ enable_provider RemoteFile
27
+ enable_provider Subscription, yielder: true
28
+
6
29
  delegate :name, to: :subject
7
30
 
8
31
  def initialize(subject)
9
32
  @subject = subject
10
33
  end
11
34
 
12
- def hash
13
- raise 'not yet implemented'
14
- end
15
-
16
- def loco
17
- raise 'not yet implemented'
18
- end
19
-
20
- def env
21
- raise 'not yet implemented'
22
- end
23
-
24
- def local_file(file_path)
25
- register Provider::LocalFile.new(file_path)
26
- end
27
-
28
- def remote_file(file_url)
29
- register Provider::RemoteFile.new(file_url)
35
+ def freeze_layers
36
+ @skip_push = true
37
+ yield
38
+ @skip_push = false
30
39
  end
31
40
 
32
- def subscription &block
33
- register Provider::Subscription.new(@subject.name, &block)
41
+ def subject_name
42
+ @subject.name
34
43
  end
35
44
 
36
45
  private
37
46
 
38
- def register provider
47
+ def push provider
39
48
  return provider unless @subject.is_a? Subject
40
49
 
41
- @subject.push_layer provider
50
+ @subject.push_layer provider unless @skip_push
42
51
  end
43
52
  end
44
53
  end
@@ -9,6 +9,7 @@ module Pears
9
9
  private
10
10
 
11
11
  def fetch_from_loco(api_key, url)
12
+ raise "Not yet implemented"
12
13
  # Get config from loco
13
14
  end
14
15
  end
@@ -1,27 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
  require 'redis'
3
3
 
4
+
4
5
  module Pears
5
6
  module Provider
6
7
  # Config using redis subscription. This updates automatically upon Redis
7
8
  # channel updates.
9
+ # This class would register as "alternative classes with different interfaces".
10
+ # I ought to clean this up and maybe make "triggers" a different entity
11
+ # from a provider available in the builder.
12
+
8
13
  class Subscription < Base
9
14
  attr_reader :subscription
10
-
11
- def initialize(channel,
15
+ def initialize(channel=nil,
12
16
  redis_host: Pears.config.redis_host,
17
+ **opts,
13
18
  &fetcher)
19
+ @builder = opts[:builder] || Builder.new(nil)
14
20
  @channel = channel
21
+
22
+ # Fetcher is a "Provider" of some sort.
15
23
  @fetcher = fetcher
16
24
 
25
+ # Setup redis subscription
17
26
  establish_connection(redis_host)
18
- subscribe
19
27
  reload
28
+ subscribe
29
+ end
30
+
31
+ def channel
32
+ @channel ||= @builder.subject_name
20
33
  end
21
34
 
22
35
  def reload
23
- @data = @fetcher.call(Pears::Providers::Builder.new(self))
24
- .data
36
+ @builder.freeze_layers do
37
+ @data = @fetcher.call.data
38
+ end
25
39
  end
26
40
 
27
41
  # This seems a bit "rough" of an approach. we should check if
@@ -9,5 +9,8 @@ require_relative "provider/builder"
9
9
 
10
10
  module Pears
11
11
  module Provider
12
+ def enable(provider, with_block: false)
13
+ Builder.enable
14
+ end
12
15
  end
13
16
  end
data/lib/pears/subject.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'active_support/core_ext/hash/indifferent_access'
2
+
1
3
  module Pears
2
4
  # A subject is a collection of settings.
3
5
  # You could different Pears::Subjects in your application for different parts
@@ -23,6 +25,10 @@ module Pears
23
25
  project.has_key? key
24
26
  end
25
27
 
28
+ def dig(*args)
29
+ project.dig(*args)
30
+ end
31
+
26
32
  def push_layer(layer)
27
33
  @layers << layer
28
34
  end
@@ -31,7 +37,7 @@ module Pears
31
37
  def project
32
38
  layers.reverse.reduce(Hash.new) do |hash, layer|
33
39
  hash.deep_merge(layer.data)
34
- end
40
+ end.with_indifferent_access
35
41
  end
36
42
 
37
43
  private
data/lib/pears/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Pears
4
- VERSION = "0.0.1"
4
+ VERSION = "0.0.5"
5
5
  end
data/lib/pears.rb CHANGED
@@ -14,11 +14,10 @@ module Pears
14
14
  @subjects ||= []
15
15
  end
16
16
 
17
-
18
17
  # This is the main way of locating a subject.
19
18
  def self.subject(name)
20
19
  Subject.new(name: name).tap do |subject|
21
- builder = Providers::Builder.new(subject)
20
+ builder = Provider::Builder.new(subject)
22
21
  yield(builder)
23
22
  end
24
23
  end
data/pears.gemspec CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
6
6
  spec.name = "pears"
7
7
  spec.version = Pears::VERSION
8
8
  spec.authors = ["Steven Kemp"]
9
- spec.email = ["steven@remarkgroup.Com"]
9
+ spec.email = ["steven@remarkgroup.com"]
10
10
 
11
11
  spec.summary = "Ingest hot-swappable configuration data"
12
12
  spec.homepage = "https://www.rubygems.com"
@@ -25,10 +25,11 @@ Gem::Specification.new do |spec|
25
25
  spec.require_paths = ["lib"]
26
26
 
27
27
  # Uncomment to register a new dependency of your gem
28
- spec.add_dependency 'dry-configurable', '~> 0.13.0'
29
- spec.add_dependency 'activesupport', '~> 6.1.4.1'
30
- spec.add_dependency 'redis', '~>4.5.1'
28
+ spec.add_dependency 'dry-configurable', '>= 0.13.0'
29
+ spec.add_dependency 'activesupport'
30
+ spec.add_dependency 'redis'
31
31
 
32
+ spec.add_development_dependency 'byebug'
32
33
  # For more information and examples about making a new gem, checkout our
33
34
  # guide at: https://bundler.io/guides/creating_gem.html
34
35
  end
metadata CHANGED
@@ -1,60 +1,74 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pears
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Kemp
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-10 00:00:00.000000000 Z
11
+ date: 2021-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-configurable
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.13.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.13.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 6.1.4.1
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 6.1.4.1
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: redis
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 4.5.1
47
+ version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 4.5.1
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description:
56
70
  email:
57
- - steven@remarkgroup.Com
71
+ - steven@remarkgroup.com
58
72
  executables: []
59
73
  extensions: []
60
74
  extra_rdoc_files: []