resort 0.5.0 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d5d5826e36decbd7ce65e8146ca2b4bdd0798d08
4
- data.tar.gz: b2af8aebeedfaa5c721b25dbe8832e7348038608
3
+ metadata.gz: 18ba5e9a6d45075e2c0877aae9297009823ac3aa
4
+ data.tar.gz: 56880c681b3d71690d91df09cbb7a111641a13d0
5
5
  SHA512:
6
- metadata.gz: b7e54325489ea146fc48ec1a4c9d19b72775cbcab8aef1bd00f4323348b6bdbf2b958034df5f81c3189cc44a7eec77e93369ead52b89392c43029f0d047d09e7
7
- data.tar.gz: 5d15a4f77afccd8c5be80dfb2b7b71c1bdcd9758374d70057c83ec20133f5226035c659359e16e58271a9b6c266d7b8f0e3d7114adaabe0a5cb5e59b4907fca2
6
+ metadata.gz: 0c2bff8cdb82f97ca81a996d6b4bba7edab38c1a0856d789c8177be9781beb5f5aa2a3da809c6b9ce690fee80b7f3096d37032ab8b3f46bd47d40fffbc387108
7
+ data.tar.gz: 134a890b66dbbe3907ecf3ee8da7cf5d7ac1763db631b00de6815c30820cecc62fadbcfc48ed6db7c8a70ebe81d4eff1079674e881a51cb7098c8efb86720dd5
@@ -1 +1 @@
1
- 2.2.1
1
+ 2.3.1
@@ -1,7 +1,8 @@
1
1
  # http://about.travis-ci.org/docs/user/build-configuration/
2
2
  rvm:
3
- - 1.9.3
4
- - 2.0.0
5
- - 2.1.1
6
- - ruby-head
7
- - rbx
3
+ - 2.2.2
4
+ - 2.3.1
5
+ env:
6
+ - ACTIVE_RECORD_VERSION=4.0.0
7
+ - ACTIVE_RECORD_VERSION=4.2
8
+ - ACTIVE_RECORD_VERSION=5
data/Gemfile CHANGED
@@ -1,12 +1,18 @@
1
- source "http://rubygems.org"
1
+ # frozen_string_literal: true
2
+ source 'http://rubygems.org'
2
3
 
3
4
  gemspec
4
5
 
5
- #group :development, :test do
6
- # # For debugging under ruby 1.9 special gems are needed
7
- # gem 'ruby-debug19', :platform => :mri
8
- # # See http://blog.wyeworks.com/2011/11/1/ruby-1-9-3-and-ruby-debug
9
- # gem 'ruby-debug-base19', '>=0.11.26'
10
- # gem 'linecache19', '>=0.5.13'
11
- #end
6
+ active_record_version = ENV['ACTIVE_RECORD_VERSION'] || 'default'
12
7
 
8
+ active_record_opts =
9
+ case active_record_version
10
+ when 'master'
11
+ { github: 'rails/rails' }
12
+ when 'default'
13
+ '~> 5'
14
+ else
15
+ "~> #{active_record_version}"
16
+ end
17
+
18
+ gem 'activerecord', active_record_opts
data/Rakefile CHANGED
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  require 'bundler'
2
3
  Bundler::GemHelper.install_tasks
3
4
 
4
5
  require 'rspec/core/rake_task'
5
- desc "Run resort specs"
6
+ desc 'Run resort specs'
6
7
  RSpec::Core::RakeTask.new
7
8
 
8
9
  require 'yard'
@@ -15,33 +16,28 @@ site = 'doc'
15
16
  source_branch = 'master'
16
17
  deploy_branch = 'gh-pages'
17
18
 
18
- desc "generate and deploy documentation website to github pages"
19
+ desc 'generate and deploy documentation website to github pages'
19
20
  multitask :pages do
20
21
  puts ">>> Deploying #{deploy_branch} branch to Github Pages <<<"
21
22
  require 'git'
22
23
  repo = Git.open('.')
23
24
  puts "\n>>> Checking out #{deploy_branch} branch <<<\n"
24
- repo.branch("#{deploy_branch}").checkout
25
- (Dir["*"] - [site]).each { |f| rm_rf(f) }
26
- Dir["#{site}/*"].each {|f| mv(f, "./")}
25
+ repo.branch(deploy_branch.to_s).checkout
26
+ (Dir['*'] - [site]).each { |f| rm_rf(f) }
27
+ Dir["#{site}/*"].each { |f| mv(f, './') }
27
28
  rm_rf(site)
28
29
  puts "\n>>> Moving generated site files <<<\n"
29
- Dir["**/*"].each {|f| repo.add(f) }
30
- repo.status.deleted.each {|f, s| repo.remove(f)}
30
+ Dir['**/*'].each { |f| repo.add(f) }
31
+ repo.status.deleted.each { |f, _s| repo.remove(f) }
31
32
  puts "\n>>> Commiting: Site updated at #{Time.now.utc} <<<\n"
32
- message = ENV["MESSAGE"] || "Site updated at #{Time.now.utc}"
33
+ message = ENV['MESSAGE'] || "Site updated at #{Time.now.utc}"
33
34
  repo.commit(message)
34
35
  puts "\n>>> Pushing generated site to #{deploy_branch} branch <<<\n"
35
36
  repo.push
36
37
  puts "\n>>> Github Pages deploy complete <<<\n"
37
- repo.branch("#{source_branch}").checkout
38
+ repo.branch(source_branch.to_s).checkout
38
39
  end
39
40
 
40
- task :doc => [:docs]
41
+ task doc: [:docs]
41
42
 
42
- desc "Generate and open class diagram (needs Graphviz installed)"
43
- task :graph do |t|
44
- `bundle exec yard graph -d --full --no-private | dot -Tpng -o graph.png && open graph.png`
45
- end
46
-
47
- task :default => [:spec]
43
+ task default: [:spec]
data/Readme.md CHANGED
@@ -1,6 +1,6 @@
1
1
  #resort [![Build Status](https://secure.travis-ci.org/codegram/resort.png)](http://travis-ci.org/codegram/resort)
