nexter 0.0.2 → 0.0.3
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 +4 -4
- data/.pryrc +1 -1
- data/.travis.yml +9 -0
- data/README.md +8 -1
- data/Rakefile +4 -0
- data/lib/nexter.rb +1 -0
- data/lib/nexter/derange.rb +53 -0
- data/lib/nexter/version.rb +1 -1
- data/lib/nexter/wrap.rb +11 -23
- data/nexter.gemspec +4 -3
- data/spec/book.rb +5 -3
- data/spec/nexter/wrap_spec.rb +47 -24
- data/spec/spec_helper.rb +2 -1
- metadata +31 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4900260b077482ad9229eaef70c81eb7a5d84cb
|
4
|
+
data.tar.gz: 350f56554e30064f974872056b7201cd37666a89
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dbdb94b58cc46a2aa2ccb20b1cb2a558de630c5f43fd4078b1bb06b508413fcce155dfa6c2af9235828d2fe8eaab20b6df90ee3f4eae96334849c14b0520254c
|
7
|
+
data.tar.gz: 56263b5b0f2d217fc7c7d5b259ac76d836be5e7ea1cabf0e9f3660367942c4d482e237ee4815de3f39c020cc35f3f44556518c5aace9f20732d2e8536152c50e
|
data/.pryrc
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
require "nexter"
|
2
|
-
require "
|
2
|
+
require "./spec/book"
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Nexter
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/nexter)
|
4
|
+
[](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(
|
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
|
+
[](https://bitdeli.com/free "Bitdeli Badge")
|
79
|
+
|
data/Rakefile
CHANGED
data/lib/nexter.rb
CHANGED
@@ -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
|
data/lib/nexter/version.rb
CHANGED
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
direction
|
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
|
-
|
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", "
|
23
|
-
spec.add_dependency "activesupport", "
|
22
|
+
spec.add_dependency "activerecord", ">= 3.1"
|
23
|
+
spec.add_dependency "activesupport", ">= 3.1"
|
24
24
|
|
25
|
-
spec.add_development_dependency "bundler"
|
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(:
|
1
|
+
Author = Struct.new(:name)
|
2
2
|
|
3
|
-
Book = Struct.new(:
|
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.
|
24
|
+
@order_values ||= ["books.genre", "authors.name", "books.title"]
|
23
25
|
end
|
24
26
|
|
25
27
|
def includes_values
|
data/spec/nexter/wrap_spec.rb
CHANGED
@@ -2,39 +2,62 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Nexter::Wrap do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
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
|
-
|
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.
|
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:
|
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.
|
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.
|
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.
|
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.
|
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: '
|
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: '
|
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
|
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_
|