motivation 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|