supermodel 0.1.0 → 0.1.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/.gitignore +1 -0
- data/VERSION +1 -1
- data/lib/supermodel/base.rb +15 -14
- data/lib/supermodel/marshal.rb +26 -7
- data/lib/supermodel/redis.rb +10 -10
- data/supermodel.gemspec +3 -3
- metadata +21 -9
    
        data/.gitignore
    CHANGED
    
    
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.1. | 
| 1 | 
            +
            0.1.2
         | 
    
        data/lib/supermodel/base.rb
    CHANGED
    
    | @@ -11,15 +11,16 @@ module SuperModel | |
| 11 11 | 
             
                  end
         | 
| 12 12 |  | 
| 13 13 | 
             
                  def records
         | 
| 14 | 
            -
                    @records ||=  | 
| 14 | 
            +
                    @records ||= {}
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 |  | 
| 17 17 | 
             
                  def find_by_attribute(name, value) #:nodoc:
         | 
| 18 | 
            -
                    records.find {|r| r.send(name) == value }
         | 
| 18 | 
            +
                    item = records.values.find {|r| r.send(name) == value }
         | 
| 19 | 
            +
                    item && item.dup
         | 
| 19 20 | 
             
                  end
         | 
| 20 21 |  | 
| 21 22 | 
             
                  def raw_find(id) #:nodoc:
         | 
| 22 | 
            -
                     | 
| 23 | 
            +
                    records[id] || raise(UnknownRecord)
         | 
| 23 24 | 
             
                  end
         | 
| 24 25 |  | 
| 25 26 | 
             
                  # Find record by ID, or raise.
         | 
| @@ -30,12 +31,12 @@ module SuperModel | |
| 30 31 | 
             
                  alias :[] :find
         | 
| 31 32 |  | 
| 32 33 | 
             
                  def first
         | 
| 33 | 
            -
                    item = records[0]
         | 
| 34 | 
            +
                    item = records.values[0]
         | 
| 34 35 | 
             
                    item && item.dup
         | 
| 35 36 | 
             
                  end
         | 
| 36 37 |  | 
| 37 38 | 
             
                  def last
         | 
| 38 | 
            -
                    item = records[-1]
         | 
| 39 | 
            +
                    item = records.values[-1]
         | 
| 39 40 | 
             
                    item && item.dup
         | 
| 40 41 | 
             
                  end
         | 
| 41 42 |  | 
| @@ -44,7 +45,7 @@ module SuperModel | |
| 44 45 | 
             
                  end
         | 
| 45 46 |  | 
| 46 47 | 
             
                  def all
         | 
| 47 | 
            -
                    records.dup
         | 
| 48 | 
            +
                    records.values.dup
         | 
| 48 49 | 
             
                  end
         | 
| 49 50 |  | 
| 50 51 | 
             
                  def update(id, atts)
         | 
| @@ -72,7 +73,7 @@ module SuperModel | |
| 72 73 | 
             
                  #   create(:name => "foo", :id => 1)
         | 
| 73 74 | 
             
                  def create(atts = {})
         | 
| 74 75 | 
             
                    rec = self.new(atts)
         | 
| 75 | 
            -
                    rec.save && rec
         | 
| 76 | 
            +
                    rec.save! && rec
         | 
| 76 77 | 
             
                  end
         | 
| 77 78 |  | 
| 78 79 | 
             
                  def method_missing(method_symbol, *args) #:nodoc:
         | 
| @@ -91,7 +92,7 @@ module SuperModel | |
| 91 92 | 
             
                end
         | 
| 92 93 |  | 
| 93 94 | 
             
                attr_accessor :attributes
         | 
| 94 | 
            -
                attr_writer | 
| 95 | 
            +
                attr_writer   :new_record
         | 
| 95 96 |  | 
| 96 97 | 
             
                def known_attributes
         | 
| 97 98 | 
             
                  self.class.known_attributes + self.attributes.keys.map(&:to_s)
         | 
| @@ -192,10 +193,6 @@ module SuperModel | |
| 192 193 | 
             
                    super
         | 
| 193 194 | 
             
                  end
         | 
| 194 195 | 
             
                end
         | 
| 195 | 
            -
                    
         | 
| 196 | 
            -
                def raw_destroy
         | 
| 197 | 
            -
                  self.class.records.delete(self)
         | 
| 198 | 
            -
                end
         | 
| 199 196 |  | 
| 200 197 | 
             
                def destroy
         | 
| 201 198 | 
             
                  raw_destroy
         | 
| @@ -215,8 +212,12 @@ module SuperModel | |
| 215 212 | 
             
                    object_id
         | 
| 216 213 | 
             
                  end
         | 
| 217 214 |  | 
| 215 | 
            +
                  def raw_destroy
         | 
| 216 | 
            +
                    self.class.records.delete(self.id)
         | 
| 217 | 
            +
                  end
         | 
| 218 | 
            +
                  
         | 
| 218 219 | 
             
                  def raw_create
         | 
| 219 | 
            -
                    self.class.records  | 
