asc_desc 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
1
  ## v0.0.1
2
2
 
3
- * initial release
3
+ * initial release
4
+
5
+ ## v0.0.2
6
+
7
+ * generates a sort by id when no argument is passed (custom primary key supported)
8
+ * adds "order_by" as an alias for the built-in "order" method (for future development)
data/README.md CHANGED
@@ -17,7 +17,7 @@ It was conducted on the basis of the excellent tutorials from Ryan Bates, namely
17
17
  Add to your Gemfile and run the `bundle` command to install it.
18
18
 
19
19
  ```ruby
20
- gem 'asc_desc', git: 'git@github.com:dwerlen/asc_desc.git'
20
+ gem 'asc_desc'
21
21
  ```
22
22
 
23
23
 
@@ -29,6 +29,8 @@ Add to your Gemfile and run the `bundle` command to install it.
29
29
 
30
30
  ## Usage
31
31
 
32
+ ### asc
33
+
32
34
  Call `asc` on an ActiveRecord object or on an ActiveRecord::Relation object to sort the column(s) in an ascending way.
33
35
 
34
36
  ```ruby
@@ -41,12 +43,16 @@ Call `asc` on an ActiveRecord object or on an ActiveRecord::Relation object to s
41
43
  # using multiple parameters to specify more than one column for the sort clause
42
44
  Candy.where(:sugar => true).asc(:classification, :name)
43
45
 
44
- # using an array to pass mutliple argument
46
+ # using an array to pass mutliple arguments
45
47
  Candy.where(:sugar => true).asc([:classification, :name])
46
48
 
47
49
  # using a string to specify more than one column for the sort clause
48
50
  Candy.where(:sugar => true).asc('classification, name')
49
51
 
52
+ # without argument, the method generates a sort by id (custom primary key supported)
53
+ # SELECT "candies".* FROM "candies" ORDER BY id ASC
54
+ Candy.where(:sugar => true).asc
55
+
50
56
  # the method is chainable
51
57
  Candy.where(:sugar => true).asc(:classification).asc(:name)
52
58
  ```
@@ -54,6 +60,8 @@ Call `asc` on an ActiveRecord object or on an ActiveRecord::Relation object to s
54
60
  `ascending` and `ascending_order` are aliases of `asc`.
55
61
 
56
62
 
63
+ ### desc
64
+
57
65
  Call `desc` on an ActiveRecord object or on an ActiveRecord::Relation object to sort the column(s) in a descending way.
58
66
 
59
67
  ```ruby
@@ -66,12 +74,16 @@ Call `desc` on an ActiveRecord object or on an ActiveRecord::Relation object to
66
74
  # using multiple parameters to specify more than one column for the sort clause
67
75
  Candy.where(:sugar => true).desc(:classification, :name)
68
76
 
69
- # using an array to pass mutliple argument
77
+ # using an array to pass mutliple arguments
70
78
  Candy.where(:sugar => true).desc([:classification, :name])
71
79
 
72
80
  # using a string to specify more than one column for the sort clause
73
81
  Candy.where(:sugar => true).desc('classification, name')
74
82
 
83
+ # without argument, the method generates a sort by id (custom primary key supported)
84
+ # SELECT "candies".* FROM "candies" ORDER BY id DESC
85
+ Candy.where(:sugar => true).desc
86
+
75
87
  # the method is chainable
76
88
  Candy.where(:sugar => true).desc(:classification).desc(:name)
77
89
  ```
@@ -79,6 +91,12 @@ Call `desc` on an ActiveRecord object or on an ActiveRecord::Relation object to
79
91
  `descending` and `descending_order` are aliases of `desc`.
80
92
 
81
93
 
94
+ ### order_by
95
+
96
+ The current version of this gem introduces a new method called `order_by`. At this time, it's just an alias of the
97
+ built-in `order` method but will be extended in future versions of the library.
98
+
99
+
82
100
  ## Development
83
101
 
