progression 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 +45 -4
- data/VERSION +1 -1
- data/lib/progression.rb +16 -6
- data/progression.gemspec +64 -0
- data/rails/init.rb +1 -0
- data/spec/progression_spec.rb +61 -1
- metadata +4 -2
data/README.md
CHANGED
@@ -28,17 +28,48 @@ either coupled with ActiveRecord or ActionController in some way.
|
|
28
28
|
|
29
29
|
user = User.new
|
30
30
|
user.registration_progress.completed_steps # => []
|
31
|
-
user.registration_progress.
|
32
|
-
user.next_step.name # => :step_1
|
31
|
+
user.registration_progress.percentage_completed # => 0.0
|
32
|
+
user.registration_progress.next_step.name # => :step_1
|
33
33
|
|
34
34
|
user.first_name = "Michael"
|
35
35
|
user.last_name = "Jordan"
|
36
36
|
user.registration_progress.completed_steps # => [:step_1]
|
37
|
-
user.registration_progress.
|
38
|
-
user.next_step.name # => :step_2
|
37
|
+
user.registration_progress.percentage_completed # => 50.0
|
38
|
+
user.registration_progress.next_step.name # => :step_2
|
39
39
|
|
40
40
|
...
|
41
41
|
|
42
|
+
## Custom Percentages
|
43
|
+
|
44
|
+
progression provides support for defining your own percentages for
|
45
|
+
each step rather than having them predefined as (1 / number_of_steps).
|
46
|
+
|
47
|
+
class User < Struct.new(:first_name, :last_name, :email, :phone)
|
48
|
+
|
49
|
+
include Progression
|
50
|
+
|
51
|
+
progression :registration do
|
52
|
+
step :important_step, :percentage => 50.0 do
|
53
|
+
first_name.present? && last_name.present?
|
54
|
+
end
|
55
|
+
|
56
|
+
step :step_2, :percentage => 25.0 do
|
57
|
+
email.present?
|
58
|
+
end
|
59
|
+
|
60
|
+
step :step_3, :percentage => 25.0 do
|
61
|
+
phone.present?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
user = User.new
|
67
|
+
user.first_name = "Michael"
|
68
|
+
user.last_name = "Jordan"
|
69
|
+
user.registration_progress.completed_steps # => [:important_step]
|
70
|
+
user.registration_progress.percentage_completed # => 50.0
|
71
|
+
user.registration_progress.next_step.name # => :step_2
|
72
|
+
|
42
73
|
|
43
74
|
## Utility classes
|
44
75
|
|
@@ -68,6 +99,16 @@ either coupled with ActiveRecord or ActionController in some way.
|
|
68
99
|
progress.percentage_completed # => 100.0
|
69
100
|
progress.next_step # => nil
|
70
101
|
|
102
|
+
## Rails / ActiveRecord
|
103
|
+
|
104
|
+
You can use progression as a gem or a plugin in your Rails application. progression does not make any assumptions about the objects that you are interested in extending.
|
105
|
+
|
106
|
+
Simply add an initializer:
|
107
|
+
|
108
|
+
config/initializers/progression.rb
|
109
|
+
|
110
|
+
ActiveRecord::Base.send(:include, Progression)
|
111
|
+
|
71
112
|
## Note on Patches/Pull Requests
|
72
113
|
|
73
114
|
* Fork the project.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/lib/progression.rb
CHANGED
@@ -24,17 +24,24 @@ module Progression
|
|
24
24
|
|
25
25
|
def initialize(&block)
|
26
26
|
@steps = []
|
27
|
+
@percentage_values = {}
|
27
28
|
instance_exec &block if block_given?
|
28
29
|
end
|
29
30
|
|
30
31
|
def progress_for(object)
|
31
|
-
Progress.new(object,
|
32
|
+
Progress.new(object, self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def percentage_value_for(step)
|
36
|
+
@percentage_values[step] || (1 / steps.size.to_f) * 100
|
32
37
|
end
|
33
38
|
|
34
39
|
private
|
35
40
|
|
36
|
-
def step(name, &block)
|
37
|
-
|
41
|
+
def step(name, options = {}, &block)
|
42
|
+
step = Step.new(name, &block)
|
43
|
+
@steps << step
|
44
|
+
@percentage_values[step] = options[:percentage] if options[:percentage]
|
38
45
|
end
|
39
46
|
|
40
47
|
end
|
@@ -43,9 +50,10 @@ module Progression
|
|
43
50
|
|
44
51
|
attr_reader :steps
|
45
52
|
|
46
|
-
def initialize(object,
|
53
|
+
def initialize(object, progression)
|
47
54
|
@object = object
|
48
|
-
@
|
55
|
+
@progression = progression
|
56
|
+
@steps = progression.steps
|
49
57
|
end
|
50
58
|
|
51
59
|
def completed_steps
|
@@ -55,7 +63,9 @@ module Progression
|
|
55
63
|
end
|
56
64
|
|
57
65
|
def percentage_completed
|
58
|
-
|
66
|
+
completed_steps.inject(0) do |percentage_completed, step|
|
67
|
+
percentage_completed + @progression.percentage_value_for(step)
|
68
|
+
end
|
59
69
|
end
|
60
70
|
|
61
71
|
def next_step
|
data/progression.gemspec
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{progression}
|
8
|
+
s.version = "0.0.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Michael Guterl"]
|
12
|
+
s.date = %q{2010-04-22}
|
13
|
+
s.description = %q{progression provides a set of simple utility classes and a DSL for
|
14
|
+
measuring an objects progress through a progression of steps. This is
|
15
|
+
especially useful for defining and calculating profile completion
|
16
|
+
status in a social application.
|
17
|
+
|
18
|
+
There are a few existing solutions similar to progression, but they
|
19
|
+
try to do too much. The other options that I am familiar with are
|
20
|
+
either coupled with ActiveRecord or ActionController in some way.
|
21
|
+
}
|
22
|
+
s.email = %q{mguterl@gmail.com}
|
23
|
+
s.extra_rdoc_files = [
|
24
|
+
"LICENSE",
|
25
|
+
"README.md"
|
26
|
+
]
|
27
|
+
s.files = [
|
28
|
+
".document",
|
29
|
+
".gitignore",
|
30
|
+
"LICENSE",
|
31
|
+
"README.md",
|
32
|
+
"Rakefile",
|
33
|
+
"VERSION",
|
34
|
+
"lib/progression.rb",
|
35
|
+
"progression.gemspec",
|
36
|
+
"rails/init.rb",
|
37
|
+
"spec/progression_spec.rb",
|
38
|
+
"spec/spec.opts",
|
39
|
+
"spec/spec_helper.rb"
|
40
|
+
]
|
41
|
+
s.homepage = %q{http://github.com/mguterl/progression}
|
42
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
43
|
+
s.require_paths = ["lib"]
|
44
|
+
s.rubygems_version = %q{1.3.6}
|
45
|
+
s.summary = %q{progression provides a set of simple utility classes and a DSL for measuring an objects progress through a progression of steps}
|
46
|
+
s.test_files = [
|
47
|
+
"spec/progression_spec.rb",
|
48
|
+
"spec/spec_helper.rb"
|
49
|
+
]
|
50
|
+
|
51
|
+
if s.respond_to? :specification_version then
|
52
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
53
|
+
s.specification_version = 3
|
54
|
+
|
55
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
56
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
57
|
+
else
|
58
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
59
|
+
end
|
60
|
+
else
|
61
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'progression'
|
data/spec/progression_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec/spec_helper'
|
2
2
|
|
3
|
-
class Profile < Struct.new(:first_name, :last_name)
|
3
|
+
class Profile < Struct.new(:first_name, :last_name, :email)
|
4
4
|
|
5
5
|
include Progression
|
6
6
|
|
@@ -16,6 +16,21 @@ class Profile < Struct.new(:first_name, :last_name)
|
|
16
16
|
|
17
17
|
end
|
18
18
|
|
19
|
+
progression :registration do
|
20
|
+
|
21
|
+
step :step_1, :percentage => 25.0 do
|
22
|
+
!first_name.blank?
|
23
|
+
end
|
24
|
+
|
25
|
+
step :step_2, :percentage => 25.0 do
|
26
|
+
!last_name.blank?
|
27
|
+
end
|
28
|
+
|
29
|
+
step :step_3, :percentage => 50.0 do
|
30
|
+
!email.blank?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
19
34
|
# def self.profile_progression
|
20
35
|
# @progression ||= Progression::Progression.new do
|
21
36
|
# steps << Progression::Step.new(:step_1) { !first_name.blank? }
|
@@ -94,4 +109,49 @@ describe "Progression" do
|
|
94
109
|
|
95
110
|
end
|
96
111
|
|
112
|
+
describe "explicit percentages" do
|
113
|
+
|
114
|
+
before do
|
115
|
+
@profile = Profile.new
|
116
|
+
@progression = @profile.registration_progress
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should return a list of steps' do
|
120
|
+
@progression.should have(3).steps
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should return a list of completed steps' do
|
124
|
+
@progression.should have(0).completed_steps
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should return the percentage completed' do
|
128
|
+
@progression.percentage_completed.should == 0.0
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should return the next step to be completed' do
|
132
|
+
@progression.next_step.name.should == :step_1
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "after last step" do
|
136
|
+
|
137
|
+
before do
|
138
|
+
@profile.email = "foo@bar.com"
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'should return a list of completed steps' do
|
142
|
+
@progression.should have(1).completed_steps
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'should return the percentage completed' do
|
146
|
+
@progression.percentage_completed.should == 50.0
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'should return the next step to be completed' do
|
150
|
+
@progression.next_step.name.should == :step_1
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
97
157
|
end
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Michael Guterl
|
@@ -57,6 +57,8 @@ files:
|
|
57
57
|
- Rakefile
|
58
58
|
- VERSION
|
59
59
|
- lib/progression.rb
|
60
|
+
- progression.gemspec
|
61
|
+
- rails/init.rb
|
60
62
|
- spec/progression_spec.rb
|
61
63
|
- spec/spec.opts
|
62
64
|
- spec/spec_helper.rb
|