pears 0.0.1 → 0.0.5

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: 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: []