motivation 0.0.1 → 0.0.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.
- data/README.md +32 -6
- data/lib/motivation/version.rb +1 -1
- data/lib/motivation.rb +11 -7
- data/spec/motivation_spec.rb +20 -5
- metadata +1 -1
data/README.md
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
# Motivation
|
2
2
|
|
3
3
|
Simple DSL for use in classes to motivate a user towards a goal. An example
|
4
|
-
goal might be "Complete Profile", or "Setup Project"
|
4
|
+
goal might be "Complete Profile", or "Setup Project".
|
5
|
+
|
6
|
+
This was heavily inspired by [progression](https://github.com/mguterl/progression).
|
7
|
+
|
8
|
+
I switched primarily because I wanted to use specific classes rather than inject into
|
9
|
+
an existing model namespace, and extend the DSL some.
|
5
10
|
|
6
11
|
## Installation
|
7
12
|
|
@@ -19,6 +24,8 @@ Or install it yourself as:
|
|
19
24
|
|
20
25
|
## Usage
|
21
26
|
|
27
|
+
Create a motivational class and `include Motivation`.
|
28
|
+
|
22
29
|
```ruby
|
23
30
|
require "motivation"
|
24
31
|
|
@@ -43,7 +50,7 @@ class ProfileMotivation
|
|
43
50
|
# check is heavy and you want to use a cached result. This
|
44
51
|
# will define a method `#complete_tweets_added
|
45
52
|
step :tweets_added
|
46
|
-
check { cached_tweets_count.to_i > 0 || profile.tweets.length > 0 }
|
53
|
+
check { profile.cached_tweets_count.to_i > 0 || profile.tweets.length > 0 }
|
47
54
|
complete { profile.cached_tweets_count = profile.tweets.length.to_i }
|
48
55
|
end
|
49
56
|
|
@@ -60,12 +67,31 @@ Note that the `check` and `complete` blocks will not tolerate early returns, you
|
|
60
67
|
will get a `LocalJumpError`. If you want to simplify your DSL definitions, you can
|
61
68
|
just call methods, including privates, in your ProfileMotivation class itself.
|
62
69
|
|
63
|
-
|
70
|
+
You can also iterate over checks for a motivation instance:
|
64
71
|
|
65
|
-
|
72
|
+
```ruby
|
73
|
+
motivation.each_check do |check|
|
74
|
+
puts check.name
|
75
|
+
puts check.completed?
|
76
|
+
end
|
77
|
+
```
|
66
78
|
|
67
|
-
|
68
|
-
|
79
|
+
You can get the next incomplete check, this is useful if you want to render
|
80
|
+
a message in a header, for instance.
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
motivation.next_check
|
84
|
+
```
|
85
|
+
|
86
|
+
Motivation checks are wrapped to provide a tranlation key suitable for use with i18n.
|
87
|
+
Note it currently does not include i18n, you can pass the generated keys straight to
|
88
|
+
your helper (such as `t` in Rails views).
|
89
|
+
|
90
|
+
```
|
91
|
+
motivation.next_check.translation_key #=> "motivations.profile.setup_twitter.incomplete"
|
92
|
+
```
|
93
|
+
|
94
|
+
The key format is `motivations.motivation_subject.step_name.[incomplete|complete]`
|
69
95
|
|
70
96
|
## Contributing
|
71
97
|
|
data/lib/motivation/version.rb
CHANGED
data/lib/motivation.rb
CHANGED
@@ -16,16 +16,20 @@ module Motivation
|
|
16
16
|
true
|
17
17
|
end
|
18
18
|
|
19
|
-
def
|
19
|
+
def unwrapped_checks
|
20
20
|
self.class.checks
|
21
21
|
end
|
22
22
|
|
23
|
+
def checks
|
24
|
+
unwrapped_checks.collect { |c| WrappedCheck.new(c, self) }
|
25
|
+
end
|
26
|
+
|
23
27
|
def each_check(&block)
|
24
|
-
|
28
|
+
checks.each &block
|
25
29
|
end
|
26
30
|
|
27
|
-
def
|
28
|
-
checks.
|
31
|
+
def next_check
|
32
|
+
checks.detect { |c| ! c.completed? }
|
29
33
|
end
|
30
34
|
|
31
35
|
def completions
|
@@ -155,9 +159,9 @@ module Motivation
|
|
155
159
|
def translation_key
|
156
160
|
[
|
157
161
|
"motivations",
|
158
|
-
@motivation.
|
159
|
-
|
160
|
-
|
162
|
+
@motivation.translation_key,
|
163
|
+
@check.name,
|
164
|
+
status_key
|
161
165
|
].join('.')
|
162
166
|
end
|
163
167
|
private
|
data/spec/motivation_spec.rb
CHANGED
@@ -136,11 +136,26 @@ describe Motivation do
|
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
|
+
describe "getting the next check" do
|
140
|
+
it "returns the first wrapped check that is incomplete" do
|
141
|
+
project.name = "name"
|
142
|
+
project.subdomain = nil
|
143
|
+
expect(motivation.next_check.name.to_s).to eq "subdomain_setup"
|
144
|
+
project.subdomain = "subdomain"
|
145
|
+
expect(motivation.next_check.name.to_s).to eq "local_method_step"
|
146
|
+
end
|
147
|
+
|
148
|
+
it "returns nil if all checks are complete" do
|
149
|
+
motivation.method_check = true
|
150
|
+
expect(motivation.next_check).to be_nil
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
139
154
|
end
|
140
155
|
|
141
156
|
describe Motivation::WrappedCheck, "#translation_key" do
|
142
157
|
let(:check) { OpenStruct.new }
|
143
|
-
let(:motivation) { stub(:motivation, :
|
158
|
+
let(:motivation) { stub(:motivation, :translation_key => "project") }
|
144
159
|
let(:wrapped_check) { Motivation::WrappedCheck.new(check, motivation) }
|
145
160
|
|
146
161
|
before do
|
@@ -156,16 +171,16 @@ describe Motivation::WrappedCheck, "#translation_key" do
|
|
156
171
|
end
|
157
172
|
|
158
173
|
context "for a incomplete step" do
|
159
|
-
it "generates a key like motivations.project.incomplete
|
174
|
+
it "generates a key like motivations.project.step_name.incomplete" do
|
160
175
|
check.flag = false
|
161
|
-
expect(wrapped_check.translation_key).to eq "motivations.project.incomplete
|
176
|
+
expect(wrapped_check.translation_key).to eq "motivations.project.foo_bar.incomplete"
|
162
177
|
end
|
163
178
|
end
|
164
179
|
|
165
180
|
context "for a completed step" do
|
166
|
-
it "generates a key like motivations.project.complete
|
181
|
+
it "generates a key like motivations.project.step_name.complete" do
|
167
182
|
check.flag = true
|
168
|
-
expect(wrapped_check.translation_key).to eq "motivations.project.complete
|
183
|
+
expect(wrapped_check.translation_key).to eq "motivations.project.foo_bar.complete"
|
169
184
|
end
|
170
185
|
end
|
171
186
|
end
|