paths_of_glory 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.
- data/CHANGELOG +7 -0
 - data/README.md +73 -0
 - data/Rakefile +43 -0
 - data/achievement_system.gemspec +65 -0
 - data/app/models/achievement.rb +73 -0
 - data/app/models/achievements.rb +36 -0
 - data/generators/achievement/USAGE +0 -0
 - data/generators/achievement/achievement_generator.rb +32 -0
 - data/generators/achievement/templates/achievement.rb +19 -0
 - data/generators/achievement/templates/achievement_observer.rb +7 -0
 - data/generators/paths_of_glory/USAGE +5 -0
 - data/generators/paths_of_glory/paths_of_glory_generator.rb +30 -0
 - data/generators/paths_of_glory/templates/20100311101933_create_achievements.rb +16 -0
 - data/rails/init.rb +1 -0
 - data/spec/achievement_generator_spec.rb +50 -0
 - data/spec/achievement_spec.rb +102 -0
 - data/spec/blueprints.rb +6 -0
 - data/spec/database.yml +21 -0
 - data/spec/debug.log +4061 -0
 - data/spec/paths_of_glory_generator_spec.rb +38 -0
 - data/spec/schema.rb +33 -0
 - data/spec/spec_helper.rb +42 -0
 - metadata +88 -0
 
    
        data/CHANGELOG
    ADDED
    
    
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,73 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Paths of Glory
         
     | 
| 
      
 2 
     | 
    
         
            +
            ==============
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            Paths of Glory sets you on the road to achievements!
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            In short, it's a re-usable model for creating an achievement system.
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            It's extracted from http://peertester.com and inspired by: http://stackoverflow.com/questions/885277/how-to-implement-an-achievement-system-in-ror
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            Installation
         
     | 
| 
      
 13 
     | 
    
         
            +
            ============
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            Paths of Glory is easy to install.
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            As a plugin:
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                ./script/plugin install git://github.com/paulca/paths_of_glory.git
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            Or as a gem. Add this to your environment.rb:
         
     | 
| 
      
 22 
     | 
    
         
            +
              
         
     | 
| 
      
 23 
     | 
    
         
            +
                gem install paths_of_glory
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                config.gem 'paths_of_glory'
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            Then generate the migration:
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                ./script/generate paths_of_glory
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            And run the migration:
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                rake db:migrate
         
     | 
| 
      
 34 
     | 
    
         
            +
                
         
     | 
| 
      
 35 
     | 
    
         
            +
            This creates the tables.
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            Then, in your User model:
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
                class User < ActiveRecord::Base
         
     | 
| 
      
 40 
     | 
    
         
            +
                  include Achievements
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            Basic Usage
         
     | 
| 
      
 44 
     | 
    
         
            +
            ===========
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            Paths of Glory gives you access to a DSL to generate achievements. Achievements can have multiple levels or can just be standalone achievements.
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            The pattern is basically:
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            Create an achievement:
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                ./script/generate achievement Glory
         
     | 
| 
      
 53 
     | 
    
         
            +
                
         
     | 
| 
      
 54 
     | 
    
         
            +
            This gives you `app/models/achievements/glory.rb` and `app/models/achievements/glory_observer.rb` with some bootstrapped code.
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            You're on your own after that. Have fun!
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            Running the tests
         
     | 
| 
      
 60 
     | 
    
         
            +
            =================
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            You can run the tests by checking out the code into vendor/plugins of a Rails app and running:
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                rake
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
            About me
         
     | 