| 220 | 
            +
                    self.class.records[self.id] = self.dup
         | 
| 220 221 | 
             
                  end
         | 
| 221 222 |  | 
| 222 223 | 
             
                  def create
         | 
| @@ -262,6 +263,6 @@ module SuperModel | |
| 262 263 | 
             
                include ActiveModel::Conversion
         | 
| 263 264 | 
             
                include ActiveModel::Serializers::JSON
         | 
| 264 265 | 
             
                include ActiveModel::Serializers::Xml
         | 
| 265 | 
            -
                include Dirty, Observing,  | 
| 266 | 
            +
                include Dirty, Observing, Callbacks, Validations
         | 
| 266 267 | 
             
              end
         | 
| 267 268 | 
             
            end
         | 
    
        data/lib/supermodel/marshal.rb
    CHANGED
    
    | @@ -18,11 +18,19 @@ module SuperModel | |
| 18 18 | 
             
                def load
         | 
| 19 19 | 
             
                  return unless path
         | 
| 20 20 | 
             
                  return unless File.exist?(path)
         | 
| 21 | 
            -
                   | 
| 22 | 
            -
                  File.open(path, "rb")  | 
| 23 | 
            -
                     | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 21 | 
            +
                  data = []
         | 
| 22 | 
            +
                  File.open(path, "rb") do |file|
         | 
| 23 | 
            +
                    begin
         | 
| 24 | 
            +
                      data = ::Marshal.load(file)
         | 
| 25 | 
            +
                    rescue
         | 
| 26 | 
            +
                      # Lots of errors can occur during
         | 
| 27 | 
            +
                      # marshaling - such as EOF etc
         | 
| 28 | 
            +
                      return false
         | 
| 29 | 
            +
                    end
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                  data.each do |klass, records| 
         | 
| 32 | 
            +
                    klass.marshal_records(records)
         | 
| 33 | 
            +
                  end
         | 
| 26 34 | 
             
                  true
         | 
| 27 35 | 
             
                end
         | 
| 28 36 |  | 
| @@ -30,8 +38,11 @@ module SuperModel | |
| 30 38 | 
             
                  return unless path
         | 
| 31 39 | 
             
                  tmp_file = Tempfile.new("rbdump")
         | 
| 32 40 | 
             
                  tmp_file.binmode
         | 
| 33 | 
            -
                   | 
| 34 | 
            -
             | 
| 41 | 
            +
                  data = klasses.inject({}) {|hash, klass|
         | 
| 42 | 
            +
                    hash[klass] = klass.marshal_records
         | 
| 43 | 
            +
                    hash
         | 
| 44 | 
            +
                  }
         | 
| 45 | 
            +
                  ::Marshal.dump(data, tmp_file)
         | 
| 35 46 | 
             
                  # Atomic serialization - so we never corrupt the db
         | 
| 36 47 | 
             
                  FileUtils.mv(tmp_file.path, path)
         | 
| 37 48 | 
             
                  true
         | 
| @@ -41,6 +52,7 @@ module SuperModel | |
| 41 52 |  | 
| 42 53 | 
             
                module Model
         | 
| 43 54 | 
             
                  def self.included(base)
         | 
| 55 | 
            +
                    base.extend ClassMethods
         | 
| 44 56 | 
             
                    Marshal.klasses << base
         | 
| 45 57 | 
             
                  end
         | 
| 46 58 |  | 
| @@ -53,6 +65,13 @@ module SuperModel | |
| 53 65 | 
             
                    # isn't setup properly
         | 
| 54 66 | 
             
                    @attributes = atts
         | 
| 55 67 | 
             
                  end
         | 
| 68 | 
            +
                  
         | 
| 69 | 
            +
                  module ClassMethods
         | 
| 70 | 
            +
                    def marshal_records(records = nil)
         | 
| 71 | 
            +
                      @records = records if records
         | 
| 72 | 
            +
                      @records
         | 
| 73 | 
            +
                    end
         | 
| 74 | 
            +
                  end
         | 
| 56 75 | 
             
                end
         | 
| 57 76 | 
             
              end
         | 
| 58 77 | 
             
            end
         | 
    
        data/lib/supermodel/redis.rb
    CHANGED
    
    | @@ -87,19 +87,19 @@ module SuperModel | |
| 87 87 | 
             
                  def id
         | 
| 88 88 | 
             
                    super.try(:to_i)
         | 
| 89 89 | 
             
                  end
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                   | 
| 92 | 
            -
                     | 
| 90 | 
            +
                
         | 
| 91 | 
            +
                  protected      
         | 
| 92 | 
            +
                    def raw_destroy
         | 
| 93 | 
            +
                      return if new?
         | 
| 93 94 |  | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 95 | 
            +
                      destroy_indexes
         | 
| 96 | 
            +
                      redis.set_delete(self.class.redis_key, self.id)
         | 
| 96 97 |  | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 98 | 
            +
                      attributes.keys.each do |key|
         | 
| 99 | 
            +
                        redis.delete(redis_key(key))
         | 
| 100 | 
            +
                      end
         | 
