steppy 0.0.1 → 0.1.0
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/.rubocop.yml +6 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +12 -2
- data/config.reek +5 -0
- data/lib/steppy.rb +135 -1
- data/lib/steppy/cache.rb +28 -0
- data/lib/steppy/version.rb +1 -1
- data/steppy.gemspec +2 -1
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e5453b4c6d2b926fbb62e294acf91d2a6620628d638120a4891211a425e3573
|
4
|
+
data.tar.gz: 9d49834c0e7767236fe25f4ae37f9ad1c48ac04d7c4a8a430b5b9b3a91f1354e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 86ce9ff1d59ca081127c6beb3ca7e065d0f2dc973ba97bbfae3f1f0704f6e5cee490e48d4035a63f460aed5f8a77e22ed589a67c4420b9957ee52c233cac64e4
|
7
|
+
data.tar.gz: 984959949968858249dea683dc5ef6218b099503ec00b1dcbddf47885f89585db18f125b0bc53e70897633637036357487084d38bb7cd6c69ac44bf3bcf68fbf
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
steppy (0.0
|
4
|
+
steppy (0.1.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -11,14 +11,17 @@ GEM
|
|
11
11
|
descendants_tracker (~> 0.0.4)
|
12
12
|
ice_nine (~> 0.11.0)
|
13
13
|
thread_safe (~> 0.3, >= 0.3.1)
|
14
|
+
byebug (10.0.2)
|
14
15
|
codeclimate-engine-rb (0.4.1)
|
15
16
|
virtus (~> 1.0)
|
16
17
|
coercible (1.0.0)
|
17
18
|
descendants_tracker (~> 0.0.1)
|
18
19
|
descendants_tracker (0.0.4)
|
19
20
|
thread_safe (~> 0.3, >= 0.3.1)
|
21
|
+
docile (1.3.1)
|
20
22
|
equalizer (0.0.11)
|
21
23
|
ice_nine (0.11.2)
|
24
|
+
json (2.1.0)
|
22
25
|
minitest (5.11.3)
|
23
26
|
parallel (1.12.1)
|
24
27
|
parser (2.5.1.0)
|
@@ -43,6 +46,11 @@ GEM
|
|
43
46
|
rubocop-rspec (1.22.1)
|
44
47
|
rubocop (>= 0.52.1)
|
45
48
|
ruby-progressbar (1.9.0)
|
49
|
+
simplecov (0.16.1)
|
50
|
+
docile (~> 1.1)
|
51
|
+
json (>= 1.8, < 3)
|
52
|
+
simplecov-html (~> 0.10.0)
|
53
|
+
simplecov-html (0.10.2)
|
46
54
|
thread_safe (0.3.6)
|
47
55
|
unicode-display_width (1.3.2)
|
48
56
|
virtus (1.0.5)
|
@@ -56,11 +64,13 @@ PLATFORMS
|
|
56
64
|
|
57
65
|
DEPENDENCIES
|
58
66
|
bundler (~> 1.16)
|
59
|
-
|
67
|
+
byebug
|
68
|
+
minitest (~> 5.1)
|
60
69
|
rake (~> 10.0)
|
61
70
|
reek (~> 4.8.1)
|
62
71
|
rubocop (~> 0.52.1)
|
63
72
|
rubocop-airbnb
|
73
|
+
simplecov (~> 0.16.1)
|
64
74
|
steppy!
|
65
75
|
|
66
76
|
BUNDLED WITH
|
data/config.reek
ADDED
data/lib/steppy.rb
CHANGED
@@ -1,7 +1,141 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'steppy/version'
|
4
|
+
require 'steppy/cache'
|
4
5
|
|
6
|
+
# The Steppy module you'll include in your classes to give them steps!
|
5
7
|
module Steppy
|
6
|
-
|
8
|
+
def self.included(base)
|
9
|
+
base.extend ClassMethods
|
10
|
+
base.include InstanceMethods
|
11
|
+
end
|
12
|
+
|
13
|
+
# Steppy class methods that will be added to your included classes.
|
14
|
+
module ClassMethods
|
15
|
+
if !defined? step
|
16
|
+
def step(method, **args)
|
17
|
+
steppy_add step_method: method, step_args: args
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
if !defined? step_if
|
22
|
+
def step_if(condition, &block)
|
23
|
+
steppy_add step_if: condition, step_block: block
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
if !defined? step_set
|
28
|
+
def step_set(*sets)
|
29
|
+
steppy_cache[:sets] = *sets
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def steppy_cache
|
34
|
+
@steppy_cache ||= SteppyCache.new(steps: nil, sets: [], block: nil)
|
35
|
+
end
|
36
|
+
|
37
|
+
def steppy_steps
|
38
|
+
steppy_cache[:steps] ||= []
|
39
|
+
end
|
40
|
+
|
41
|
+
def steppy_add(step)
|
42
|
+
steppy_steps.push(step)
|
43
|
+
steppy_cache
|
44
|
+
end
|
45
|
+
|
46
|
+
def steppy(&block)
|
47
|
+
steppy_cache[:block] = block
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Steppy instance methods that will be added.
|
52
|
+
module InstanceMethods
|
53
|
+
def steppy(attributes)
|
54
|
+
@steppy = { attributes: attributes.freeze }
|
55
|
+
|
56
|
+
steppy_run(
|
57
|
+
(steppy_class_block || steppy_class_cache).to_h
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
def steppy_attributes
|
62
|
+
@steppy[:attributes]
|
63
|
+
end
|
64
|
+
|
65
|
+
protected
|
66
|
+
|
67
|
+
def steppy_run(steps:, sets:, **)
|
68
|
+
steppy_run_sets(sets)
|
69
|
+
steppy_run_steps(steps)
|
70
|
+
|
71
|
+
@steppy[:result] || nil
|
72
|
+
end
|
73
|
+
|
74
|
+
def steppy_class_block
|
75
|
+
block = steppy_class_cache[:block]
|
76
|
+
block && steppy_class.instance_exec(&block)
|
77
|
+
end
|
78
|
+
|
79
|
+
def steppy_class_cache
|
80
|
+
self.class.steppy_cache
|
81
|
+
end
|
82
|
+
|
83
|
+
def steppy_run_sets(sets)
|
84
|
+
sets ||= steppy_class_cache[:sets]
|
85
|
+
|
86
|
+
sets.each do |set|
|
87
|
+
steppy_set(set, steppy_attributes[set])
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def steppy_run_steps(steps)
|
92
|
+
steps.each do |step|
|
93
|
+
@steppy[:result] = step.key?(:step_if) ? steppy_if_block(step) : steppy_step(step)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def steppy_step(step_method:, step_args:)
|
98
|
+
method_name = "step_#{step_method}"
|
99
|
+
|
100
|
+
steppy_if(step_args[:if]) && return
|
101
|
+
|
102
|
+
if method(method_name).arity > 0
|
103
|
+
result = public_send(method_name, steppy_attributes)
|
104
|
+
else
|
105
|
+
result = public_send(method_name)
|
106
|
+
end
|
107
|
+
|
108
|
+
steppy_set(step_args[:set], result)
|
109
|
+
end
|
110
|
+
|
111
|
+
def steppy_if(step_if)
|
112
|
+
return unless step_if
|
113
|
+
|
114
|
+
if step_if.arity > 0
|
115
|
+
!instance_exec(steppy_attributes, &step_if)
|
116
|
+
else
|
117
|
+
!instance_exec(&step_if)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def steppy_set(step_set, result)
|
122
|
+
step_set && instance_variable_set("@#{step_set}", result)
|
123
|
+
|
124
|
+
result
|
125
|
+
end
|
126
|
+
|
127
|
+
def steppy_if_block(step_if:, step_block:)
|
128
|
+
passed = if step_if.arity > 0
|
129
|
+
instance_exec(steppy_attributes, &step_if)
|
130
|
+
else
|
131
|
+
instance_exec(&step_if)
|
132
|
+
end
|
133
|
+
|
134
|
+
passed && steppy_run(steppy_class.instance_exec(&step_block).to_h)
|
135
|
+
end
|
136
|
+
|
137
|
+
def steppy_class
|
138
|
+
Class.new { include Steppy }
|
139
|
+
end
|
140
|
+
end
|
7
141
|
end
|
data/lib/steppy/cache.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Steppy
|
4
|
+
# https://github.com/jeremyevans/roda/blob/master/lib/roda.rb#L14-L42
|
5
|
+
# A thread safe cache class, offering only #[] and #[]= methods,
|
6
|
+
# each protected by a mutex.
|
7
|
+
class SteppyCache
|
8
|
+
# Create a new thread safe cache.
|
9
|
+
def initialize(hash = {})
|
10
|
+
@mutex = Mutex.new
|
11
|
+
@hash = hash
|
12
|
+
end
|
13
|
+
|
14
|
+
# Make getting value from underlying hash thread safe.
|
15
|
+
def [](key)
|
16
|
+
@mutex.synchronize { @hash[key] }
|
17
|
+
end
|
18
|
+
|
19
|
+
# Make setting value in underlying hash thread safe.
|
20
|
+
def []=(key, value)
|
21
|
+
@mutex.synchronize { @hash[key] = value }
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_h
|
25
|
+
@mutex.synchronize { @hash }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/steppy/version.rb
CHANGED
data/steppy.gemspec
CHANGED
@@ -24,8 +24,9 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
26
26
|
spec.add_development_dependency 'rake', '~> 10.0'
|
27
|
-
spec.add_development_dependency 'minitest', '~> 5.
|
27
|
+
spec.add_development_dependency 'minitest', '~> 5.1'
|
28
28
|
spec.add_development_dependency 'reek', '~> 4.8.1'
|
29
29
|
spec.add_development_dependency 'rubocop', '~> 0.52.1'
|
30
30
|
spec.add_development_dependency 'rubocop-airbnb'
|
31
|
+
spec.add_development_dependency 'simplecov', '~> 0.16.1'
|
31
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: steppy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cj
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '5.
|
47
|
+
version: '5.1'
|
48
48
|
type: :development
|
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: '5.
|
54
|
+
version: '5.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: reek
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.16.1
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.16.1
|
97
111
|
description: ''
|
98
112
|
email:
|
99
113
|
- cjlazell@gmail.com
|
@@ -112,8 +126,10 @@ files:
|
|
112
126
|
- Rakefile
|
113
127
|
- bin/console
|
114
128
|
- bin/setup
|
129
|
+
- config.reek
|
115
130
|
- hooks/pre-commit
|
116
131
|
- lib/steppy.rb
|
132
|
+
- lib/steppy/cache.rb
|
117
133
|
- lib/steppy/version.rb
|
118
134
|
- steppy.gemspec
|
119
135
|
homepage: https://github.com/cj/steppy
|