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 +4 -4
- data/Gemfile.lock +3 -3
- data/lib/pears/provider/builder.rb +32 -23
- data/lib/pears/provider/loco.rb +1 -0
- data/lib/pears/provider/subscription.rb +19 -5
- data/lib/pears/provider.rb +3 -0
- data/lib/pears/subject.rb +7 -1
- data/lib/pears/version.rb +1 -1
- data/lib/pears.rb +1 -2
- data/pears.gemspec +5 -4
- metadata +27 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94c6430efedf1e3534fcd99df29979522f063ec66682217d2f1a6188661be319
|
4
|
+
data.tar.gz: 01f7319c47e4a0fecaa5831c9a53e804112b0b25c42f2a558ef2a2909a1756f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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.
|
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.
|
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
|
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
|
13
|
-
|
14
|
-
|
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
|
33
|
-
|
41
|
+
def subject_name
|
42
|
+
@subject.name
|
34
43
|
end
|
35
44
|
|
36
45
|
private
|
37
46
|
|
38
|
-
def
|
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
|
data/lib/pears/provider/loco.rb
CHANGED
@@ -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
|
-
@
|
24
|
-
|
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
|
data/lib/pears/provider.rb
CHANGED
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
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 =
|
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.
|
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', '
|
29
|
-
spec.add_dependency 'activesupport'
|
30
|
-
spec.add_dependency 'redis'
|
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.
|
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-
|
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:
|
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:
|
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:
|
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:
|
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.
|
71
|
+
- steven@remarkgroup.com
|
58
72
|
executables: []
|
59
73
|
extensions: []
|
60
74
|
extra_rdoc_files: []
|