| 99 101 | 
             
                    end
         | 
| 100 | 
            -
                   | 
| 101 | 
            -
                
         | 
| 102 | 
            -
                  protected
         | 
| 102 | 
            +
                  
         | 
| 103 103 | 
             
                    def destroy_indexes
         | 
| 104 104 | 
             
                      indexed_attributes.each do |index|
         | 
| 105 105 | 
             
                        old_attribute = changes[index].try(:first) || send(index)
         | 
    
        data/supermodel.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{supermodel}
         | 
| 8 | 
            -
              s.version = "0.1. | 
| 8 | 
            +
              s.version = "0.1.2"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["Alex MacCaw"]
         | 
| 12 | 
            -
              s.date = %q{2010- | 
| 12 | 
            +
              s.date = %q{2010-03-11}
         | 
| 13 13 | 
             
              s.description = %q{In memory DB using ActiveModel}
         | 
| 14 14 | 
             
              s.email = %q{info@eribium.org}
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
| @@ -36,7 +36,7 @@ Gem::Specification.new do |s| | |
| 36 36 | 
             
              s.homepage = %q{http://github.com/maccman/supermodel}
         | 
| 37 37 | 
             
              s.rdoc_options = ["--charset=UTF-8"]
         | 
| 38 38 | 
             
              s.require_paths = ["lib"]
         | 
| 39 | 
            -
              s.rubygems_version = %q{1.3. | 
| 39 | 
            +
              s.rubygems_version = %q{1.3.6}
         | 
| 40 40 | 
             
              s.summary = %q{In memory DB using ActiveModel}
         | 
| 41 41 |  | 
| 42 42 | 
             
              if s.respond_to? :specification_version then
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,12 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: supermodel
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
               | 
| 4 | 
            +
              prerelease: false
         | 
| 5 | 
            +
              segments: 
         | 
| 6 | 
            +
              - 0
         | 
| 7 | 
            +
              - 1
         | 
| 8 | 
            +
              - 2
         | 
| 9 | 
            +
              version: 0.1.2
         | 
| 5 10 | 
             
            platform: ruby
         | 
| 6 11 | 
             
            authors: 
         | 
| 7 12 | 
             
            - Alex MacCaw
         | 
| @@ -9,19 +14,24 @@ autorequire: | |
| 9 14 | 
             
            bindir: bin
         | 
| 10 15 | 
             
            cert_chain: []
         | 
| 11 16 |  | 
| 12 | 
            -
            date: 2010- | 
| 17 | 
            +
            date: 2010-03-11 00:00:00 +00:00
         | 
| 13 18 | 
             
            default_executable: 
         | 
| 14 19 | 
             
            dependencies: 
         | 
| 15 20 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 16 21 | 
             
              name: activemodel
         | 
| 17 | 
            -
               | 
| 18 | 
            -
               | 
| 19 | 
            -
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| 22 | 
            +
              prerelease: false
         | 
| 23 | 
            +
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 20 24 | 
             
                requirements: 
         | 
| 21 25 | 
             
                - - ">="
         | 
| 22 26 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 27 | 
            +
                    segments: 
         | 
| 28 | 
            +
                    - 3
         | 
| 29 | 
            +
                    - 0
         | 
| 30 | 
            +
                    - 0
         | 
| 31 | 
            +
                    - beta
         | 
| 23 32 | 
             
                    version: 3.0.0.beta
         | 
| 24 | 
            -
             | 
| 33 | 
            +
              type: :runtime
         | 
| 34 | 
            +
              version_requirements: *id001
         | 
| 25 35 | 
             
            description: In memory DB using ActiveModel
         | 
| 26 36 | 
             
            email: info@eribium.org
         | 
| 27 37 | 
             
            executables: []
         | 
| @@ -60,18 +70,20 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 60 70 | 
             
              requirements: 
         | 
| 61 71 | 
             
              - - ">="
         | 
| 62 72 | 
             
                - !ruby/object:Gem::Version 
         | 
| 73 | 
            +
                  segments: 
         | 
| 74 | 
            +
                  - 0
         | 
| 63 75 | 
             
                  version: "0"
         | 
| 64 | 
            -
              version: 
         | 
| 65 76 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 66 77 | 
             
              requirements: 
         | 
| 67 78 | 
             
              - - ">="
         | 
| 68 79 | 
             
                - !ruby/object:Gem::Version 
         | 
| 80 | 
            +
                  segments: 
         | 
| 81 | 
            +
                  - 0
         | 
| 69 82 | 
             
                  version: "0"
         | 
| 70 | 
            -
              version: 
         | 
| 71 83 | 
             
            requirements: []
         | 
| 72 84 |  | 
| 73 85 | 
             
            rubyforge_project: 
         | 
| 74 | 
            -
            rubygems_version: 1.3. | 
| 86 | 
            +
            rubygems_version: 1.3.6
         | 
| 75 87 | 
             
            signing_key: 
         | 
| 76 88 | 
             
            specification_version: 3
         | 
| 77 89 | 
             
            summary: In memory DB using ActiveModel
         |