nexter 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18207b8538b39dd309f1481c2b69fc8b50261cef
4
- data.tar.gz: ee8714526f27d7653ff607833daf07070491feb4
3
+ metadata.gz: e4900260b077482ad9229eaef70c81eb7a5d84cb
4
+ data.tar.gz: 350f56554e30064f974872056b7201cd37666a89
5
5
  SHA512:
6
- metadata.gz: 58c0c99e1ef15ebc00c9c1534c09bf68ca7dfb51d8b491c53998ac167a054d35de0a3cefb2b3bcc34925260c33bcad683701ba814a0c418c2ad72538770b4bf3
7
- data.tar.gz: 24c2d7d37d54e2f9d62e4eed0d7766ca5e64705a4c3f61ab544def97fddeaa125f36fa884d6f6f35180cc4f8d780b93b263f4fe3a47ecd9e4b78f07cb7a23118
6
+ metadata.gz: dbdb94b58cc46a2aa2ccb20b1cb2a558de630c5f43fd4078b1bb06b508413fcce155dfa6c2af9235828d2fe8eaab20b6df90ee3f4eae96334849c14b0520254c
7
+ data.tar.gz: 56263b5b0f2d217fc7c7d5b259ac76d836be5e7ea1cabf0e9f3660367942c4d482e237ee4815de3f39c020cc35f3f44556518c5aace9f20732d2e8536152c50e
data/.pryrc CHANGED
@@ -1,2 +1,2 @@
1
1
  require "nexter"
2
- require "../spec/book"
2
+ require "./spec/book"
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - "1.9.3"
4
+ - "2.0.0"
5
+ #- jruby-18mode # JRuby in 1.8 mode
6
+ - jruby-19mode # JRuby in 1.9 mode
7
+ #- rbx
8
+ # uncomment this line if your project needs to run something other than `rake`:
9
+ # script: bundle exec rspec spec
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # Nexter
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/nexter.png)](http://badge.fury.io/rb/nexter)
4
+ [![Build Status](https://travis-ci.org/charly/nexter.png?branch=master)](https://travis-ci.org/charly/nexter)
5
+
3
6
  What is Nexter ? A misspelled tv show or a killer feature ? Not sure but it wraps your ActiveRecord model with an ordered scope and consistently cuts out the _next_ and _previous_ records. It also works with associations & nested columns : `order("books.genre, authors.name, published_at desc")`
4
7
 
5
8
  ## Installation
@@ -12,7 +15,7 @@ What is Nexter ? A misspelled tv show or a killer feature ? Not sure but it wrap
12
15
  @books = Book.includes(:author).bestsellers.
13
16
  order("genre", "authors.name", "published_at desc")
14
17
 
15
- nexter = Nexter.wrap( @books.find(56), @books )
18
+ nexter = Nexter.wrap( @books, @books.find(params[:id]) )
16
19
  nexter.previous
17
20
  nexter.next
18
21
  ```
@@ -70,3 +73,7 @@ end
70
73
  3. Commit your changes (`git commit -am 'Add some feature'`)
71
74
  4. Push to the branch (`git push origin my-new-feature`)
72
75
  5. Create new Pull Request
76
+
77
+
78
+ [![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/charly/nexter/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
79
+
data/Rakefile CHANGED
@@ -1 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task :default => :spec
data/lib/nexter.rb CHANGED
@@ -4,6 +4,7 @@ require "active_support/core_ext"
4
4
 
5
5
  require "nexter/version"
6
6
  require "nexter/wrap"
7
+ require "nexter/derange"
7
8
 
8
9
 
9
10
  module Nexter
@@ -0,0 +1,53 @@
1
+ module Nexter
2
+ class Derange
3
+
4
+ attr_reader :model, :table_name
5
+
6
+ attr_accessor :delimiter, :columns
7
+
8
+ attr_accessor :sign, :direction, :trunks
9
+
10
+ def initialize(model)
11
+ @model = model
12
+ @table_name = model.class.table_name
13
+ @trunks = []
14
+ end
15
+
16
+ def trunk
17
+ raise unless columns
18
+
19
+ trunk = columns.map do |col|
20
+ if range_value = value_of(col[0])
21
+ "#{col[0]} = '#{range_value}'"
22
+ else
23
+ "#{col[0]} IS NULL"
24
+ end
25
+ end.join(' AND ')
26
+
27
+ trunks << trunk
28
+ "#{trunk} AND" unless trunk.blank?
29
+ end
30
+
31
+ def bigger_than
32
+ if delimiter_value = value_of(delimiter)
33
+ "#{delimiter} #{get_bracket(sign)} '#{delimiter_value}'"
34
+ else
35
+ "#{delimiter} IS NULL AND #{table_name}.id > #{model.id}"
36
+ end
37
+ end
38
+
39
+ def get_bracket(sign)
40
+ sign == -1 ? '<' : '>'
41
+ end
42
+
43
+ def value_of(cursor)
44
+ splits = cursor.split(".")
45
+ if splits.first == table_name || splits.size == 1
46
+ model.send(splits.last)
47
+ else
48
+ asso = model.reflections.keys.grep(/#{splits.first.singularize}/).first
49
+ asso = model.send(asso) and asso.send(splits.last)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,3 @@
1
1
  module Nexter
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/nexter/wrap.rb CHANGED
@@ -1,6 +1,10 @@
1
1
  module Nexter
2
2
  class Wrap
3
3
 
4
+ # the gui concatenating strings
5
+ attr_reader :derange
6
+
7
+ # the current model & the scope
4
8
  attr_reader :model, :relation
5
9
 
6
10
  # extracted values from the relation
@@ -19,6 +23,7 @@ module Nexter
19
23
  @associations = relation.includes_values
20
24
  # @cursor_column = extract_attr( @ranges.pop )
21
25
  # @cursor = model.send( @cursor_column.to_sym, )
26
+ @derange = Nexter::Derange.new(model)
22
27
  end
23
28
 
24
29
  def next
@@ -52,16 +57,13 @@ module Nexter
52
57
 
53
58
  while order_col = order_vals.pop do
54
59
 
55
- inrange_of = order_vals.map {|col| "#{col[0]} = '#{value_of(col[0])}'"}.join(' AND ')
56
- inrange_of = "#{inrange_of} AND" unless inrange_of.blank?
57
-
58
- direction = order_col[1]
59
- sign = signature(direction, goto)
60
+ derange.columns = order_vals
61
+ derange.delimiter = order_col[0]
62
+ derange.direction = order_col[1]
63
+ derange.sign = signature(derange.direction, goto)
60
64
 
61
- bigger_than = "#{order_col[0]} #{get_bracket(sign)} '#{value_of(order_col[0])}'"
62
-
63
- wheres << "( #{inrange_of} #{bigger_than} )"
64
- reorders.unshift(" #{order_col[0]} #{get_direction(sign)}")
65
+ wheres << "( #{derange.trunk} #{derange.bigger_than} )"
66
+ reorders.unshift(" #{order_col[0]} #{get_direction(derange.sign)}")
65
67
  end
66
68
  end
67
69
 
@@ -69,24 +71,10 @@ module Nexter
69
71
  sign = DIREC[dir.to_sym] * GOTO[goto]
70
72
  end
71
73
 
72
- def get_bracket(sign)
73
- sign == -1 ? '<' : '>'
74
- end
75
-
76
74
  def get_direction(sign)
77
75
  sign == -1 ? 'desc' : 'asc'
78
76
  end
79
77
 
80
- def value_of(cursor)
81
- splits = cursor.split(".")
82
- if splits.first == model.class.table_name || splits.size == 1
83
- model.send(splits.last)
84
- else
85
- asso = model.reflections.keys.grep(/#{splits.first.singularize}/).first
86
- model.send(asso).send(splits.last)
87
- end
88
- end
89
-
90
78
  # helper to turn mixed order attributes to a consistant
91
79
  def arrayize(array)
92
80
  array.join(",").split(",").map(&:strip).map do |column|
data/nexter.gemspec CHANGED
@@ -19,13 +19,14 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
 
22
- spec.add_dependency "activerecord", "~> 3.2"
23
- spec.add_dependency "activesupport", "~> 3.2"
22
+ spec.add_dependency "activerecord", ">= 3.1"
23
+ spec.add_dependency "activesupport", ">= 3.1"
24
24
 
25
- spec.add_development_dependency "bundler", "~> 1.3"
25
+ spec.add_development_dependency "bundler"
26
26
  spec.add_development_dependency "rake"
27
27
  spec.add_development_dependency "rspec"
28
28
  spec.add_development_dependency "pry"
29
+ spec.add_development_dependency "pry-plus"
29
30
 
30
31
 
31
32
  end
data/spec/book.rb CHANGED
@@ -1,6 +1,8 @@
1
- Author = Struct.new(:b)
1
+ Author = Struct.new(:name)
2
2
 
3
- Book = Struct.new(:a, :b, :c) do
3
+ Book = Struct.new(:genre, :name, :title) do
4
+
5
+ def id; 71; end
4
6
 
5
7
  def self.table_name
6
8
  "books"
@@ -19,7 +21,7 @@ class Relation
19
21
  attr_accessor :order_values, :includes_values
20
22
 
21
23
  def order_values
22
- @order_values ||= ["books.a", "authors.b", "books.c"]
24
+ @order_values ||= ["books.genre", "authors.name", "books.title"]
23
25
  end
24
26
 
25
27
  def includes_values
@@ -2,39 +2,62 @@ require "spec_helper"
2
2
 
3
3
  describe Nexter::Wrap do
4
4
 
5
- describe "#wheres" do
6
- it "has the right SQL condition" do
7
- relation = Relation.new.tap {|rel| rel.order_values=["authors.b", "c"]}
8
- book = Book.new("novel", "nabokov", "ada")
9
- nexter = Nexter::Wrap.new(relation, book)
10
- nexter.after
11
-
12
- expect(nexter.wheres[0]).to eq("( authors.b = 'nabokov' AND c > 'ada' )")
13
- expect(nexter.wheres[1]).to eq("( authors.b > 'nabokov' )")
5
+ context "no missing values" do
6
+ let(:relation) { Relation.new.tap {|rel| rel.order_values=["authors.name", "title"]} }
7
+ let(:book) { Book.new("novel", "nabokov", "ada") }
8
+
9
+ describe "#wheres" do
10
+ it "has the right SQL condition" do
11
+ nexter = Nexter::Wrap.new(relation, book)
12
+ nexter.after
13
+
14
+ expect(nexter.wheres[0]).to eq("( authors.name = 'nabokov' AND title > 'ada' )")
15
+ expect(nexter.wheres[1]).to eq("( authors.name > 'nabokov' )")
16
+ end
14
17
  end
15
- end
16
18
 
19
+ describe "#reorders" do
20
+ it "has the right SQL condition" do
21
+ nexter = Nexter::Wrap.new(relation, book)
22
+ nexter.before
23
+
24
+ expect(nexter.wheres[0]).to eq("( authors.name = 'nabokov' AND title < 'ada' )")
25
+ end
17
26
 
18
- describe "#reorders" do
19
- it "has the right SQL condition" do
20
- relation = Relation.new.tap {|rel| rel.order_values=["authors.b", "c"]}
21
- book = Book.new("novel", "nabokov", "ada")
22
- nexter = Nexter::Wrap.new(relation, book)
23
- nexter.before
27
+ it "has the right SQL order by" do
28
+ nexter = Nexter::Wrap.new(relation, book)
29
+ nexter.before
24
30
 
25
- expect(nexter.wheres[0]).to eq("( authors.b = 'nabokov' AND c < 'ada' )")
31
+ expect(nexter.reorders[0]).to eq(" authors.name desc")
32
+ end
26
33
  end
34
+ end
35
+
36
+ context "nil values" do
37
+ let(:relation) { Relation.new.tap {|rel| rel.order_values=["genre", "title"]} }
38
+
39
+ describe "#wheres" do
40
+ let(:book) { Book.new(nil, "nabokov", "Ada") }
27
41
 
28
- it "has the right SQL order by" do
29
- relation = Relation.new.tap {|rel| rel.order_values=["authors.b", "c"]}
30
- book = Book.new("novel", "nabokov", "ada")
31
- nexter = Nexter::Wrap.new(relation, book)
32
- nexter.before
42
+ it "has the right SQL condition" do
43
+ nexter = Nexter::Wrap.new(relation, book)
44
+ nexter.after
33
45
 
34
- expect(nexter.reorders[0]).to eq(" authors.b desc")
46
+ expect(nexter.wheres[0]).to eq("( genre IS NULL AND title > 'Ada' )")
47
+ end
35
48
  end
36
- end
37
49
 
50
+ describe "#wheres" do
51
+ let(:book) { Book.new("novel", "nabokov", nil) }
52
+
53
+ it "has the right SQL condition" do
54
+ nexter = Nexter::Wrap.new(relation, book)
55
+ nexter.after
56
+
57
+ expect(nexter.wheres[0]).to eq("( genre = 'novel' AND title IS NULL AND books.id > #{book.id} )")
58
+ end
59
+ end
38
60
 
61
+ end #contextr
39
62
 
40
63
  end
data/spec/spec_helper.rb CHANGED
@@ -7,6 +7,7 @@
7
7
  require "book"
8
8
  require "nexter"
9
9
  require "active_support"
10
+ require "pry-rescue/rspec"
10
11
 
11
12
 
12
13
  RSpec.configure do |config|
@@ -18,5 +19,5 @@ RSpec.configure do |config|
18
19
  # order dependency and want to debug it, you can fix the order by providing
19
20
  # the seed, which is printed after each run.
20
21
  # --seed 1234
21
- config.order = 'random'
22
+ # config.order = 'random'
22
23
  end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Charles Sistovaris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-22 00:00:00.000000000 Z
11
+ date: 2014-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: '3.2'
19
+ version: '3.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: '3.2'
26
+ version: '3.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: '3.2'
33
+ version: '3.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: '3.2'
40
+ version: '3.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
- version: '1.3'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
- version: '1.3'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-plus
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: 'What is Nexter ? A misspelled tv show or a killer feature ? Almost :
98
112
  it wraps your model with an ordered scope and cuts out the next and previous record.
99
113
  It also works with associations & nested columns.'
@@ -107,11 +121,13 @@ files:
107
121
  - .pryrc
108
122
  - .rspec
109
123
  - .ruby-version
124
+ - .travis.yml
110
125
  - Gemfile
111
126
  - LICENSE.txt
112
127
  - README.md
113
128
  - Rakefile
114
129
  - lib/nexter.rb
130
+ - lib/nexter/derange.rb
115
131
  - lib/nexter/version.rb
116
132
  - lib/nexter/wrap.rb
117
133
  - nexter.gemspec
@@ -138,7 +154,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
154
  version: '0'
139
155
  requirements: []
140
156
  rubyforge_project:
141
- rubygems_version: 2.0.3
157
+ rubygems_version: 2.2.0
142
158
  signing_key:
143
159
  specification_version: 4
144
160
  summary: Wrap your model with an ordered scope and cut out the _next_ and _previous_