2
2
 
3
- Resort provides sorting capabilities to your Rails models.
3
+ Resort provides sorting capabilities to your Rails (4+) models.
4
4
 
5
5
  ##Install
6
6
 
@@ -72,7 +72,7 @@ Moreover, now a `product` responds to the following methods:
72
72
 
73
73
  * `first?` &mdash; Returns true if the element is the first of the tree.
74
74
  * `append_to(other_element)` &mdash; Appends the element _after_ another element.
75
- * `prepend` &mdash; Moves the elemnt to the beggining of the list (sets it as
75
+ * `prepend` &mdash; Moves the element to the beginning of the list (sets it as
76
76
  first).
77
77
  * `next` &mdash; Returns the next element in the list.
78
78
  * `previous` &mdash; Returns the previous element in the list.
@@ -1,10 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  require 'rails/generators'
2
3
  require 'rails/generators/active_record'
3
4
 
4
5
  module Resort
5
6
  # Module containing Resort generators
6
7
  module Generators
7
-
8
8
  # Rails generator to add a migration for Resort
9
9
  class MigrationGenerator < ActiveRecord::Generators::Base
10
10
  # Implement the required interface for `Rails::Generators::Migration`.
@@ -12,14 +12,14 @@ module Resort
12
12
  # @see http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
13
13
  def self.next_migration_number(dirname)
14
14
  if ActiveRecord::Base.timestamped_migrations
15
- Time.now.utc.strftime("%Y%m%d%H%M%S")
15
+ Time.now.utc.strftime('%Y%m%d%H%M%S')
16
16
  else
17
- "%.3d" % (current_migration_number(dirname) + 1)
17
+ '%.3d' % (current_migration_number(dirname) + 1)
18
18
  end
19
19
  end
20
20
 
21
- desc "Creates a Resort migration."
22
- source_root File.expand_path("../templates", __FILE__)
21
+ desc 'Creates a Resort migration.'
22
+ source_root File.expand_path('../templates', __FILE__)
23
23
 
24
24
  # Copies a migration file adding resort fields to a given model
25
25
  def copy_migration_file
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'generators/active_record/resort_generator' if defined?(Rails)
2
3
  require 'active_record' unless defined?(ActiveRecord)
3
4
 
@@ -60,8 +61,8 @@ module Resort
60
61
  base.extend ClassMethods
61
62
  base.send :include, InstanceMethods
62
63
 
63
- base.has_one :previous, :class_name => base.name, :foreign_key => 'next_id', :inverse_of => :next
64
- base.belongs_to :next, :class_name => base.name, :inverse_of => :previous
64
+ base.has_one :previous, class_name: base.name, foreign_key: 'next_id', inverse_of: :next
65
+ base.belongs_to :next, class_name: base.name, inverse_of: :previous
65
66
 
66
67
  base.after_create :include_in_list!
67
68
  base.after_destroy :delete_from_list
@@ -74,17 +75,16 @@ module Resort
74
75
  #
75
76
  # @return [ActiveRecord::Base] the first element of the list.
76
77
  def first_in_order
77
- all.where(:first => true).first
78
+ all.where(first: true).first
78
79
  end
79
80
 
80
81
  # Returns the last element of the list.
81
82
  #
82
83
  # @return [ActiveRecord::Base] the last element of the list.
83
84
  def last_in_order
84
- all.where(:next_id => nil).first
85
+ all.where(next_id: nil).first
85
86
  end
86
87
 
87
-
88
88
  # Returns eager-loaded Components in order.
89
89
  #
90
90
  # OPTIMIZE: Use IdentityMap when available
@@ -101,7 +101,7 @@ module Resort
101
101
  end
102
102
  end
103
103
 
104
- raise "Multiple or no first items in the list where found. Consider defining a siblings method" if ordered_elements.length != 1 && elements.length > 0
104
+ raise 'Multiple or no first items in the list where found. Consider defining a siblings method' if ordered_elements.length != 1 && elements.length > 0
105
105
 
106
106
  elements.length.times do
107
107
  ordered_elements << elements[ordered_elements.last.next_id]
@@ -112,7 +112,6 @@ module Resort
112
112
 
113
113
  # Instance methods to use.
114
114
  module InstanceMethods
115
-
116
115
  # Default definition of siblings, i.e. every instance of the model.
117
116
  #
118
117
  # Can be overriden to specify a different scope for the siblings.
@@ -135,6 +134,7 @@ module Resort
135
134
  def siblings
136
135
  self.class.all
137
136
  end
137
+
138
138
  # Includes the object in the linked list.
139
139
  #
140
140
  # If there are no other objects, it prepends the object so that it is
@@ -142,7 +142,7 @@ module Resort
142
142
  # empty list.
143
143
  def include_in_list!
144
144
  self.class.transaction do
145
- self.lock!
145
+ lock!
146
146
  _siblings.count > 0 ? last!\
147
147
  : prepend
148
148
  end
@@ -151,53 +151,64 @@ module Resort
151
151
  # Puts the object in the first position of the list.
152
152
  def prepend
153
153
  self.class.transaction do
154
- self.lock!
154
+ lock!
155
155
  return if first?
156
156
  if _siblings.count > 0
157
157
  delete_from_list
158
158
  old_first = _siblings.first_in_order
159
- raise(ActiveRecord::RecordNotSaved.new("[Resort] - Couldn't set next_id from previous first element.")) unless self.update_attribute(:next_id, old_first.id)
160
- raise(ActiveRecord::RecordNotSaved.new("[Resort] - Couldn't reset previous firt element")) unless old_first.update_attribute(:first, false)
159
+ raise ActiveRecord::RecordNotSaved, "[Resort] - Couldn't set next_id from previous first element." unless update_attribute(:next_id, old_first.id)
160
+ raise ActiveRecord::RecordNotSaved, "[Resort] - Couldn't reset previous first element" unless old_first.update_attribute(:first, false)
161
161
  end
162
- raise(ActiveRecord::RecordNotSaved) unless self.update_attribute(:first, true)
162
+ raise(ActiveRecord::RecordNotSaved) unless update_attribute(:first, true)
163
163
  end
164
164
  end
165
165
 
166
166
  # Puts the object in the last position of the list.
167
167
  def push
168
168
  self.class.transaction do
169
- self.lock!
170
- self.append_to(_siblings.last_in_order) unless last?
169
+ lock!
170
+ append_to(_siblings.last_in_order) unless last?
171
171
  end
172
172
  end
173
173
 
174
174
  # Puts the object right after another object in the list.
175
175
  def append_to(another)
176
176
  self.class.transaction do
177
- self.lock!
177
+ lock!
178
178
  return if another.next_id == id
179
179
  another.lock!
180
180
  delete_from_list
181
- if self.next_id or (another && another.next_id)
182
- raise(ActiveRecord::RecordNotSaved.new("[Resort] - Couldn't append element")) unless self.update_attribute(:next_id, another.next_id)
181
+ if next_id || (another && another.next_id)
182
+ raise ActiveRecord::RecordNotSaved, "[Resort] - Couldn't append element" unless update_attribute(:next_id, another.next_id)
183
183
  end
184
184
  if another
185
- raise(ActiveRecord::RecordNotSaved.new("[Resort] - Couldn't set this element to another's next")) unless another.update_attribute(:next_id, self.id)
185
+ raise ActiveRecord::RecordNotSaved, "[Resort] - Couldn't set this element to another's next" unless another.update_attribute(:next_id, id)
186
186
  end
187
187
  end
188
188
  end
189
189
 
190
+ def last?
191
+ !first && !next_id
192
+ end
193
+
194
+ def last!
195
+ self.class.transaction do
196
+ lock!
197
+ raise(ActiveRecord::RecordNotSaved) unless _siblings.last_in_order.update_attribute(:next_id, id)
198
+ end
199
+ end
200
+
190
201
  private
191
202
 
192
203
  def delete_from_list
193
204
  if first? && self.next
194
205
  self.next.lock!
195
206
  raise(ActiveRecord::RecordNotSaved) unless self.next.update_attribute(:first, true)
196
- elsif self.previous
197
- self.previous.lock!
198
- p = self.previous
207
+ elsif previous
208
+ previous.lock!
209
+ p = previous
199
210
  self.previous = nil unless frozen?
200
- raise(ActiveRecord::RecordNotSaved) unless p.update_attribute(:next_id, self.next_id)
211
+ raise(ActiveRecord::RecordNotSaved) unless p.update_column(:next_id, next_id)
201
212
  end
202
213
  unless frozen?
203
214
  self.first = false
@@ -206,20 +217,9 @@ module Resort
206
217
  end
207
218
  end
208
219
 
209
- def last?
210
- !self.first && !self.next_id
211
- end
212
-
213
- def last!
214
- self.class.transaction do
215
- self.lock!
216
- raise(ActiveRecord::RecordNotSaved) unless _siblings.last_in_order.update_attribute(:next_id, self.id)
217
- end
218
- end
219
-
220
220
  def _siblings
221
221
  table = self.class.arel_table
222
- siblings.where(table[:id].not_eq(self.id))
222
+ siblings.where(table[:id].not_eq(id))
223
223
  end
224
224
  end
225
225
  end
@@ -1,4 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  module Resort
2
3
  # Resort's version number
3
- VERSION = "0.5.0"
4
+ VERSION = '0.6.0'
4
5
  end
@@ -1,28 +1,30 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "resort/version"
2
+ # frozen_string_literal: true
3
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
4
+ require 'resort/version'
4
5
 
5
6
  Gem::Specification.new do |s|
6
- s.name = "resort"
7
+ s.name = 'resort'
7
8
  s.version = Resort::VERSION
8
9
  s.platform = Gem::Platform::RUBY
9
- s.authors = ["Oriol Gual", "Josep M. Bach", "Josep Jaume Rey"]
10
- s.email = ["info@codegram.com"]
11
- s.homepage = "http://codegram.github.com/resort"
12
- s.summary = %q{Positionless model sorting for Rails 3.}
13
- s.description = %q{Positionless model sorting for Rails 3.}
10
+ s.authors = ['Oriol Gual', 'Josep M. Bach', 'Josep Jaume Rey']
11
+ s.email = ['info@codegram.com']
12
+ s.homepage = 'http://codegram.github.com/resort'
13
+ s.summary = 'Positionless model sorting for Rails.'
14
+ s.description = 'Positionless model sorting for Rails.'
14
15
 
15
- s.rubyforge_project = "resort"
16
+ s.required_ruby_version = '>= 2.2.2'
16
17
 
17
- s.add_runtime_dependency 'activerecord', '~> 4'
18
+ s.add_dependency 'activerecord', ['>= 4.0.0']
19
+ s.add_dependency 'activesupport', ['>= 4.0.0']
20
+ s.add_dependency 'railties', ['>= 4.0.0']
18
21
  s.add_development_dependency 'sqlite3'
19
- s.add_development_dependency 'rspec', '~> 2.14.1'
22
+ s.add_development_dependency 'rspec', '~> 3.5'
23
+ s.add_development_dependency 'generator_spec'
20
24
  s.add_development_dependency 'yard'
21
- s.add_development_dependency 'bluecloth'
22
- s.add_development_dependency 'generator_spec', '~> 0.9.2'
23
25
 
24
26
  s.files = `git ls-files`.split("\n")
25
27
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
26
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
27
- s.require_paths = ["lib"]
28
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
29
+ s.require_paths = ['lib']
28
30
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'action_controller'
3
4
  require 'action_view'
@@ -14,23 +15,21 @@ module Resort
14
15
 
15
16
  before(:all) do
16
17
  prepare_destination
17
- mkdir File.join(self.test_case.destination_root, 'config')
18
+ mkdir File.join(test_case.destination_root, 'config')
18
19
  run_generator
19
20
  end
20
21
 
21
22
  it 'generates Resort migration' do
22
- destination_root.should have_structure {
23
-
24
- directory "db" do
25
- directory "migrate" do
26
- migration "add_resort_fields_to_articles" do
27
- contains "class AddResortFieldsToArticles"
28
- contains ":articles, :next_id"
29
- contains ":articles, :first"
23
+ expect(destination_root).to have_structure {
24
+ directory 'db' do
25
+ directory 'migrate' do
26
+ migration 'add_resort_fields_to_articles' do
27
+ contains 'class AddResortFieldsToArticles'
28
+ contains ':articles, :next_id'
29
+ contains ':articles, :first'
30
30
  end
31
31
  end
32
32
  end
33
-
34
33
  }
35
34
  end
36
35
  end
@@ -1,34 +1,33 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  module Resort
4
5
  describe Sortable do
5
-
6
6
  subject { Article.new }
7
7
 
8
8
  context 'when included' do
9
9
  it 'creates previous and next relationships' do
10
- subject.should respond_to(:previous, :next)
10
+ expect(subject).to respond_to(:previous, :next)
11
11
  end
12
12
 
13
13
  it 'includes base with InstanceMethods' do
14
- subject.class.ancestors.should include(Sortable::InstanceMethods)
14
+ expect(subject.class.ancestors).to include(Sortable::InstanceMethods)
15
15
  end
16
16
  it 'extend base with ClassMethods' do
17
- (class << subject.class; self; end).ancestors.should include(Sortable::ClassMethods)
17
+ expect((class << subject.class; self; end).ancestors).to include(Sortable::ClassMethods)
18
18
  end
19
19
  it 'defines a siblings method' do
20
- subject.should respond_to(:siblings)
20
+ expect(subject).to respond_to(:siblings)
21
21
  end
22
22
  end
23
23
 
24
24
  describe 'ClassMethods' do
25
-
26
- describe "ordering" do
25
+ describe 'ordering' do
27
26
  before do
28
27
  Article.destroy_all
29
28
 
30
29
  4.times do |i|
31
- Article.create(:name => i.to_s)
30
+ Article.create(name: i.to_s)
32
31
  end
33
32
 
34
33
  Article.find_by_name('0').append_to(Article.find_by_name('3'))
@@ -41,21 +40,21 @@ module Resort
41
40
  @article4 = Article.find_by_name('0')
42
41
  end
43
42
 
44
- describe "#first_in_order" do
43
+ describe '#first_in_order' do
45
44
  it 'returns the first element of the list' do
46
- Article.first_in_order.should == @article1
45
+ expect(Article.first_in_order).to eq @article1
47
46
  end
48
47
  end
49
48
 
50
- describe "#last_in_order" do
49
+ describe '#last_in_order' do
51
50
  it 'returns the last element of the list' do
52
- Article.last_in_order.should == @article4
51
+ expect(Article.last_in_order).to eq @article4
53
52
  end
54
53
  end
55
54
 
56
- describe "#ordered" do
55
+ describe '#ordered' do
57
56
  it 'returns all elements ordered' do
58
- Article.ordered.should == [@article1, @article2, @article3, @article4]
57
+ expect(Article.ordered).to eq [@article1, @article2, @article3, @article4]
59
58
  end
60
59
  end
61
60
 
@@ -65,42 +64,41 @@ module Resort
65
64
  end
66
65
  end
67
66
 
68
- describe "siblings" do
67
+ describe 'siblings' do
69
68
  before do
70
- one_list = OrderedList.create(:name => 'My list')
71
- another_list = OrderedList.create(:name => 'My other list')
69
+ one_list = OrderedList.create(name: 'My list')
70
+ another_list = OrderedList.create(name: 'My other list')
72
71
 
73
72
  4.times do |i|
74
- one_list.items << ListItem.new(:name => "My list item #{i}")
75
- another_list.items << ListItem.new(:name => "My other list item #{i}")
73
+ one_list.items << ListItem.new(name: "My list item #{i}")
74
+ another_list.items << ListItem.new(name: "My other list item #{i}")
76
75
  end
77
-
78
76
  end
79
77
 
80
- describe "#first_in_order" do
78
+ describe '#first_in_order' do
81
79
  it 'returns the first element of the list' do
82
- OrderedList.find_by_name('My list').items.first_in_order.name.should == "My list item 0"
83
- OrderedList.find_by_name('My other list').items.first_in_order.name.should == "My other list item 0"
80
+ expect(OrderedList.find_by_name('My list').items.first_in_order.name).to eq 'My list item 0'
81
+ expect(OrderedList.find_by_name('My other list').items.first_in_order.name).to eq 'My other list item 0'
84
82
  end
85
83
  end
86
84
 
87
- describe "#last_in_order" do
85
+ describe '#last_in_order' do
88
86
  it 'returns the last element of the list' do
89
- OrderedList.find_by_name('My list').items.last_in_order.name.should == "My list item 3"
90
- OrderedList.find_by_name('My other list').items.last_in_order.name.should == "My other list item 3"
87
+ expect(OrderedList.find_by_name('My list').items.last_in_order.name).to eq 'My list item 3'
88
+ expect(OrderedList.find_by_name('My other list').items.last_in_order.name).to eq 'My other list item 3'
91
89
  end
92
90
  end
93
91
 
94
- describe "#ordered" do
92
+ describe '#ordered' do
95
93
  it 'returns all elements ordered' do
96
- OrderedList.find_by_name('My list').items.ordered.map(&:name).should == ['My list item 0', 'My list item 1', 'My list item 2', 'My list item 3']
97
- OrderedList.find_by_name('My other list').items.ordered.map(&:name).should == ['My other list item 0', 'My other list item 1', 'My other list item 2', 'My other list item 3']
94
+ expect(OrderedList.find_by_name('My list').items.ordered.map(&:name)).to eq ['My list item 0', 'My list item 1', 'My list item 2', 'My list item 3']
95
+ expect(OrderedList.find_by_name('My other list').items.ordered.map(&:name)).to eq ['My other list item 0', 'My other list item 1', 'My other list item 2', 'My other list item 3']
98
96
  end
99
97
 
100
98
  it 'raises when ordering without scope' do
101
- expect {
99
+ expect do
102
100
  ListItem.ordered
103
- }.to raise_error
101
+ end.to raise_error(NoMethodError)
104
102
  end
105
103
  end
106
104
 
@@ -110,84 +108,82 @@ module Resort
110
108
  end
111
109
  end
112
110
 
113
- describe "after create" do
111
+ describe 'after create' do
114
112
  context 'when there are no siblings' do
115
113
  it 'prepends the element' do
116
- article = Article.create(:name => 'first!')
114
+ article = Article.create(name: 'first!')
117
115
 
118
- article.should be_first
119
- article.next.should be_nil
120
- article.previous.should be_nil
116
+ expect(article).to be_first
117
+ expect(article.next).to be_nil
118
+ expect(article.previous).to be_nil
121
119
  end
122
120
  end
123
121
  context 'otherwise' do
124
122
  it 'appends the element' do
125
- Article.create(:name => "1")
126
- Article.create(:name => 'last!')
123
+ Article.create(name: '1')
124
+ Article.create(name: 'last!')
127
125
 
128
126
  article = Article.find_by_name('last!')
129
127
  first = Article.find_by_name('1')
130
128
 
131
- article.should be_last
132
- article.next_id.should be_nil
133
- article.previous.name.should == '1'
129
+ expect(article).to be_last
130
+ expect(article.next_id).to be_nil
131
+ expect(article.previous.name).to eq '1'
134
132
 
135
- first.next_id.should eq(article.id)
133
+ expect(first.next_id).to eq(article.id)
136
134
  end
137
135
  end
138
136
  after do
139
137
  Article.destroy_all
140
138
  end
141
139
 
142
- context "with custom siblings" do
143
-
140
+ context 'with custom siblings' do
144
141
  context 'when there are no siblings' do
145
142
  it 'prepends the element' do
146
- one_list = OrderedList.create(:name => 'My list')
147
- another_list = OrderedList.create(:name => 'My other list')
148
- item = ListItem.create(:name => "My list item", :ordered_list => one_list)
143
+ one_list = OrderedList.create(name: 'My list')
144
+ OrderedList.create(name: 'My other list')
145
+ item = ListItem.create(name: 'My list item', ordered_list: one_list)
149
146
 
150
- item.should be_first
151
- item.next.should be_nil
152
- item.previous.should be_nil
147
+ expect(item).to be_first
148
+ expect(item.next).to be_nil
149
+ expect(item.previous).to be_nil
153
150
  end
154
151
  end
155
152
  context 'otherwise' do
156
153
  it 'appends the element' do
157
- one_list = OrderedList.create(:name => 'My list')
158
- another_list = OrderedList.create(:name => 'My other list')
159
- ListItem.create(:name => "1", :ordered_list => one_list)
160
- ListItem.create(:name => "last!", :ordered_list => one_list)
154
+ one_list = OrderedList.create(name: 'My list')
155
+ OrderedList.create(name: 'My other list')
156
+ ListItem.create(name: '1', ordered_list: one_list)
157
+ ListItem.create(name: 'last!', ordered_list: one_list)
161
158
 
162
159
  first = ListItem.find_by_name('1')
163
160
  last = ListItem.find_by_name('last!')
164
161
 
165
- last.should be_last
166
- last.next_id.should be_nil
167
- last.previous.name.should == '1'
162
+ expect(last).to be_last
163
+ expect(last.next_id).to be_nil
164
+ expect(last.previous.name).to eq '1'
168
165
 
169
- first.next_id.should eq(last.id)
166
+ expect(first.next_id).to eq(last.id)
170
167
  end
171
168
 
172
169
  it 'prepends the last element' do
173
- one_list = OrderedList.create(:name => 'My list')
174
- ListItem.create(:name => "First", :ordered_list => one_list)
175
- ListItem.create(:name => "Second", :ordered_list => one_list)
176
- third = ListItem.create(:name => "Third", :ordered_list => one_list)
170
+ one_list = OrderedList.create(name: 'My list')
171
+ ListItem.create(name: 'First', ordered_list: one_list)
172
+ ListItem.create(name: 'Second', ordered_list: one_list)
173
+ third = ListItem.create(name: 'Third', ordered_list: one_list)
177
174
 
178
175
  third.prepend
179
- first = ListItem.where(:name => "First", :ordered_list_id => one_list).first
180
- second = ListItem.where(:name => "Second", :ordered_list_id => one_list).first
181
- third = ListItem.where(:name => "Third", :ordered_list_id => one_list).first
182
-
183
- first.should_not be_first
184
- second.should_not be_first
185
- third.should be_first
186
- third.next.name.should == 'First'
187
- first.next.name.should == 'Second'
188
- second.next.should be_nil
176
+ first = ListItem.where(name: 'First', ordered_list_id: one_list).first
177
+ second = ListItem.where(name: 'Second', ordered_list_id: one_list).first
178
+ third = ListItem.where(name: 'Third', ordered_list_id: one_list).first
179
+
180
+ expect(first).to_not be_first
181
+ expect(second).to_not be_first
182
+ expect(third).to be_first
183
+ expect(third.next.name).to eq 'First'
184
+ expect(first.next.name).to eq 'Second'
185
+ expect(second.next).to be_nil
189
186
  end
190
-
191
187
  end
192
188
  after do
193
189
  OrderedList.destroy_all
@@ -196,27 +192,27 @@ module Resort
196
192
  end
197
193
  end
198
194
 
199
- describe "after destroy" do
195
+ describe 'after destroy' do
200
196
  context 'when the element is the first' do
201
197
  it 'removes the element' do
202
- article = Article.create(:name => 'first!')
203
- article2 = Article.create(:name => 'second!')
204
- article3 = Article.create(:name => 'last!')
198
+ article = Article.create(name: 'first!')
199
+ article2 = Article.create(name: 'second!')
200
+ Article.create(name: 'last!')
205
201
 
206
202
  article = Article.find_by_name('first!')
207
203
  article.destroy
208
204
 
209
205
  article2 = Article.find_by_name('second!')
210
206
 
211
- article2.should be_first
212
- article2.previous.should be_nil
207
+ expect(article2).to be_first
208
+ expect(article2.previous).to be_nil
213
209
  end
214
210
  end
215
211
  context 'when the element is in the middle' do
216
212
  it 'removes the element' do
217
- article = Article.create(:name => 'first!')
218
- article2 = Article.create(:name => 'second!')
219
- article3 = Article.create(:name => 'last!')
213
+ article = Article.create(name: 'first!')
214
+ article2 = Article.create(name: 'second!')
215
+ article3 = Article.create(name: 'last!')
220
216
 
221
217
  article = Article.find_by_name('first!')
222
218
 
@@ -226,20 +222,20 @@ module Resort
226
222
  article = Article.find_by_name('first!')
227
223
  article3 = Article.find_by_name('last!')
228
224
 
229
- article.should be_first
230
- article.next.name.should == 'last!'
231
- article3.previous.name.should == 'first!'
225
+ expect(article).to be_first
226
+ expect(article.next.name).to eq 'last!'
227
+ expect(article3.previous.name).to eq 'first!'
232
228
  end
233
229
  end
234
230
  context 'when the element is last' do
235
231
  it 'removes the element' do
236
- article = Article.create(:name => 'first!')
237
- article2 = Article.create(:name => 'second!')
238
- article3 = Article.create(:name => 'last!')
232
+ Article.create(name: 'first!')
233
+ article2 = Article.create(name: 'second!')
234
+ article3 = Article.create(name: 'last!')
239
235
 
240
236
  article3.destroy
241
237
 
242
- article2.next.should be_nil
238
+ expect(article2.next).to be_nil
243
239
  end
244
240
  end
245
241
  after do
@@ -250,10 +246,10 @@ module Resort
250
246
  describe 'InstanceMethods' do
251
247
  before do
252
248
  Article.destroy_all
253
- Article.create(:name => "1")
254
- Article.create(:name => "2")
255
- Article.create(:name => "3")
256
- Article.create(:name => "4")
249
+ Article.create(name: '1')
250
+ Article.create(name: '2')
251
+ Article.create(name: '3')
252
+ Article.create(name: '4')
257
253
 
258
254
  @article1 = Article.find_by_name('1')
259
255
  @article2 = Article.find_by_name('2')
@@ -261,47 +257,47 @@ module Resort
261
257
  @article4 = Article.find_by_name('4')
262
258
  end
263
259
 
264
- describe "#push" do
265
- it "appends the element to the list" do
260
+ describe '#push' do
261
+ it 'appends the element to the list' do
266
262
  @article1.push
267
263
 
268
264
  article1 = Article.find_by_name('1')
269
- article1.previous.should == @article4
270
- article1.next.should be_nil
265
+ expect(article1.previous).to eq @article4
266
+ expect(article1.next).to be_nil
271
267
  end
272
268
  context 'when the article is already last' do
273
269
  it 'does nothing' do
274
270
  @article4.push
275
271
 
276
- @article4.previous.name.should == '3'
277
- @article4.next.should be_nil
272
+ expect(@article4.previous.name).to eq '3'
273
+ expect(@article4.next).to be_nil
278
274
  end
279
275
  end
280
276
  end
281
277
 
282
- describe "#prepend" do
283
- it "prepends the element" do
278
+ describe '#prepend' do
279
+ it 'prepends the element' do
284
280
  @article3.prepend
285
281
 
286
282
  article3 = Article.find_by_name('3')
287
283
 
288
- article3.should be_first
289
- article3.previous.should be_nil
290
- article3.next.name.should == '1'
284
+ expect(article3).to be_first
285
+ expect(article3.previous).to be_nil
286
+ expect(article3.next.name).to eq '1'
291
287
  end
292
288
 
293
- it "prepends the last element" do
289
+ it 'prepends the last element' do
294
290
  @article4.prepend
295
291
 
296
292
  article4 = Article.find_by_name('4')
297
293
 
298
- article4.should be_first
299
- article4.previous.should be_nil
300
- article4.next.name.should == '1'
294
+ expect(article4).to be_first
295
+ expect(article4.previous).to be_nil
296
+ expect(article4.next.name).to eq '1'
301
297
  end
302
298
 
303
299
  it 'will raise ActiveRecord::RecordNotSaved if update fails' do
304
- @article2.should_receive(:update_attribute).and_return(false)
300
+ expect(@article2).to receive(:update_attribute).and_return(false)
305
301
  expect { @article2.prepend }.to raise_error(ActiveRecord::RecordNotSaved)
306
302
  end
307
303
 
@@ -309,123 +305,123 @@ module Resort
309
305
  it 'does nothing' do
310
306
  @article1.prepend
311
307
 
312
- @article1.previous.should be_nil
313
- @article1.next.name.should == '2'
308
+ expect(@article1.previous).to be_nil
309
+ expect(@article1.next.name).to eq '2'
314
310
  end
315
311
  end
316
312
  end
317
313
 
318
- describe "#append_to" do
314
+ describe '#append_to' do
319
315
  it 'will raise ActiveRecord::RecordNotSaved if update fails' do
320
- @article2.should_receive(:update_attribute).and_return(false)
316
+ expect(@article2).to receive(:update_attribute).and_return(false)
321
317
  expect { @article2.append_to(@article3) }.to raise_error(ActiveRecord::RecordNotSaved)
322
318
  end
323
319
 
324
320
  context 'appending 1 after 2' do
325
- it "appends the element after another element" do
321
+ it 'appends the element after another element' do
326
322
  @article1.append_to(@article2)
327
323
 
328
324
  article1 = Article.find_by_name('1')
329
- article1.next.name.should == '3'
330
- article1.previous.name.should == '2'
331
- @article3.previous.name.should == '1'
325
+ expect(article1.next.name).to eq '3'
326
+ expect(article1.previous.name).to eq '2'
327
+ expect(@article3.previous.name).to eq '1'
332
328
  end
333
329
 
334
- it "sets the other element as first" do
330
+ it 'sets the other element as first' do
335
331
  @article1.append_to(@article2)
336
332
 
337
333
  article2 = Article.find_by_name('2')
338
- article2.next.name.should == '1'
339
- article2.should be_first
334
+ expect(article2.next.name).to eq '1'
335
+ expect(article2).to be_first
340
336
  end
341
337
  end
342
338
 
343
339
  context 'appending 1 after 3' do
344
- it "appends the element after another element" do
340
+ it 'appends the element after another element' do
345
341
  @article1.append_to(@article3)
346
342
 
347
343
  article1 = Article.find_by_name('1')
348
- article1.should_not be_first
349
- article1.previous.name.should == '3'
350
- article1.next.name.should == '4'
344
+ expect(article1).to_not be_first
345
+ expect(article1.previous.name).to eq '3'
346
+ expect(article1.next.name).to eq '4'
351
347
 
352
- @article3.next.name.should == '1'
353
- @article4.previous.name.should == '1'
348
+ expect(@article3.next.name).to eq '1'
349
+ expect(@article4.previous.name).to eq '1'
354
350
  end
355
351
 
356
352
  it 'resets the first element' do
357
353
  @article1.append_to(@article3)
358
354
 
359
355
  article2 = Article.find_by_name('2')
360
- article2.should be_first
361
- article2.previous.should be_nil
356
+ expect(article2).to be_first
357
+ expect(article2.previous).to be_nil
362
358
  end
363
359
  end
364
360
 
365
361
  context 'appending 2 after 3' do
366
- it "appends the element after another element" do
362
+ it 'appends the element after another element' do
367
363
  @article2.append_to(@article3)
368
364
 
369
365
  article1 = Article.find_by_name('1')
370
- article1.next.name.should == '3'
366
+ expect(article1.next.name).to eq '3'
371
367
 
372
368
  article2 = Article.find_by_name('2')
373
- article2.previous.name.should == '3'
374
- article2.next.name.should == '4'
369
+ expect(article2.previous.name).to eq '3'
370
+ expect(article2.next.name).to eq '4'
375
371
 
376
- @article3.previous.name.should == '1'
377
- @article3.next.name.should == '2'
372
+ expect(@article3.previous.name).to eq '1'
373
+ expect(@article3.next.name).to eq '2'
378
374
 
379
- @article4.previous.name.should == '2'
375
+ expect(@article4.previous.name).to eq '2'
380
376
  end
381
377
  end
382
378
  context 'appending 2 after 4' do
383
- it "appends the element after another element" do
379
+ it 'appends the element after another element' do
384
380
  @article2.append_to(@article4)
385
381
 
386
382
  article1 = Article.find_by_name('1')
387
383
  article3 = Article.find_by_name('3')
388
384
 
389
- article1.next.name.should == '3'
390
- article3.previous.name.should == '1'
385
+ expect(article1.next.name).to eq '3'
386
+ expect(article3.previous.name).to eq '1'
391
387
 
392
388
  article2 = Article.find_by_name('2')
393
- article2.previous.name.should == '4'
394
- article2.should be_last
389
+ expect(article2.previous.name).to eq '4'
390
+ expect(article2).to be_last
395
391
 
396
- @article4.next.name.should == '2'
392
+ expect(@article4.next.name).to eq '2'
397
393
  end
398
394
  end
399
395
  context 'appending 4 after 2' do
400
- it "appends the element after another element" do
396
+ it 'appends the element after another element' do
401
397
  @article4.append_to(@article2)
402
398
 
403
399
  article3 = Article.find_by_name('3')
404
- article3.next.should be_nil
405
- article3.previous.name.should == '4'
400
+ expect(article3.next).to be_nil
401
+ expect(article3.previous.name).to eq '4'
406
402
 
407
403
  article4 = Article.find_by_name('4')
408
- @article2.next.name.should == '4'
409
- article4.previous.name.should == '2'
410
- article4.next.name.should == '3'
404
+ expect(@article2.next.name).to eq '4'
405
+ expect(article4.previous.name).to eq '2'
406
+ expect(article4.next.name).to eq '3'
411
407
  end
412
408
  end
413
409
  context 'appending 3 after 1' do
414
- it "appends the element after another element" do
410
+ it 'appends the element after another element' do
415
411
  @article3.append_to(@article1)
416
412
 
417
413
  article1 = Article.find_by_name('1')
418
- article1.next.name.should == '3'
414
+ expect(article1.next.name).to eq '3'
419
415
 
420
416
  article2 = Article.find_by_name('2')
421
- article2.previous.name.should == '3'
422
- article2.next.name.should == '4'
417
+ expect(article2.previous.name).to eq '3'
418
+ expect(article2.next.name).to eq '4'
423
419
 
424
420
  article3 = Article.find_by_name('3')
425
- article3.previous.name.should == '1'
426
- article3.next.name.should == '2'
421
+ expect(article3.previous.name).to eq '1'
422
+ expect(article3.next.name).to eq '2'
427
423
 
428
- @article4.previous.name.should == '2'
424
+ expect(@article4.previous.name).to eq '2'
429
425
  end
430
426
  end
431
427
 
@@ -436,12 +432,11 @@ module Resort
436
432
  article1 = Article.find_by_name('1')
437
433
  article2 = Article.find_by_name('2')
438
434
 
439
- article1.next.name.should == '2'
440
- article2.previous.name.should == '1'
435
+ expect(article1.next.name).to eq '2'
436
+ expect(article2.previous.name).to eq '1'
441
437
  end
442
438
  end
443
439
  end
444
440
  end
445
-
446
441
  end
447
442
  end
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  require 'rspec'
2
3
 
3
4
  module Rails
4
5
  class << self
5
6
  # 3.0 defaults this, 3.1 does not
6
7
  def application
7
- "application"
8
+ 'application'
8
9
  end
9
10
  end
10
11
  end
@@ -13,8 +14,8 @@ require 'resort'
13
14
  require 'logger'
14
15
 
15
16
  ActiveRecord::Base.establish_connection(
16
- :adapter => 'sqlite3',
17
- :database => ':memory:'
17
+ adapter: 'sqlite3',
18
+ database: ':memory:'
18
19
  )
19
20
 
20
21
  ActiveRecord::Schema.define do
@@ -25,12 +26,12 @@ ActiveRecord::Schema.define do
25
26
  t.boolean :first
26
27
  t.references :next
27
28
 
28
- t.timestamps
29
+ t.timestamps null: false
29
30
  end
30
31
 
31
32
  create_table :ordered_lists do |t|
32
33
  t.string :name
33
- t.timestamps
34
+ t.timestamps null: false
34
35
  end
35
36
 
36
37
  create_table :list_items do |t|
@@ -38,7 +39,7 @@ ActiveRecord::Schema.define do
38
39
  t.boolean :first
39
40
  t.references :next
40
41
  t.references :ordered_list
41
- t.timestamps
42
+ t.timestamps null: false
42
43
  end
43
44
  end
44
45
 
@@ -49,7 +50,7 @@ class Article < ActiveRecord::Base
49
50
  end
50
51
 
51
52
  class OrderedList < ActiveRecord::Base
52
- has_many :items, :class_name => 'ListItem'
53
+ has_many :items, class_name: 'ListItem'
53
54
  end
54
55
 
55
56
  class ListItem < ActiveRecord::Base
@@ -59,6 +60,6 @@ class ListItem < ActiveRecord::Base
59
60
  default_scope { order('created_at desc') }
60
61
 
61
62
  def siblings
62
- self.ordered_list.items
63
+ ordered_list.items
63
64
  end
64
65
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resort
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oriol Gual
@@ -10,52 +10,52 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-04-12 00:00:00.000000000 Z
13
+ date: 2016-10-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - "~>"
19
+ - - ">="
20
20
  - !ruby/object:Gem::Version
21
- version: '4'
21
+ version: 4.0.0
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - "~>"
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: '4'
28
+ version: 4.0.0
29
29
  - !ruby/object:Gem::Dependency
30
- name: sqlite3
30
+ name: activesupport
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - ">="
34
34
  - !ruby/object:Gem::Version
35
- version: '0'
36
- type: :development
35
+ version: 4.0.0
36
+ type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: '0'
42
+ version: 4.0.0
43
43
  - !ruby/object:Gem::Dependency
44
- name: rspec
44
+ name: railties
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
- - - "~>"
47
+ - - ">="
48
48
  - !ruby/object:Gem::Version
49
- version: 2.14.1
50
- type: :development
49
+ version: 4.0.0
50
+ type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
- - - "~>"
54
+ - - ">="
55
55
  - !ruby/object:Gem::Version
56
- version: 2.14.1
56
+ version: 4.0.0
57
57
  - !ruby/object:Gem::Dependency
58
- name: yard
58
+ name: sqlite3
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - ">="
@@ -69,7 +69,21 @@ dependencies:
69
69
  - !ruby/object:Gem::Version
70
70
  version: '0'
71
71
  - !ruby/object:Gem::Dependency
72
- name: bluecloth
72
+ name: rspec
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '3.5'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '3.5'
85
+ - !ruby/object:Gem::Dependency
86
+ name: generator_spec
73
87
  requirement: !ruby/object:Gem::Requirement
74
88
  requirements:
75
89
  - - ">="
@@ -83,20 +97,20 @@ dependencies:
83
97
  - !ruby/object:Gem::Version
84
98
  version: '0'
85
99
  - !ruby/object:Gem::Dependency
86
- name: generator_spec
100
+ name: yard
87
101
  requirement: !ruby/object:Gem::Requirement
88
102
  requirements:
89
- - - "~>"
103
+ - - ">="
90
104
  - !ruby/object:Gem::Version
91
- version: 0.9.2
105
+ version: '0'
92
106
  type: :development
93
107
  prerelease: false
94
108
  version_requirements: !ruby/object:Gem::Requirement
95
109
  requirements:
96
- - - "~>"
110
+ - - ">="
97
111
  - !ruby/object:Gem::Version
98
- version: 0.9.2
99
- description: Positionless model sorting for Rails 3.
112
+ version: '0'
113
+ description: Positionless model sorting for Rails.
100
114
  email:
101
115
  - info@codegram.com
102
116
  executables: []
@@ -130,20 +144,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
144
  requirements:
131
145
  - - ">="
132
146
  - !ruby/object:Gem::Version
133
- version: '0'
147
+ version: 2.2.2
134
148
  required_rubygems_version: !ruby/object:Gem::Requirement
135
149
  requirements:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
153
  requirements: []
140
- rubyforge_project: resort
154
+ rubyforge_project:
141
155
  rubygems_version: 2.4.5
142
156
  signing_key:
143
157
  specification_version: 4
144
- summary: Positionless model sorting for Rails 3.
158
+ summary: Positionless model sorting for Rails.
145
159
  test_files:
146
160
  - spec/generators/migration_spec.rb
147
161
  - spec/resort_spec.rb
148
162
  - spec/spec_helper.rb
149
- has_rdoc: