ohm-sorted 0.3.1 → 0.3.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.
- checksums.yaml +9 -9
- data/CHANGELOG.md +12 -0
- data/Gemfile +1 -4
- data/Rakefile +0 -1
- data/lib/ohm/sorted.rb +35 -20
- data/ohm-sorted.gemspec +5 -1
- data/test/sorted_test.rb +44 -1
- metadata +46 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,15 +1,15 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            !binary "U0hBMQ==":
         | 
| 3 3 | 
             
              metadata.gz: !binary |-
         | 
| 4 | 
            -
                 | 
| 4 | 
            +
                NzM0ZTQ4YmIwNjYzYjUzNTlhOTQwYjgxNGVkNWRlYzhjMzJiNTFlMQ==
         | 
| 5 5 | 
             
              data.tar.gz: !binary |-
         | 
| 6 | 
            -
                 | 
| 7 | 
            -
             | 
| 6 | 
            +
                YWU4MmQ1MTU2ZjAwOGU4MTY2YTgwNmEwYmM3MDk5YmQxOTVjNmU2ZQ==
         | 
| 7 | 
            +
            SHA512:
         | 
| 8 8 | 
             
              metadata.gz: !binary |-
         | 
| 9 | 
            -
                 | 
| 10 | 
            -
                 | 
| 11 | 
            -
                 | 
| 9 | 
            +
                ZTNmZDhhMzlkNGMzOWZlMmE2ZTA4M2MxYWIwNDlhOWY4YzBhYWVlMzliYzlj
         | 
| 10 | 
            +
                ZjMwMGZiNTdjZDQ0ZjViYmQxOWQ4YmI1OWZiYmI5OTc2MTE4NGVlMzU2NzMx
         | 
| 11 | 
            +
                Y2JmMzNmYmJkMzY0MzBlNmQ2MDgxMjU5YjJkZjFlODdmOTQ2MGM=
         | 
| 12 12 | 
             
              data.tar.gz: !binary |-
         | 
| 13 | 
            -
                 | 
| 14 | 
            -
                 | 
| 15 | 
            -
                 | 
| 13 | 
            +
                MjM5NTYxMGQ0MjRmMjNkOGZlZjA2ODdlMWJiMzk2MTcyMjRhYmI0NDZlZThj
         | 
| 14 | 
            +
                NTI2MjY2YThjZThkMzdmNjQyNmM1MjEzOGMzMjIyZTQ4OTIzMzgzZDkwMGFm
         | 
| 15 | 
            +
                NDk4MDAzZjE3MmMwOTFlNzNjNDBhOWZlYzVhNDFkYzliYWZiNWM=
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,3 +1,15 @@ | |
| 1 | 
            +
            ### 0.3.2
         | 
| 2 | 
            +
             | 
| 3 | 
            +
             - You can now use `SortedSet#reverse` to query in reverse order.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
               For instance:
         | 
| 6 | 
            +
             | 
| 7 | 
            +
               ```
         | 
| 8 | 
            +
               Post.sorted_find(:created_at).reverse.between(Time.now - 10, Time.now)
         | 
| 9 | 
            +
               ```
         | 
| 10 | 
            +
             | 
| 11 | 
            +
             - `SortedSet#each` now returns an Enumerator when called without a block
         | 
| 12 | 
            +
             | 
| 1 13 | 
             
            ### 0.3.1
         | 
| 2 14 |  | 
| 3 15 | 
             
             - Return correct set size for ranged sets
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/Rakefile
    CHANGED
    
    
    
        data/lib/ohm/sorted.rb
    CHANGED
    
    | @@ -1,5 +1,10 @@ | |
| 1 1 | 
             
            require 'ohm'
         | 
| 2 | 
            -
             | 
| 2 | 
            +
             | 
| 3 | 
            +
            begin
         | 
| 4 | 
            +
              require 'ohm/callbacks'
         | 
| 5 | 
            +
            rescue LoadError
         | 
| 6 | 
            +
              require 'ohm/contrib/callbacks'
         | 
| 7 | 
            +
            end
         | 
| 3 8 |  | 
| 4 9 | 
             
            module Ohm
         | 
| 5 10 |  | 
| @@ -13,6 +18,7 @@ module Ohm | |
| 13 18 | 
             
                  @namespace = namespace
         | 
| 14 19 | 
             
                  @model = model
         | 
| 15 20 | 
             
                  @options = options
         | 
| 21 | 
            +
                  @range = options.fetch(:range, ["-inf", "inf"])
         | 
| 16 22 | 
             
                end
         | 
| 17 23 |  | 
| 18 24 | 
             
                def offset
         | 
| @@ -28,11 +34,23 @@ module Ohm | |
| 28 34 | 
             
                end
         | 
| 29 35 |  | 
| 30 36 | 
             
                def between(first, last)
         | 
| 31 | 
            -
                  range = first.to_f | 
| 37 | 
            +
                  range = [first.to_f, last.to_f]
         | 
| 38 | 
            +
                  range.reverse! if reversed?
         | 
| 39 | 
            +
             | 
| 32 40 | 
             
                  opts = @options.merge(range: range)
         | 
| 33 41 | 
             
                  RangedSortedSet.new(key, namespace, model, opts)
         | 
| 34 42 | 
             
                end
         | 
| 35 43 |  | 
| 44 | 
            +
                def reversed?
         | 
| 45 | 
            +
                  @options.fetch(:reverse, false)
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                def reverse
         | 
| 49 | 
            +
                  opts = @options.merge(reverse: !reversed?, range: @range.reverse)
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                  self.class.new(key, namespace, model, opts)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 36 54 | 
             
                def slice(*args)
         | 
| 37 55 | 
             
                  if args.count == 1
         | 
| 38 56 | 
             
                    self[args.first]
         | 
| @@ -50,7 +68,11 @@ module Ohm | |
| 50 68 | 
             
                end
         | 
| 51 69 |  | 
| 52 70 | 
             
                def ids
         | 
| 53 | 
            -
                   | 
| 71 | 
            +
                  if reversed?
         | 
| 72 | 
            +
                    execute { |key| db.zrevrangebyscore(key, @range.first, @range.last, limit: [offset, count]) }
         | 
| 73 | 
            +
                  else
         | 
| 74 | 
            +
                    execute { |key| db.zrangebyscore(key, @range.first, @range.last, limit: [offset, count]) }
         | 
| 75 | 
            +
                  end
         | 
| 54 76 | 
             
                end
         | 
| 55 77 |  | 
| 56 78 | 
             
                def inspect
         | 
| @@ -83,8 +105,12 @@ module Ohm | |
| 83 105 | 
             
                    model.db
         | 
| 84 106 | 
             
                  end
         | 
| 85 107 |  | 
| 86 | 
            -
                  def each | 
| 87 | 
            -
                     | 
| 108 | 
            +
                  def each
         | 
| 109 | 
            +
                    if block_given?
         | 
| 110 | 
            +
                      ids.each { |id| block.call(model.to_proc[id]) }
         | 
| 111 | 
            +
                    else
         | 
| 112 | 
            +
                      to_enum(:each)
         | 
| 113 | 
            +
                    end
         | 
| 88 114 | 
             
                  end
         | 
| 89 115 |  | 
| 90 116 | 
             
                  def [](id)
         | 
| @@ -111,16 +137,8 @@ module Ohm | |
| 111 137 | 
             
              end
         | 
| 112 138 |  | 
| 113 139 | 
             
              class RangedSortedSet < SortedSet
         | 
| 114 | 
            -
                def range
         | 
| 115 | 
            -
                  @options.fetch(:range)
         | 
| 116 | 
            -
                end
         | 
| 117 | 
            -
             | 