84
102
  Questions or problems? Please post them on the [issue tracker](https://github.com/dwerlen/asc_desc/issues).
data/asc_desc.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.email = ['werlen@icare.ch']
10
10
  s.homepage = 'http://github.com/dwerlen/asc_desc'
11
11
  s.summary = %q{add "asc" and "desc" methods to ActiveRecord}
12
- s.description = %q{This gem adds two new methods to ActiveRecord (and ActiveRecord::Relation) that allow to sort SQL queries without using the "ASC" and "DESC" SQL keywords.}
12
+ s.description = %q{This gem adds two new methods to ActiveRecord (and ActiveRecord::Relation) that allows to sort SQL queries without using the "ASC" and "DESC" SQL keywords.}
13
13
 
14
14
  s.rubyforge_project = 'asc_desc'
15
15
 
@@ -18,6 +18,8 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ['lib']
20
20
 
21
+ s.add_runtime_dependency 'activerecord', '>= 3.0.0'
22
+
21
23
  s.add_development_dependency 'rake'
22
24
  s.add_development_dependency 'rspec'
23
25
  s.add_development_dependency 'with_model'
@@ -19,11 +19,15 @@ module AscDesc
19
19
  # using a string to specify more than one column for the sort clause
20
20
  # Candy.where(:sugar => true).asc('classification, name')
21
21
  #
22
+ # without argument, the method generates a sort by id (custom primary key supported)
23
+ # SELECT "candies".* FROM "candies" ORDER BY id ASC
24
+ # Candy.where(:sugar => true).asc
25
+ #
22
26
  # the method is chainable
23
27
  # Candy.where(:sugar => true).asc(:classification).asc(:name)
24
28
  #
25
29
  def asc(*args)
26
- self.order AscDesc.format_order_clause(*args << AscDesc::ASC)
30
+ self.order AscDesc.format_order_clause(*(args.presence || [self.primary_key]) << AscDesc::ASC)
27
31
  end
28
32
  alias :ascending :asc
29
33
  alias :ascending_order :asc
@@ -47,14 +51,27 @@ module AscDesc
47
51
  # using a string to specify more than one column for the sort clause
48
52
  # Candy.where(:sugar => true).desc('classification, name')
49
53
  #
54
+ # without argument, the method generates a sort by id (custom primary key supported)
55
+ # SELECT "candies".* FROM "candies" ORDER BY id DESC
56
+ # Candy.where(:sugar => true).desc
57
+ #
50
58
  # the method is chainable
51
59
  # Candy.where(:sugar => true).desc(:classification).desc(:name)
52
60
  #
53
61
  def desc(*args)
54
- self.order AscDesc.format_order_clause(*args << AscDesc::DESC)
62
+ self.order AscDesc.format_order_clause(*(args.presence || [self.primary_key]) << AscDesc::DESC)
55
63
  end
56
64
  alias :descending :desc
57
65
  alias :descending_order :desc
58
66
 
67
+
68
+ # alias of the built-in `order` method.
69
+ #
70
+ # Will be extended in future versions of the library.
71
+ #
72
+ def order_by(*args)
73
+ self.order(*args)
74
+ end
75
+
59
76
  end
60
77
  end
@@ -1,3 +1,3 @@
1
1
  module AscDesc
2
- VERSION = '0.0.1'
3
- end
2
+ VERSION = '0.0.2'
3
+ end
@@ -16,6 +16,21 @@ describe AscDesc::ModelAdditions do
16
16
  end
17
17
  end
18
18
 
19
+ with_model :Bonbon do
20
+ # The table block works just like a migration.
21
+ table :primary_key => :id_bonbon do |t|
22
+ t.string :name
23
+ t.string :classification
24
+ t.boolean :sugar
25
+ t.timestamps
26
+ end
27
+ # The model block works just like the class definition.
28
+ model do
29
+ extend AscDesc::ModelAdditions
30
+ self.primary_key = :id_bonbon
31
+ end
32
+ end
33
+
19
34
  it 'respond to a class method named "asc"' do
20
35
  Candy.respond_to?(:asc).should be_true
21
36
  Candy.respond_to?(:ascending).should be_true
@@ -28,6 +43,10 @@ describe AscDesc::ModelAdditions do
28
43
  Candy.respond_to?(:descending_order).should be_true
29
44
  end
30
45
 
46
+ it 'respond to a class method named "order_by"' do
47
+ Candy.respond_to?(:order_by).should be_true
48
+ end
49
+
31
50
  describe '.asc' do
32
51
 
33
52
  it 'should return an ActiveRecord Relation' do
@@ -53,7 +72,7 @@ describe AscDesc::ModelAdditions do
53
72
  candies.to_sql.should be_end_with('ORDER BY classification ASC, name ASC')
54
73
  end
55
74
 
56
- it 'can format an array as mutliple argument' do
75
+ it 'can format an array as mutliple arguments' do
57
76
  candies = Candy.asc([:classification, :name])
58
77
  candies.to_sql.should be_end_with('ORDER BY classification ASC, name ASC')
59
78
  candies = Candy.asc([:classification, :name], :sugar)
@@ -73,11 +92,22 @@ describe AscDesc::ModelAdditions do
73
92
  candies.to_sql.should be_end_with('ORDER BY classification ASC, name ASC, sugar ASC')
74
93
  end
75
94
 
95
+ it 'generates a sort by id when no argument is passed' do
96
+ candies = Candy.asc
97
+ candies.to_sql.should be_end_with('ORDER BY id ASC')
98
+ end
99
+
100
+ it 'generates a sort by id when no argument is passed even with a custom primary key' do
101
+ bonbons = Bonbon.asc
102
+ bonbons.to_sql.should be_end_with('ORDER BY id_bonbon ASC')
103
+ end
104
+
76
105
  it 'should be chainable' do
77
106
  candies = Candy.asc(:name)
107
+ candies = candies.asc
78
108
  candies = candies.asc(:sugar)
79
109
  candies.should be_an_instance_of(ActiveRecord::Relation)
80
- candies.to_sql.should be_end_with('ORDER BY name ASC, sugar ASC')
110
+ candies.to_sql.should be_end_with('ORDER BY name ASC, id ASC, sugar ASC')
81
111
  end
82
112
 
83
113
  end
@@ -107,7 +137,7 @@ describe AscDesc::ModelAdditions do
107
137
  candies.to_sql.should be_end_with('ORDER BY classification DESC, name DESC')
108
138
  end
109
139
 
110
- it 'can format an array as mutliple argument' do
140
+ it 'can format an array as mutliple arguments' do
111
141
  candies = Candy.desc([:classification, :name])
112
142
  candies.to_sql.should be_end_with('ORDER BY classification DESC, name DESC')
113
143
  candies = Candy.desc([:classification, :name], :sugar)
@@ -127,11 +157,41 @@ describe AscDesc::ModelAdditions do
127
157
  candies.to_sql.should be_end_with('ORDER BY classification DESC, name DESC, sugar DESC')
128
158
  end
129
159
 
160
+ it 'generates a sort by id when no argument is passed' do
161
+ candies = Candy.desc
162
+ candies.to_sql.should be_end_with('ORDER BY id DESC')
163
+ end
164
+
165
+ it 'generates a sort by id when no argument is passed even with a custom primary key' do
166
+ bonbons = Bonbon.desc
167
+ bonbons.to_sql.should be_end_with('ORDER BY id_bonbon DESC')
168
+ end
169
+
130
170
  it 'should be chainable' do
131
171
  candies = Candy.desc(:name)
172
+ candies = candies.desc
132
173
  candies = candies.desc(:sugar)
133
174
  candies.should be_an_instance_of(ActiveRecord::Relation)
134
- candies.to_sql.should be_end_with('ORDER BY name DESC, sugar DESC')
175
+ candies.to_sql.should be_end_with('ORDER BY name DESC, id DESC, sugar DESC')
176
+ end
177
+
178
+ end
179
+
180
+ describe '.order_by' do
181
+
182
+ it 'should return an ActiveRecord Relation' do
183
+ candies = Candy.order_by(:name)
184
+ candies.should be_an_instance_of(ActiveRecord::Relation)
185
+ end
186
+
187
+ it 'should define the "ORDER BY" clause of the underlying SQL query' do
188
+ candies = Candy.order_by('classification ASC, name DESC')
189
+ candies.to_sql.should be_end_with('ORDER BY classification ASC, name DESC')
190
+ end
191
+
192
+ it 'should accept multiple parameters' do
193
+ candies = Candy.order_by('classification DESC', 'name ASC')
194
+ candies.to_sql.should be_end_with('ORDER BY classification DESC, name ASC')
135
195
  end
136
196
 
137
197
  end
@@ -35,7 +35,7 @@ describe AscDesc do
35
35
  AscDesc.format_order_clause('classification', 'name', AscDesc::DESC).should eq('classification DESC, name DESC')
36
36
  end
37
37
 
38
- it 'can format an array as mutliple argument' do
38
+ it 'can format an array as mutliple arguments' do
39
39
  AscDesc.format_order_clause([:classification, :name], AscDesc::ASC).should eq('classification ASC, name ASC')
40
40
  AscDesc.format_order_clause([:classification, :name], AscDesc::DESC).should eq('classification DESC, name DESC')
41
41
  AscDesc.format_order_clause([:classification, :name], :sugar, AscDesc::DESC).should eq('classification DESC, name DESC, sugar DESC')
@@ -44,7 +44,7 @@ describe AscDesc do
44
44
  AscDesc.format_order_clause(['classification', 'name'], 'sugar', AscDesc::DESC).should eq('classification DESC, name DESC, sugar DESC')
45
45
  end
46
46
 
47
- it 'can formata string to specify more than one column for the sort clause' do
47
+ it 'can format a string to specify more than one column for the sort clause' do
48
48
  AscDesc.format_order_clause('classification, name', :sugar, AscDesc::ASC).should eq('classification ASC, name ASC, sugar ASC')
49
49
  AscDesc.format_order_clause(['classification, name', :sugar], AscDesc::ASC).should eq('classification ASC, name ASC, sugar ASC')
50
50
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: asc_desc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-20 00:00:00.000000000Z
12
+ date: 2012-02-27 00:00:00.000000000Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activerecord
16
+ requirement: &70194618974440 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 3.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70194618974440
14
25
  - !ruby/object:Gem::Dependency
15
26
  name: rake
16
- requirement: &70196428113380 !ruby/object:Gem::Requirement
27
+ requirement: &70194618974020 !ruby/object:Gem::Requirement
17
28
  none: false
18
29
  requirements:
19
30
  - - ! '>='
@@ -21,10 +32,10 @@ dependencies:
21
32
  version: '0'
22
33
  type: :development
23
34
  prerelease: false
24
- version_requirements: *70196428113380
35
+ version_requirements: *70194618974020
25
36
  - !ruby/object:Gem::Dependency
26
37
  name: rspec
27
- requirement: &70196428112960 !ruby/object:Gem::Requirement
38
+ requirement: &70194618973560 !ruby/object:Gem::Requirement
28
39
  none: false
29
40
  requirements:
30
41
  - - ! '>='
@@ -32,10 +43,10 @@ dependencies:
32
43
  version: '0'
33
44
  type: :development
34
45
  prerelease: false
35
- version_requirements: *70196428112960
46
+ version_requirements: *70194618973560
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: with_model
38
- requirement: &70196428112540 !ruby/object:Gem::Requirement
49
+ requirement: &70194618973140 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '0'
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *70196428112540
57
+ version_requirements: *70194618973140
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: activerecord
49
- requirement: &70196428112040 !ruby/object:Gem::Requirement
60
+ requirement: &70194618972640 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ~>
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: 3.2.1
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *70196428112040
68
+ version_requirements: *70194618972640
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: sqlite3
60
- requirement: &70196428111540 !ruby/object:Gem::Requirement
71
+ requirement: &70194618972140 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ~>
@@ -65,9 +76,9 @@ dependencies:
65
76
  version: 1.3.5
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *70196428111540
79
+ version_requirements: *70194618972140
69
80
  description: This gem adds two new methods to ActiveRecord (and ActiveRecord::Relation)
70
- that allow to sort SQL queries without using the "ASC" and "DESC" SQL keywords.
81
+ that allows to sort SQL queries without using the "ASC" and "DESC" SQL keywords.
71
82
  email:
72
83
  - werlen@icare.ch
73
84
  executables: []