| 
      
 67 
     | 
    
         
            +
            ========
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
            I'm Paul Campbell. I'm an avid Ruby on Rails web developer. Follow my ramblings at [http://www.pabcas.com](http://www.pabcas.com)
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
            Follow me on Twitter [http://twitter.com/paulca](http://twitter.com/paulca)
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
            Copyright (c) 2010 Paul Campbell, released under the MIT license
         
     | 
    
        data/Rakefile
    ADDED
    
    | 
         @@ -0,0 +1,43 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rake'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'spec/rake/spectask'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            desc 'Default: run specs.'
         
     | 
| 
      
 5 
     | 
    
         
            +
            task :default => :spec
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            desc 'Run the specs'
         
     | 
| 
      
 8 
     | 
    
         
            +
            Spec::Rake::SpecTask.new(:spec) do |t|
         
     | 
| 
      
 9 
     | 
    
         
            +
              t.spec_opts = ['--colour --format progress --loadby mtime --reverse']
         
     | 
| 
      
 10 
     | 
    
         
            +
              t.spec_files = FileList['spec/**/*_spec.rb']
         
     | 
| 
      
 11 
     | 
    
         
            +
            end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            PKG_FILES = FileList[
         
     | 
| 
      
 14 
     | 
    
         
            +
              '[a-zA-Z]*',
         
     | 
| 
      
 15 
     | 
    
         
            +
              'app/**/*',
         
     | 
| 
      
 16 
     | 
    
         
            +
              'generators/**/*',
         
     | 
| 
      
 17 
     | 
    
         
            +
              'config/*',
         
     | 
| 
      
 18 
     | 
    
         
            +
              'lib/**/*',
         
     | 
| 
      
 19 
     | 
    
         
            +
              'rails/**/*',
         
     | 
| 
      
 20 
     | 
    
         
            +
              'spec/**/*',
         
     | 
| 
      
 21 
     | 
    
         
            +
              'features/**/*'
         
     | 
| 
      
 22 
     | 
    
         
            +
            ]
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            begin
         
     | 
| 
      
 25 
     | 
    
         
            +
              require 'jeweler'
         
     | 
| 
      
 26 
     | 
    
         
            +
              Jeweler::Tasks.new do |s|
         
     | 
| 
      
 27 
     | 
    
         
            +
                s.name = "paths_of_glory"
         
     | 
| 
      
 28 
     | 
    
         
            +
                s.version = "0.1.0"
         
     | 
| 
      
 29 
     | 
    
         
            +
                s.author = "Paul Campbell"
         
     | 
| 
      
 30 
     | 
    
         
            +
                s.email = "paul@rslw.com"
         
     | 
| 
      
 31 
     | 
    
         
            +
                s.homepage = "http://www.github.com/paulca/paths_of_glory"
         
     | 
| 
      
 32 
     | 
    
         
            +
                s.platform = Gem::Platform::RUBY
         
     | 
| 
      
 33 
     | 
    
         
            +
                s.summary = "Getting you started on the road to achievements."
         
     | 
| 
      
 34 
     | 
    
         
            +
                s.files = PKG_FILES.to_a
         
     | 
| 
      
 35 
     | 
    
         
            +
                s.require_path = "lib"
         
     | 
| 
      
 36 
     | 
    
         
            +
                s.has_rdoc = false
         
     | 
| 
      
 37 
     | 
    
         
            +
                s.extra_rdoc_files = ["README.md"]
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
            rescue LoadError
         
     | 
| 
      
 40 
     | 
    
         
            +
              puts "Jeweler not available. Install it with: sudo gem install jeweler"
         
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            Jeweler::GemcutterTasks.new
         
     | 
| 
         @@ -0,0 +1,65 @@ 
     | 
|
| 
      
 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{achievement_system}
         
     | 
| 
      
 8 
     | 
    
         
            +
              s.version = "0.1.0"
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         
     | 
| 
      
 11 
     | 
    
         
            +
              s.authors = ["Paul Campbell"]
         
     | 
| 
      
 12 
     | 
    
         
            +
              s.date = %q{2010-05-20}
         
     | 
| 
      
 13 
     | 
    
         
            +
              s.email = %q{paul@rslw.com}
         
     | 
| 
      
 14 
     | 
    
         
            +
              s.extra_rdoc_files = [
         
     | 
| 
      
 15 
     | 
    
         
            +
                "README.md"
         
     | 
| 
      
 16 
     | 
    
         
            +
              ]
         
     | 
| 
      
 17 
     | 
    
         
            +
              s.files = [
         
     | 
| 
      
 18 
     | 
    
         
            +
                "CHANGELOG",
         
     | 
| 
      
 19 
     | 
    
         
            +
                 "README.md",
         
     | 
| 
      
 20 
     | 
    
         
            +
                 "Rakefile",
         
     | 
| 
      
 21 
     | 
    
         
            +
                 "app/models/achievement.rb",
         
     | 
| 
      
 22 
     | 
    
         
            +
                 "app/models/achievements.rb",
         
     | 
| 
      
 23 
     | 
    
         
            +
                 "generators/achievement/USAGE",
         
     | 
| 
      
 24 
     | 
    
         
            +
                 "generators/achievement/achievement_generator.rb",
         
     | 
| 
      
 25 
     | 
    
         
            +
                 "generators/achievement/templates/achievement.rb",
         
     | 
| 
      
 26 
     | 
    
         
            +
                 "generators/achievement/templates/achievement_observer.rb",
         
     | 
| 
      
 27 
     | 
    
         
            +
                 "generators/paths_of_glory/USAGE",
         
     | 
| 
      
 28 
     | 
    
         
            +
                 "generators/paths_of_glory/paths_of_glory_generator.rb",
         
     | 
| 
      
 29 
     | 
    
         
            +
                 "generators/paths_of_glory/templates/20100311101933_create_achievements.rb",
         
     | 
| 
      
 30 
     | 
    
         
            +
                 "rails/init.rb",
         
     | 
| 
      
 31 
     | 
    
         
            +
                 "spec/achievement_generator_spec.rb",
         
     | 
| 
      
 32 
     | 
    
         
            +
                 "spec/achievement_spec.rb",
         
     | 
| 
      
 33 
     | 
    
         
            +
                 "spec/blueprints.rb",
         
     | 
| 
      
 34 
     | 
    
         
            +
                 "spec/database.yml",
         
     | 
| 
      
 35 
     | 
    
         
            +
                 "spec/debug.log",
         
     | 
| 
      
 36 
     | 
    
         
            +
                 "spec/paths_of_glory_generator_spec.rb",
         
     | 
| 
      
 37 
     | 
    
         
            +
                 "spec/schema.rb",
         
     | 
| 
      
 38 
     | 
    
         
            +
                 "spec/spec_helper.rb"
         
     | 
| 
      
 39 
     | 
    
         
            +
              ]
         
     | 
| 
      
 40 
     | 
    
         
            +
              s.has_rdoc = false
         
     | 
| 
      
 41 
     | 
    
         
            +
              s.homepage = %q{http://www.github.com/paulca/achievement_system}
         
     | 
| 
      
 42 
     | 
    
         
            +
              s.rdoc_options = ["--charset=UTF-8"]
         
     | 
| 
      
 43 
     | 
    
         
            +
              s.require_paths = ["lib"]
         
     | 
| 
      
 44 
     | 
    
         
            +
              s.rubygems_version = %q{1.3.6}
         
     | 
| 
      
 45 
     | 
    
         
            +
              s.summary = %q{Getting you started on the road to achievements.}
         
     | 
| 
      
 46 
     | 
    
         
            +
              s.test_files = [
         
     | 
| 
      
 47 
     | 
    
         
            +
                "spec/achievement_generator_spec.rb",
         
     | 
| 
      
 48 
     | 
    
         
            +
                 "spec/achievement_spec.rb",
         
     | 
| 
      
 49 
     | 
    
         
            +
                 "spec/blueprints.rb",
         
     | 
| 
      
 50 
     | 
    
         
            +
                 "spec/paths_of_glory_generator_spec.rb",
         
     | 
| 
      
 51 
     | 
    
         
            +
                 "spec/schema.rb",
         
     | 
| 
      
 52 
     | 
    
         
            +
                 "spec/spec_helper.rb"
         
     | 
| 
      
 53 
     | 
    
         
            +
              ]
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
              if s.respond_to? :specification_version then
         
     | 
| 
      
 56 
     | 
    
         
            +
                current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
         
     | 
| 
      
 57 
     | 
    
         
            +
                s.specification_version = 3
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
         
     | 
| 
      
 60 
     | 
    
         
            +
                else
         
     | 
| 
      
 61 
     | 
    
         
            +
                end
         
     | 
| 
      
 62 
     | 
    
         
            +
              else
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
            end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,73 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Achievement < ActiveRecord::Base
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              belongs_to :user
         
     | 
| 
      
 4 
     | 
    
         
            +
              
         
     | 
| 
      
 5 
     | 
    
         
            +
              named_scope :not_notified, :conditions => {:notified => false}
         
     | 
| 
      
 6 
     | 
    
         
            +
              named_scope :recent, :order => "created_at desc"
         
     | 
| 
      
 7 
     | 
    
         
            +
              named_scope :kind_of, lambda { |type| {:conditions => {:type => type.to_s}}} do
         
     | 
| 
      
 8 
     | 
    
         
            +
                def current
         
     | 
| 
      
 9 
     | 
    
         
            +
                  order("level desc").limit(1).first
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
              
         
     | 
| 
      
 13 
     | 
    
         
            +
              named_scope :order, lambda { |order| {:order => order} }
         
     | 
| 
      
 14 
     | 
    
         
            +
              named_scope :limit, lambda { |limit| {:limit => limit} }
         
     | 
| 
      
 15 
     | 
    
         
            +
              
         
     | 
| 
      
 16 
     | 
    
         
            +
              class << self
         
     | 
| 
      
 17 
     | 
    
         
            +
                def levels
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @levels ||= []
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def level(level, options = {})
         
     | 
| 
      
 22 
     | 
    
         
            +
                  levels << {:level => level, :quota => options[:quota]}
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
                
         
     | 
| 
      
 25 
     | 
    
         
            +
                def set_thing_to_check(&block)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  @thing_to_check = block
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
                
         
     | 
| 
      
 29 
     | 
    
         
            +
                def thing_to_check(object)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  @thing_to_check.call(object)
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
                
         
     | 
| 
      
 33 
     | 
    
         
            +
                def select_level(level)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  levels.select { |l| l[:level] == level }.first
         
     | 
| 
      
 35 
     | 
    
         
            +
                end
         
     | 
| 
      
 36 
     | 
    
         
            +
                
         
     | 
| 
      
 37 
     | 
    
         
            +
                def quota_for(level)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  select_level(level)[:quota] if select_level(level)
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
                
         
     | 
| 
      
 41 
     | 
    
         
            +
                def has_level?(level)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  select_level(level).present?
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
                
         
     | 
| 
      
 45 
     | 
    
         
            +
                def current_level(user)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  if current_achievement = user.achievements.kind_of(self).current
         
     | 
| 
      
 47 
     | 
    
         
            +
                    current_achievement.level
         
     | 
| 
      
 48 
     | 
    
         
            +
                  else
         
     | 
| 
      
 49 
     | 
    
         
            +
                    0
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
                
         
     | 
| 
      
 53 
     | 
    
         
            +
                def next_level(user)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  current_level(user) + 1
         
     | 
| 
      
 55 
     | 
    
         
            +
                end
         
     | 
| 
      
 56 
     | 
    
         
            +
                
         
     | 
| 
      
 57 
     | 
    
         
            +
                def current_progress(user)
         
     | 
| 
      
 58 
     | 
    
         
            +
                  thing_to_check(user) - quota_for(current_level(user)).to_i
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
                
         
     | 
| 
      
 61 
     | 
    
         
            +
                def next_level_quota(user)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  quota_for(next_level(user)) - quota_for(current_level(user)).to_i
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
                
         
     | 
| 
      
 65 
     | 
    
         
            +
                def progress_to_next_level(user)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  if(has_level?(next_level(user)))
         
     | 
| 
      
 67 
     | 
    
         
            +
                    return [(current_progress(user) * 100) / next_level_quota(user), 95].min
         
     | 
| 
      
 68 
     | 
    
         
            +
                  else
         
     | 
| 
      
 69 
     | 
    
         
            +
                    return nil
         
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
              end
         
     | 
| 
      
 73 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,36 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Achievements
         
     | 
| 
      
 2 
     | 
    
         
            +
              
         
     | 
| 
      
 3 
     | 
    
         
            +
              def self.included(base)
         
     | 
| 
      
 4 
     | 
    
         
            +
                base.class_eval do
         
     | 
| 
      
 5 
     | 
    
         
            +
                  has_many :achievements do
         
     | 
| 
      
 6 
     | 
    
         
            +
                    def include?(achievement, level = nil)
         
     | 
| 
      
 7 
     | 
    
         
            +
                      all.select { |a| a.type.to_s == achievement.to_s and a.level == level }.any?
         
     | 
| 
      
 8 
     | 
    
         
            +
                    end
         
     | 
| 
      
 9 
     | 
    
         
            +
                  end
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def award_achievement(achievement, level = nil)
         
     | 
| 
      
 14 
     | 
    
         
            +
                achievement.create!(:user => self, :level => level)
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
              
         
     | 
| 
      
 17 
     | 
    
         
            +
              def has_achievement?(achievement, level = nil)
         
     | 
| 
      
 18 
     | 
    
         
            +
                conditions = {:type => achievement.to_s, :user_id => id}    
         
     | 
| 
      
 19 
     | 
    
         
            +
                conditions[:level] = level if level
         
     | 
| 
      
 20 
     | 
    
         
            +
                achievements.first(:conditions => conditions).present?
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
              
         
     | 
| 
      
 23 
     | 
    
         
            +
              def get_badges_in_progress(badges)
         
     | 
| 
      
 24 
     | 
    
         
            +
                badges.collect do |achievement|
         
     | 
| 
      
 25 
     | 
    
         
            +
                  {
         
     | 
| 
      
 26 
     | 
    
         
            +
                    :type => achievement,
         
     | 
| 
      
 27 
     | 
    
         
            +
                    :level => achievement.next_level(self),
         
     | 
| 
      
 28 
     | 
    
         
            +
                    :progress => achievement.progress_to_next_level(self),
         
     | 
| 
      
 29 
     | 
    
         
            +
                    :next_level_quota => achievement.next_level_quota(self),
         
     | 
| 
      
 30 
     | 
    
         
            +
                    :current_progress => achievement.current_progress(self),
         
     | 
| 
      
 31 
     | 
    
         
            +
                    :next_level => achievement.next_level(self)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  }
         
     | 
| 
      
 33 
     | 
    
         
            +
                end.sort_by { |achievement| achievement[:progress] }.reverse[0,3]
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
              
         
     | 
| 
      
 36 
     | 
    
         
            +
            end
         
     | 
| 
         
            File without changes
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class AchievementGenerator < Rails::Generator::NamedBase
         
     | 
| 
      
 2 
     | 
    
         
            +
              def manifest
         
     | 
| 
      
 3 
     | 
    
         
            +
                record do |m|
         
     | 
| 
      
 4 
     | 
    
         
            +
                  m.class_collisions class_name, "#{class_name}"
         
     | 
| 
      
 5 
     | 
    
         
            +
                  m.class_collisions class_name, "#{class_name}Observer"
         
     | 
| 
      
 6 
     | 
    
         
            +
                  
         
     | 
| 
      
 7 
     | 
    
         
            +
                  m.directory 'app/models/achievements'
         
     | 
| 
      
 8 
     | 
    
         
            +
                  m.template "achievement.rb", "app/models/achievements/#{file_name}.rb"
         
     | 
| 
      
 9 
     | 
    
         
            +
                  m.template "achievement_observer.rb", "app/models/achievements/#{file_name}_observer.rb"
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def after_generate
         
     | 
| 
      
 14 
     | 
    
         
            +
                  puts "
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            Your new achievement, '#{class_name}' has been created.
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            Now you need to edit:
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                app/models/achievements/#{file_name}.rb
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            and
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                app/models/achievements/#{file_name}_observer.rb
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            Then you need to activate the observer, by adding ':#{file_name}_observer' to environment.rb, eg:
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                config.active_record.observers = :#{file_name}_observer
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            "
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,19 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class <%= class_name %> < Achievement
         
     | 
| 
      
 2 
     | 
    
         
            +
              
         
     | 
| 
      
 3 
     | 
    
         
            +
              # level 1, :quota => 5
         
     | 
| 
      
 4 
     | 
    
         
            +
              # level 2, :quota => 10
         
     | 
| 
      
 5 
     | 
    
         
            +
              # level 3, :quota => 30
         
     | 
| 
      
 6 
     | 
    
         
            +
              # level 4, :quota => 100
         
     | 
| 
      
 7 
     | 
    
         
            +
              # level 5, :quota => 500
         
     | 
| 
      
 8 
     | 
    
         
            +
              
         
     | 
| 
      
 9 
     | 
    
         
            +
              # set_thing_to_check { |user| ... }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              def self.award_achievements_for(user)
         
     | 
| 
      
 12 
     | 
    
         
            +
                return unless user
         
     | 
| 
      
 13 
     | 
    
         
            +
                levels.each do |level|
         
     | 
| 
      
 14 
     | 
    
         
            +
                  if user.not.has_achievement?(self, level[:level]) and thing_to_check(user) >= level[:quota]
         
     | 
| 
      
 15 
     | 
    
         
            +
                    user.award_achievement(self, level[:level])
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class PathsOfGloryGenerator < Rails::Generator::Base
         
     | 
| 
      
 2 
     | 
    
         
            +
              def manifest
         
     | 
| 
      
 3 
     | 
    
         
            +
                record do |m|
         
     | 
| 
      
 4 
     | 
    
         
            +
                  m.directory 'db/migrate'
         
     | 
| 
      
 5 
     | 
    
         
            +
                  m.file "20100311101933_create_achievements.rb", "db/migrate/20100311101933_create_achievements.rb"
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
              
         
     | 
| 
      
 9 
     | 
    
         
            +
              def after_generate
         
     | 
| 
      
 10 
     | 
    
         
            +
                puts "
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            You're on the Path to Glory
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            Now, add 'include Achievements' to your User model:
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                class User < ActiveRecord::Base
         
     | 
| 
      
 17 
     | 
    
         
            +
                  include Achievements
         
     | 
| 
      
 18 
     | 
    
         
            +
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            and run:
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                rake db:migrate,
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            To generate a new Achievement, run:
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                ./script/generate achievement Glory
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            where 'Glory' is the name of the achievement."
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class CreateAchievements < ActiveRecord::Migration
         
     | 
| 
      
 2 
     | 
    
         
            +
              def self.up
         
     | 
| 
      
 3 
     | 
    
         
            +
                create_table :achievements do |t|
         
     | 
| 
      
 4 
     | 
    
         
            +
                  t.string :type
         
     | 
| 
      
 5 
     | 
    
         
            +
                  t.integer :level
         
     | 
| 
      
 6 
     | 
    
         
            +
                  t.integer :user_id
         
     | 
| 
      
 7 
     | 
    
         
            +
                  t.notified :boolean, :default => false
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                  t.timestamps
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
              end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              def self.down
         
     | 
| 
      
 14 
     | 
    
         
            +
                drop_table :achievements
         
     | 
| 
      
 15 
     | 
    
         
            +
              end
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
    
        data/rails/init.rb
    ADDED
    
    | 
         @@ -0,0 +1 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'behavior'
         
     | 
| 
         @@ -0,0 +1,50 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rails_generator'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'rails_generator/scripts/generate'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            describe AchievementGenerator do
         
     | 
| 
      
 6 
     | 
    
         
            +
              
         
     | 
| 
      
 7 
     | 
    
         
            +
              before do
         
     | 
| 
      
 8 
     | 
    
         
            +
                @dirs = {}
         
     | 
| 
      
 9 
     | 
    
         
            +
                @dirs['achievements'] = fake_rails_root + '/app/models/achievements'
         
     | 
| 
      
 10 
     | 
    
         
            +
                @dirs.each do |key, dir|
         
     | 
| 
      
 11 
     | 
    
         
            +
                  FileUtils.mkdir_p(dir)
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
                @original_files = {}
         
     | 
| 
      
 14 
     | 
    
         
            +
                @original_files['achievements'] = file_list(@dirs['achievements'])
         
     | 
| 
      
 15 
     | 
    
         
            +
                Rails::Generator::Scripts::Generate.new.run(["achievement", 'glory'], :destination => fake_rails_root, :backtrace => true)
         
     | 
| 
      
 16 
     | 
    
         
            +
                
         
     | 
| 
      
 17 
     | 
    
         
            +
                @files = (file_list(@dirs['achievements']) - @original_files['achievements'])
         
     | 
| 
      
 18 
     | 
    
         
            +
              end
         
     | 
| 
      
 19 
     | 
    
         
            +
              
         
     | 
| 
      
 20 
     | 
    
         
            +
              let(:achievement_file) { @files.first }
         
     | 
| 
      
 21 
     | 
    
         
            +
              let(:observer_file) { @files.last }
         
     | 
| 
      
 22 
     | 
    
         
            +
              
         
     | 
| 
      
 23 
     | 
    
         
            +
              it "should create the achievement file" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                File.basename(achievement_file).should == "glory.rb"
         
     | 
| 
      
 25 
     | 
    
         
            +
                File.basename(observer_file).should == "glory_observer.rb"
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
              
         
     | 
| 
      
 28 
     | 
    
         
            +
              it "should make them beautiful" do
         
     | 
| 
      
 29 
     | 
    
         
            +
                File.read(achievement_file).should match(/Glory < Achievement/)
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
              
         
     | 
| 
      
 32 
     | 
    
         
            +
              it "should make them beautiful" do
         
     | 
| 
      
 33 
     | 
    
         
            +
                File.read(observer_file).should match(/GloryObserver < ActiveRecord::Observer/)
         
     | 
| 
      
 34 
     | 
    
         
            +
              end
         
     | 
| 
      
 35 
     | 
    
         
            +
              
         
     | 
| 
      
 36 
     | 
    
         
            +
              
         
     | 
| 
      
 37 
     | 
    
         
            +
              after do
         
     | 
| 
      
 38 
     | 
    
         
            +
                FileUtils.rm_r(fake_rails_root)
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
              
         
     | 
| 
      
 41 
     | 
    
         
            +
              
         
     | 
| 
      
 42 
     | 
    
         
            +
              def fake_rails_root
         
     | 
| 
      
 43 
     | 
    
         
            +
                File.join(File.dirname(__FILE__), 'spec', 'rails_root')
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              def file_list(dir)
         
     | 
| 
      
 47 
     | 
    
         
            +
                Dir.glob(File.join(dir, "*"))
         
     | 
| 
      
 48 
     | 
    
         
            +
              end
         
     | 
| 
      
 49 
     | 
    
         
            +
              
         
     | 
| 
      
 50 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,102 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Achievement do
         
     | 
| 
      
 4 
     | 
    
         
            +
              class Thing < Achievement
         
     | 
| 
      
 5 
     | 
    
         
            +
                level 1, :quota => 1
         
     | 
| 
      
 6 
     | 
    
         
            +
                level 2, :quota => 2
         
     | 
| 
      
 7 
     | 
    
         
            +
                
         
     | 
| 
      
 8 
     | 
    
         
            +
                set_thing_to_check {|u| u.sign_in_count }
         
     | 
| 
      
 9 
     | 
    
         
            +
              end
         
     | 
| 
      
 10 
     | 
    
         
            +
              
         
     | 
| 
      
 11 
     | 
    
         
            +
              class Dedicated < Achievement
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                level 1, :quota => 5
         
     | 
| 
      
 14 
     | 
    
         
            +
                level 2, :quota => 10
         
     | 
| 
      
 15 
     | 
    
         
            +
                level 3, :quota => 30
         
     | 
| 
      
 16 
     | 
    
         
            +
                level 4, :quota => 100
         
     | 
| 
      
 17 
     | 
    
         
            +
                level 5, :quota => 500
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                set_thing_to_check { |user| user.sign_in_count.to_i }
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def self.award_achievements_for(user)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  return unless user
         
     | 
| 
      
 23 
     | 
    
         
            +
                  levels.each do |level|
         
     | 
| 
      
 24 
     | 
    
         
            +
                    if !user.has_achievement?(self, level[:level]) and thing_to_check(user) >= level[:quota]
         
     | 
| 
      
 25 
     | 
    
         
            +
                      user.award_achievement(self, level[:level])
         
     | 
| 
      
 26 
     | 
    
         
            +
                    end
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
              
         
     | 
| 
      
 31 
     | 
    
         
            +
              class User < ActiveRecord::Base
         
     | 
| 
      
 32 
     | 
    
         
            +
                include Achievements
         
     | 
| 
      
 33 
     | 
    
         
            +
                
         
     | 
| 
      
 34 
     | 
    
         
            +
                def after_save
         
     | 
| 
      
 35 
     | 
    
         
            +
                  Dedicated.award_achievements_for(self) if sign_in_count_changed?
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
              
         
     | 
| 
      
 39 
     | 
    
         
            +
              User.blueprint do
         
     | 
| 
      
 40 
     | 
    
         
            +
                email 'joe@king.com'
         
     | 
| 
      
 41 
     | 
    
         
            +
                encrypted_password 'blah'
         
     | 
| 
      
 42 
     | 
    
         
            +
                password_salt 'are you joking?'
         
     | 
| 
      
 43 
     | 
    
         
            +
              end
         
     | 
| 
      
 44 
     | 
    
         
            +
              
         
     | 
| 
      
 45 
     | 
    
         
            +
              it "should have 2 levels" do
         
     | 
| 
      
 46 
     | 
    
         
            +
                Thing.levels.size.should == 2
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
              
         
     | 
| 
      
 49 
     | 
    
         
            +
              it "should have a levels array" do
         
     | 
| 
      
 50 
     | 
    
         
            +
                Thing.levels.should == [{:quota=> 1, :level =>1}, {:quota=>2, :level=>2}]
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
              
         
     | 
| 
      
 53 
     | 
    
         
            +
              describe ".quota_for" do
         
     | 
| 
      
 54 
     | 
    
         
            +
                it "should give me back the quota" do
         
     | 
| 
      
 55 
     | 
    
         
            +
                  Dedicated.quota_for(2).should == 10
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
              
         
     | 
| 
      
 59 
     | 
    
         
            +
              describe ".has_level?" do
         
     | 
| 
      
 60 
     | 
    
         
            +
                it "should tell me if it has a level" do
         
     | 
| 
      
 61 
     | 
    
         
            +
                  Dedicated.has_level?(1).should be_true
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
                
         
     | 
| 
      
 64 
     | 
    
         
            +
                it "should tell me if it doesn't have a level" do
         
     | 
| 
      
 65 
     | 
    
         
            +
                  Dedicated.has_level?(6).should be_false
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
              end
         
     | 
| 
      
 68 
     | 
    
         
            +
              
         
     | 
| 
      
 69 
     | 
    
         
            +
              describe ".progress_to_next_level" do
         
     | 
| 
      
 70 
     | 
    
         
            +
                before do
         
     | 
| 
      
 71 
     | 
    
         
            +
                  @user = User.make(:sign_in_count => 2)
         
     | 
| 
      
 72 
     | 
    
         
            +
                end
         
     | 
| 
      
 73 
     | 
    
         
            +
                
         
     | 
| 
      
 74 
     | 
    
         
            +
                it "should tell me the thing to check" do
         
     | 
| 
      
 75 
     | 
    
         
            +
                  Thing.thing_to_check(@user).should == 2
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
                
         
     | 
| 
      
 78 
     | 
    
         
            +
                it "should show me that I'm 40% the way to dedicated" do
         
     | 
| 
      
 79 
     | 
    
         
            +
                  Dedicated.progress_to_next_level(@user).should == 40
         
     | 
| 
      
 80 
     | 
    
         
            +
                end
         
     | 
| 
      
 81 
     | 
    
         
            +
                
         
     | 
| 
      
 82 
     | 
    
         
            +
                it "should update the progress as things happen" do
         
     | 
| 
      
 83 
     | 
    
         
            +
                  @user.update_attribute(:sign_in_count, 4)
         
     | 
| 
      
 84 
     | 
    
         
            +
                  Dedicated.progress_to_next_level(@user).should == 80
         
     | 
| 
      
 85 
     | 
    
         
            +
                end
         
     | 
| 
      
 86 
     | 
    
         
            +
                
         
     | 
| 
      
 87 
     | 
    
         
            +
                it "should work for more than one level" do
         
     | 
| 
      
 88 
     | 
    
         
            +
                  @user.sign_in_count = 5
         
     | 
| 
      
 89 
     | 
    
         
            +
                  @user.save!
         
     | 
| 
      
 90 
     | 
    
         
            +
                  Dedicated.thing_to_check(@user).should == 5
         
     | 
| 
      
 91 
     | 
    
         
            +
                  Dedicated.progress_to_next_level(@user).should == 0
         
     | 
| 
      
 92 
     | 
    
         
            +
                  @user.update_attribute(:sign_in_count, 6)
         
     | 
| 
      
 93 
     | 
    
         
            +
                  Dedicated.progress_to_next_level(@user).should == 20
         
     | 
| 
      
 94 
     | 
    
         
            +
                end
         
     | 
| 
      
 95 
     | 
    
         
            +
                
         
     | 
| 
      
 96 
     | 
    
         
            +
                it "should return nil finally" do
         
     | 
| 
      
 97 
     | 
    
         
            +
                  @user.sign_in_count = 500
         
     | 
| 
      
 98 
     | 
    
         
            +
                  @user.save!
         
     | 
| 
      
 99 
     | 
    
         
            +
                  Dedicated.progress_to_next_level(@user).should be_nil
         
     | 
| 
      
 100 
     | 
    
         
            +
                end
         
     | 
| 
      
 101 
     | 
    
         
            +
              end
         
     | 
| 
      
 102 
     | 
    
         
            +
            end
         
     | 
    
        data/spec/blueprints.rb
    ADDED
    
    
    
        data/spec/database.yml
    ADDED
    
    | 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            sqlite:
         
     | 
| 
      
 2 
     | 
    
         
            +
              :adapter: sqlite
         
     | 
| 
      
 3 
     | 
    
         
            +
              :database: spec/paths_of_glory.sqlite.db
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            sqlite3:
         
     | 
| 
      
 6 
     | 
    
         
            +
              :adapter: sqlite3
         
     | 
| 
      
 7 
     | 
    
         
            +
              :database: spec/paths_of_glory.sqlite3.db
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            postgresql:
         
     | 
| 
      
 10 
     | 
    
         
            +
              :adapter: postgresql
         
     | 
| 
      
 11 
     | 
    
         
            +
              :username: postgres
         
     | 
| 
      
 12 
     | 
    
         
            +
              :password: postgres
         
     | 
| 
      
 13 
     | 
    
         
            +
              :database: paths_of_glory_test
         
     | 
| 
      
 14 
     | 
    
         
            +
              :min_messages: ERROR
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            mysql:
         
     | 
| 
      
 17 
     | 
    
         
            +
              :adapter: mysql
         
     | 
| 
      
 18 
     | 
    
         
            +
              :host: localhost
         
     | 
| 
      
 19 
     | 
    
         
            +
              :username: root
         
     | 
| 
      
 20 
     | 
    
         
            +
              :password: password
         
     | 
| 
      
 21 
     | 
    
         
            +
              :database: paths_of_glory_test
         
     |