pears 0.2.0 → 0.3.2
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 +8 -8
- data/lib/pears/commands.rb +14 -0
- data/lib/pears/errors.rb +1 -0
- data/lib/pears/provider/base.rb +4 -0
- data/lib/pears/provider/debugger.rb +14 -0
- data/lib/pears/provider/subscription.rb +12 -4
- data/lib/pears/provider.rb +1 -0
- data/lib/pears/subject.rb +18 -3
- data/lib/pears/testing/subject.rb +24 -0
- data/lib/pears/testing.rb +32 -0
- data/lib/pears/version.rb +1 -1
- data/lib/pears/web/views/index.erb +23 -0
- data/lib/pears/web/views/show.erb +23 -0
- data/lib/pears/web/views/style.erb +58 -0
- data/lib/pears/web.rb +38 -0
- data/lib/pears.rb +10 -5
- data/pears.gemspec +1 -0
- metadata +24 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e90770f906724b64b6ae99ee1688230dd0d8b46727be9dd444ae026067cd814e
|
4
|
+
data.tar.gz: 37c6daf85a0aaba38e8d8ff8fe20cd281d0a3504f80fa679d818f6cab866904a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 960a73a2741bc5febbcfaad6931f97475b2171bbddcb1d6460cf075e68dd3448a98462569042309223b8e2ed634bdd6414d781323905e9373c4baa7d1766d0d2
|
7
|
+
data.tar.gz: bcb0ee18a1938ea763a2597a3af626073d24735d2048898ec439c96d3caf6ea7ba4874e2612a02faad043ec7547303194429758535554cb234c1d5263bd8426c
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pears (0.1
|
4
|
+
pears (0.3.1)
|
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 (7.0.
|
12
|
+
activesupport (7.0.3.1)
|
13
13
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
14
14
|
i18n (>= 1.6, < 2)
|
15
15
|
minitest (>= 5.1)
|
@@ -17,16 +17,16 @@ GEM
|
|
17
17
|
byebug (11.1.3)
|
18
18
|
concurrent-ruby (1.1.10)
|
19
19
|
diff-lcs (1.4.4)
|
20
|
-
dry-configurable (0.
|
20
|
+
dry-configurable (0.15.0)
|
21
21
|
concurrent-ruby (~> 1.0)
|
22
22
|
dry-core (~> 0.6)
|
23
|
-
dry-core (0.
|
23
|
+
dry-core (0.8.0)
|
24
24
|
concurrent-ruby (~> 1.0)
|
25
|
-
i18n (1.
|
25
|
+
i18n (1.12.0)
|
26
26
|
concurrent-ruby (~> 1.0)
|
27
|
-
minitest (5.
|
27
|
+
minitest (5.16.2)
|
28
28
|
rake (13.0.6)
|
29
|
-
redis (4.
|
29
|
+
redis (4.7.1)
|
30
30
|
rspec (3.10.0)
|
31
31
|
rspec-core (~> 3.10.0)
|
32
32
|
rspec-expectations (~> 3.10.0)
|
@@ -42,7 +42,7 @@ GEM
|
|
42
42
|
diff-lcs (>= 1.2.0, < 2.0)
|
43
43
|
rspec-support (~> 3.10.0)
|
44
44
|
rspec-support (3.10.3)
|
45
|
-
tzinfo (2.0.
|
45
|
+
tzinfo (2.0.5)
|
46
46
|
concurrent-ruby (~> 1.0)
|
47
47
|
|
48
48
|
PLATFORMS
|
data/lib/pears/errors.rb
CHANGED
data/lib/pears/provider/base.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module Pears
|
2
|
+
# Move this one into Pears, its really handy!
|
3
|
+
module Provider
|
4
|
+
class Debuggy < Pears::Provider::Base
|
5
|
+
def data
|
6
|
+
puts "Pears Debugger was called."
|
7
|
+
puts @data
|
8
|
+
@data
|
9
|
+
end
|
10
|
+
end
|
11
|
+
Provider::Builder.enable_provider Pears::Provider::Debuggy
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
@@ -44,16 +44,24 @@ module Pears
|
|
44
44
|
@subscription.terminate
|
45
45
|
end
|
46
46
|
|
47
|
+
def purge
|
48
|
+
unsubscribe
|
49
|
+
true
|
50
|
+
end
|
51
|
+
|
47
52
|
private
|
48
53
|
|
49
54
|
def subscribe
|
55
|
+
nth = 0
|
50
56
|
@subscription = Thread.new do
|
51
|
-
|
52
|
-
|
53
|
-
load_config
|
57
|
+
loop do
|
58
|
+
connection.subscribe(channel) do |on|
|
59
|
+
on.message { |_channel, _message| load_config }
|
54
60
|
end
|
61
|
+
|
62
|
+
nth += 1
|
63
|
+
puts "Pears connection was lost for the #{nth}th time"
|
55
64
|
end
|
56
|
-
puts "Redis connection died!"
|
57
65
|
end
|
58
66
|
end
|
59
67
|
|
data/lib/pears/provider.rb
CHANGED
data/lib/pears/subject.rb
CHANGED
@@ -3,15 +3,16 @@ require 'active_support/core_ext/hash/indifferent_access'
|
|
3
3
|
module Pears
|
4
4
|
# A subject is a collection of settings.
|
5
5
|
# You could different Pears::Subjects in your application for different parts
|
6
|
-
# of its domain. for instance: application_settings, theming or
|
6
|
+
# of its domain. for instance: application_settings, theming or translaions.
|
7
7
|
class Subject
|
8
8
|
include Enumerable
|
9
9
|
attr_reader :name
|
10
10
|
|
11
|
-
def initialize(name, *layers)
|
11
|
+
def initialize(name, *layers, loader: ->(builder){} )
|
12
12
|
@name = name
|
13
13
|
@layers = layers
|
14
|
-
|
14
|
+
@loader = loader
|
15
|
+
boot
|
15
16
|
end
|
16
17
|
|
17
18
|
def [](key)
|
@@ -30,6 +31,10 @@ module Pears
|
|
30
31
|
project.dig(*args)
|
31
32
|
end
|
32
33
|
|
34
|
+
def purge
|
35
|
+
@layers.each.each(&:purge)
|
36
|
+
end
|
37
|
+
|
33
38
|
def push_layer(layer)
|
34
39
|
@layers << layer
|
35
40
|
end
|
@@ -45,8 +50,18 @@ module Pears
|
|
45
50
|
project.each(&block)
|
46
51
|
end
|
47
52
|
|
53
|
+
def reboot
|
54
|
+
purge
|
55
|
+
@layers = []
|
56
|
+
boot
|
57
|
+
end
|
58
|
+
|
48
59
|
private
|
49
60
|
|
61
|
+
def boot
|
62
|
+
@loader.call(Provider::Builder.new(self))
|
63
|
+
end
|
64
|
+
|
50
65
|
def layers
|
51
66
|
@layers
|
52
67
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Pears
|
2
|
+
module Testing
|
3
|
+
module Subject
|
4
|
+
def prepend *address, is:
|
5
|
+
@layers = @layers.unshift Pears::Provider::Hash.new(hasher(address, is: is))
|
6
|
+
end
|
7
|
+
|
8
|
+
def shift
|
9
|
+
@layers.shift
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def hasher(address, is:)
|
15
|
+
local = address.shift
|
16
|
+
if address.empty?
|
17
|
+
{ local => is }
|
18
|
+
else
|
19
|
+
{ local => hasher(address, is: is) }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'pears/testing/subject'
|
2
|
+
|
3
|
+
module Pears
|
4
|
+
module Testing
|
5
|
+
def self.prepend_subject subject_name, *address, is:
|
6
|
+
subject = find_subject!(subject_name)
|
7
|
+
subject.prepend *address, is: is
|
8
|
+
begin
|
9
|
+
yield
|
10
|
+
ensure
|
11
|
+
subject.shift
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.find_subject!(name)
|
16
|
+
Pears.subjects
|
17
|
+
.find { |subject| subject.name.to_sym == name.to_sym }.tap do |sub|
|
18
|
+
unless sub.present?
|
19
|
+
raise SubjectNotfound.new(
|
20
|
+
message: "No subject with the name #{subject_name} exists."
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module Pears
|
29
|
+
class Subject
|
30
|
+
include Pears::Testing::Subject
|
31
|
+
end
|
32
|
+
end
|
data/lib/pears/version.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<style><%=render('style')%></style>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<header>
|
7
|
+
<h1> Pears::Subjects </h1>
|
8
|
+
</header>
|
9
|
+
<main>
|
10
|
+
<nav>
|
11
|
+
<% @subjects.each do |subject| %>
|
12
|
+
<p> <a href=<%="./subjects/#{subject.name}"%>><%= subject.name %></a> </p>
|
13
|
+
<% end %>
|
14
|
+
</nav>
|
15
|
+
<section>
|
16
|
+
<p> No subject selected </p>
|
17
|
+
</section>
|
18
|
+
</main>
|
19
|
+
|
20
|
+
<footer>
|
21
|
+
<p class='p--footer' > Pears web-interface </p>
|
22
|
+
</footer>
|
23
|
+
</body>
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<html>
|
2
|
+
<head>
|
3
|
+
<style><%=render('style')%></style>
|
4
|
+
</head>
|
5
|
+
<body>
|
6
|
+
<header>
|
7
|
+
<h1> Pears::Subjects </h1>
|
8
|
+
<form method="post">
|
9
|
+
<input type='submit' value='Reboot <%= @subject.name.to_s.humanize %>' name="reboot-<%=@subject.name%>}">
|
10
|
+
</form>
|
11
|
+
</header>
|
12
|
+
<main>
|
13
|
+
<nav>
|
14
|
+
<% @subjects.each do |subject| %>
|
15
|
+
<p> <a href=<%=subject.name%>><%= subject.name.to_s.humanize.capitalize %></a> </p>
|
16
|
+
<% end %>
|
17
|
+
</nav>
|
18
|
+
<section>
|
19
|
+
<h3><%= @subject.name.capitalize %></h3>
|
20
|
+
<div class='serialization'><%= JSON.pretty_generate(@subject.project) %></div>
|
21
|
+
</section>
|
22
|
+
</main>
|
23
|
+
</body>
|
@@ -0,0 +1,58 @@
|
|
1
|
+
body {
|
2
|
+
font-family: "Avenir", "Arial", sans-serif;
|
3
|
+
color: 222;padding: 0px 30px 10px 30px;
|
4
|
+
margin: 0;
|
5
|
+
background-color: FFF;
|
6
|
+
}
|
7
|
+
|
8
|
+
header {
|
9
|
+
padding-top: 4px;
|
10
|
+
height: 60px;
|
11
|
+
display: flex;
|
12
|
+
justify-content: space-between;
|
13
|
+
align-items: center;
|
14
|
+
}
|
15
|
+
|
16
|
+
main {
|
17
|
+
height: calc(100vh - 160px);
|
18
|
+
display: flex;
|
19
|
+
}
|
20
|
+
|
21
|
+
footer {
|
22
|
+
margin: 20px 20px 10px 20px;
|
23
|
+
height: 20px;
|
24
|
+
}
|
25
|
+
|
26
|
+
.p--footer {
|
27
|
+
width: 100%;
|
28
|
+
text-align: right;
|
29
|
+
}
|
30
|
+
|
31
|
+
nav {
|
32
|
+
padding: 0px 10px 10px 0;
|
33
|
+
display: block;
|
34
|
+
border-right: 1px solid #CCC;
|
35
|
+
min-width: 15%;
|
36
|
+
min-height: 100%;
|
37
|
+
}
|
38
|
+
|
39
|
+
section {
|
40
|
+
padding: 0px 10px 10px 20px;
|
41
|
+
width: 85%;
|
42
|
+
min-height: 100%;
|
43
|
+
}
|
44
|
+
|
45
|
+
.serialization {
|
46
|
+
font-family: 'SF mono', 'Courier', monospace;
|
47
|
+
white-space: pre;
|
48
|
+
background-color: eeeeee;
|
49
|
+
border-radius: 11px;
|
50
|
+
padding: 15px;
|
51
|
+
}
|
52
|
+
|
53
|
+
input[type=submit]{
|
54
|
+
padding: 10px 22px;
|
55
|
+
background-color: fff;
|
56
|
+
border-radius: 6px;
|
57
|
+
border: 1px solid #666;
|
58
|
+
}
|
data/lib/pears/web.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'roda'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Pears
|
5
|
+
class Web < Roda
|
6
|
+
plugin :render, views: "#{__FILE__}/../web/views"
|
7
|
+
|
8
|
+
route do |r|
|
9
|
+
r.root do
|
10
|
+
r.redirect "#{request.path}index"
|
11
|
+
end
|
12
|
+
|
13
|
+
r.get "index" do
|
14
|
+
@subjects = Pears.subjects
|
15
|
+
render('index')
|
16
|
+
end
|
17
|
+
|
18
|
+
r.on "subjects" do
|
19
|
+
r.is do
|
20
|
+
r.redirect "#{request.path.delete_suffix('/subjects')}/index"
|
21
|
+
end
|
22
|
+
|
23
|
+
r.get String do |subject|
|
24
|
+
@subjects = Pears.subjects
|
25
|
+
@subject = Pears[subject.to_sym]
|
26
|
+
render('show')
|
27
|
+
end
|
28
|
+
|
29
|
+
r.post String do |subject|
|
30
|
+
@subjects = Pears.subjects
|
31
|
+
@subject = Pears[subject.to_sym]
|
32
|
+
@subject.reboot
|
33
|
+
render('show')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/pears.rb
CHANGED
@@ -4,6 +4,7 @@ require_relative "pears/version"
|
|
4
4
|
require_relative "pears/errors"
|
5
5
|
require_relative "pears/provider"
|
6
6
|
require_relative "pears/subject"
|
7
|
+
require_relative "pears/commands"
|
7
8
|
|
8
9
|
module Pears
|
9
10
|
extend Dry::Configurable
|
@@ -15,11 +16,15 @@ module Pears
|
|
15
16
|
end
|
16
17
|
|
17
18
|
# This is the main way of locating a subject.
|
18
|
-
def self.subject(name)
|
19
|
-
subjects
|
20
|
-
|
21
|
-
builder = Provider::Builder.new(subject)
|
22
|
-
@subjects << yield(builder)
|
19
|
+
def self.subject(name, &block)
|
20
|
+
if subjects.any? { |sub| sub.name == name }
|
21
|
+
raise Pears::Error.new("subject name #{name} is already in use.")
|
23
22
|
end
|
23
|
+
|
24
|
+
Subject.new(name, loader: block).tap { |sub| @subjects.push sub }
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.[](name)
|
28
|
+
subjects.find { |subject| subject.name == name }
|
24
29
|
end
|
25
30
|
end
|
data/pears.gemspec
CHANGED
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.add_dependency 'dry-configurable', '>= 0.13.0'
|
29
29
|
spec.add_dependency 'activesupport'
|
30
30
|
spec.add_dependency 'redis'
|
31
|
+
spec.add_dependency 'roda'
|
31
32
|
|
32
33
|
spec.add_development_dependency 'byebug'
|
33
34
|
# For more information and examples about making a new gem, checkout our
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pears
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Kemp
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dry-configurable
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: roda
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: byebug
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -84,10 +98,12 @@ files:
|
|
84
98
|
- bin/console
|
85
99
|
- bin/setup
|
86
100
|
- lib/pears.rb
|
101
|
+
- lib/pears/commands.rb
|
87
102
|
- lib/pears/errors.rb
|
88
103
|
- lib/pears/provider.rb
|
89
104
|
- lib/pears/provider/base.rb
|
90
105
|
- lib/pears/provider/builder.rb
|
106
|
+
- lib/pears/provider/debugger.rb
|
91
107
|
- lib/pears/provider/env.rb
|
92
108
|
- lib/pears/provider/hash.rb
|
93
109
|
- lib/pears/provider/local_file.rb
|
@@ -96,7 +112,13 @@ files:
|
|
96
112
|
- lib/pears/provider/remote_file.rb
|
97
113
|
- lib/pears/provider/subscription.rb
|
98
114
|
- lib/pears/subject.rb
|
115
|
+
- lib/pears/testing.rb
|
116
|
+
- lib/pears/testing/subject.rb
|
99
117
|
- lib/pears/version.rb
|
118
|
+
- lib/pears/web.rb
|
119
|
+
- lib/pears/web/views/index.erb
|
120
|
+
- lib/pears/web/views/show.erb
|
121
|
+
- lib/pears/web/views/style.erb
|
100
122
|
- pears.gemspec
|
101
123
|
homepage: https://bitbucket.org/ivaldi/rubygems-pears/src/master/
|
102
124
|
licenses:
|