| 118 | 
            -
                def ids
         | 
| 119 | 
            -
                  execute { |key| db.zrangebyscore(key, range.begin, range.end, limit: [offset, count]) }
         | 
| 120 | 
            -
                end
         | 
| 121 | 
            -
             | 
| 122 140 | 
             
                def size
         | 
| 123 | 
            -
                  execute { |key| db.zcount(key, range. | 
| 141 | 
            +
                  execute { |key| db.zcount(key, @range.first, @range.last) }
         | 
| 124 142 | 
             
                end
         | 
| 125 143 | 
             
              end
         | 
| 126 144 |  | 
| @@ -153,9 +171,8 @@ module Ohm | |
| 153 171 |  | 
| 154 172 | 
             
                  def sorted_index_key(attribute, dict={})
         | 
| 155 173 | 
             
                    index_key = [key, "sorted", attribute]
         | 
| 156 | 
            -
                    if dict. | 
| 157 | 
            -
                      index_key | 
| 158 | 
            -
                      index_key << dict.values.first
         | 
| 174 | 
            +
                    if dict.size == 1
         | 
| 175 | 
            +
                      index_key.concat(dict.first)
         | 
| 159 176 | 
             
                    elsif dict.keys.size > 1
         | 
| 160 177 | 
             
                      raise ArgumentError
         | 
| 161 178 | 
             
                    end
         | 
| @@ -228,9 +245,7 @@ module Ohm | |
| 228 245 | 
             
                end
         | 
| 229 246 |  | 
| 230 247 | 
             
                def update_sorted_indices
         | 
| 231 | 
            -
                  self.class.sorted_indices.each do | | 
| 232 | 
            -
                    attribute, options = *args
         | 
| 233 | 
            -
             | 
| 248 | 
            +
                  self.class.sorted_indices.each do |attribute, options|
         | 
| 234 249 | 
             
                    opts = {}
         | 
| 235 250 | 
             
                    if options.include?(:group_by)
         | 
| 236 251 | 
             
                      group_by = options[:group_by]
         | 
    
        data/ohm-sorted.gemspec
    CHANGED
    
    | @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            Gem::Specification.new do |s|
         | 
| 2 2 | 
             
              s.name        = 'ohm-sorted'
         | 
| 3 | 
            -
              s.version     = '0.3. | 
| 3 | 
            +
              s.version     = '0.3.2'
         | 
| 4 4 | 
             
              s.summary     = "Sorted indices for Ohm."
         | 
| 5 5 | 
             
              s.description = "An plugin for Ohm that lets you create sorted indices."
         | 
| 6 6 | 
             
              s.author      = "Federico Bond"
         | 
| @@ -8,4 +8,8 @@ Gem::Specification.new do |s| | |
| 8 8 | 
             
              s.files       = `git ls-files`.split("\n")
         | 
| 9 9 | 
             
              s.homepage    = 'https://github.com/educabilia/ohm-sorted'
         | 
| 10 10 | 
             
              s.license     = 'UNLICENSE'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              s.add_development_dependency "appraisal"
         | 
| 13 | 
            +
              s.add_development_dependency "ohm"
         | 
| 14 | 
            +
              s.add_development_dependency "ohm-contrib"
         | 
| 11 15 | 
             
            end
         | 
    
        data/test/sorted_test.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            require 'test/unit'
         | 
| 2 | 
            -
             | 
| 2 | 
            +
            require_relative '../lib/ohm/sorted'
         | 
| 3 3 |  | 
| 4 4 | 
             
            class Post < Ohm::Model
         | 
| 5 5 | 
             
              include Ohm::Callbacks
         | 
| @@ -158,4 +158,47 @@ class SortedTest < Test::Unit::TestCase | |
| 158 158 | 
             
                sorted_set = Post.sorted_find(:order)
         | 
| 159 159 | 
             
                assert !sorted_set.empty?
         | 
| 160 160 | 
             
              end
         | 
| 161 | 
            +
             | 
| 162 | 
            +
              def test_sorted_find_reverse
         | 
| 163 | 
            +
                posts = []
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                posts << Post.create(order: 3)
         | 
| 166 | 
            +
                posts << Post.create(order: 2)
         | 
| 167 | 
            +
                posts << Post.create(order: 1)
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                assert_equal posts, Post.sorted_find(:order).reverse.to_a
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                assert_equal posts[0..1], Post.sorted_find(:order).reverse.slice(0, 2).to_a
         | 
| 172 | 
            +
                assert_equal posts[1..2], Post.sorted_find(:order).reverse.slice(1, 2).to_a
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                assert_equal posts.reverse, Post.sorted_find(:order).reverse.reverse.to_a
         | 
| 175 | 
            +
              end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
              def test_sorted_find_reverse_range
         | 
| 178 | 
            +
                posts = []
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                posts << Post.create(order: 3)
         | 
| 181 | 
            +
                posts << Post.create(order: 2)
         | 
| 182 | 
            +
                posts << Post.create(order: 1)
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                assert_equal posts, Post.sorted_find(:order).reverse.between(1, 3).to_a
         | 
| 185 | 
            +
             | 
| 186 | 
            +
                assert_equal posts[0..1], Post.sorted_find(:order).reverse.between(2, 3).to_a
         | 
| 187 | 
            +
              end
         | 
| 188 | 
            +
             | 
| 189 | 
            +
              def test_sorted_find_reverse_range_conmutative
         | 
| 190 | 
            +
                posts = []
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                posts << Post.create(order: 3)
         | 
| 193 | 
            +
                posts << Post.create(order: 2)
         | 
| 194 | 
            +
                posts << Post.create(order: 1)
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                assert_equal posts, Post.sorted_find(:order).between(1, 3).reverse.to_a
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                assert_equal posts[0..1], Post.sorted_find(:order).between(2, 3).reverse.to_a
         | 
| 199 | 
            +
              end
         | 
| 200 | 
            +
             | 
| 201 | 
            +
              def test_each_without_block_returns_enumerable
         | 
| 202 | 
            +
                assert Post.sorted_find(:order).each.kind_of?(Enumerator)
         | 
| 203 | 
            +
              end
         | 
| 161 204 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,15 +1,57 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: ohm-sorted
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.2
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Federico Bond
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2013- | 
| 12 | 
            -
            dependencies: | 
| 11 | 
            +
            date: 2013-10-07 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: appraisal
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - ! '>='
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '0'
         | 
| 20 | 
            +
              type: :development
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - ! '>='
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '0'
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            +
              name: ohm
         | 
| 29 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            +
                requirements:
         | 
| 31 | 
            +
                - - ! '>='
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            +
                    version: '0'
         | 
| 34 | 
            +
              type: :development
         | 
| 35 | 
            +
              prerelease: false
         | 
| 36 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
                requirements:
         | 
| 38 | 
            +
                - - ! '>='
         | 
| 39 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                    version: '0'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: ohm-contrib
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - ! '>='
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '0'
         | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - ! '>='
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '0'
         | 
| 13 55 | 
             
            description: An plugin for Ohm that lets you create sorted indices.
         | 
| 14 56 | 
             
            email: federico@educabilia.com
         | 
| 15 57 | 
             
            executables: []
         | 
| @@ -48,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 48 90 | 
             
                  version: '0'
         | 
| 49 91 | 
             
            requirements: []
         | 
| 50 92 | 
             
            rubyforge_project: 
         | 
| 51 | 
            -
            rubygems_version: 2. | 
| 93 | 
            +
            rubygems_version: 2.1.5
         | 
| 52 94 | 
             
            signing_key: 
         | 
| 53 95 | 
             
            specification_version: 4
         | 
| 54 96 | 
             
            summary: Sorted indices for Ohm.
         |