arrangeable 0.1.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e443aea681f9bb38807114868f0080e82401bf93b7714f267bb17f772391eac2
4
+ data.tar.gz: ca4fc95848b7c227ac5a4c03d8018b6ccc1b81f05bcf47aba1426e75b3482e19
5
+ SHA512:
6
+ metadata.gz: 3fdfd1ab819a50f249a08fef218323f7fbffe2947b08d33dd8ea91d0e4273b22a5c386186b3e6f5340e15ae4a46f5ad3dae2c1f7a2fb6c22008e7abfaaf90f9d
7
+ data.tar.gz: 7d7a989c3eaf26b21d3f75f611713aac9a5c6ff6ae2cdbd61e7483721a3e10821667d5d303bdb97f4de9c8119a51068c88697bf9ac27e9c4dda313335604cd79
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,7 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.6.5
7
+ before_install: gem install bundler -v 2.0.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in arrangeable.gemspec
4
+ gemspec
@@ -0,0 +1,48 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ arrangeable (0.1.0)
5
+ activesupport (~> 4.2.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ activesupport (4.2.11.1)
11
+ i18n (~> 0.7)
12
+ minitest (~> 5.1)
13
+ thread_safe (~> 0.3, >= 0.3.4)
14
+ tzinfo (~> 1.1)
15
+ concurrent-ruby (1.1.6)
16
+ diff-lcs (1.3)
17
+ i18n (0.9.5)
18
+ concurrent-ruby (~> 1.0)
19
+ minitest (5.14.0)
20
+ rake (10.5.0)
21
+ rspec (3.9.0)
22
+ rspec-core (~> 3.9.0)
23
+ rspec-expectations (~> 3.9.0)
24
+ rspec-mocks (~> 3.9.0)
25
+ rspec-core (3.9.1)
26
+ rspec-support (~> 3.9.1)
27
+ rspec-expectations (3.9.0)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.9.0)
30
+ rspec-mocks (3.9.1)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.9.0)
33
+ rspec-support (3.9.2)
34
+ thread_safe (0.3.6)
35
+ tzinfo (1.2.6)
36
+ thread_safe (~> 0.1)
37
+
38
+ PLATFORMS
39
+ ruby
40
+
41
+ DEPENDENCIES
42
+ arrangeable!
43
+ bundler (~> 2.0)
44
+ rake (~> 10.0)
45
+ rspec (~> 3.0)
46
+
47
+ BUNDLED WITH
48
+ 2.0.2
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Umar Al-Kfaween
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,61 @@
1
+ # Arrangeable
2
+
3
+ Arrangeable provides an organized and seamless way to sort your model objects by different attributes.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'arrangeable', '~> 0.1.0'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install arrangeable
20
+
21
+ ## Usage
22
+
23
+ Include Arrangeable inside ApplicationRecord or directly inside your model and override the `arrangeable_fields` method for each model to whitelist the fields you want to use for sorting:
24
+
25
+ ```ruby
26
+ class User < ApplicationRecord
27
+ include Arrangeable
28
+
29
+ concerning :Arranging do
30
+ class_methods do
31
+ def arrangeable_fields
32
+ %w[id first_name last_name]
33
+ end
34
+ end
35
+ end
36
+ end
37
+ ```
38
+
39
+ Failing to override `arrangeable_fields` will raise a `NotImplementedError`.
40
+
41
+ Now sort your model objects by calling `arrange` on a comma-separated order string. Prepend a negative sign `-` before a key to order by that key descendingly:
42
+
43
+ ```ruby
44
+
45
+ @users = User.all
46
+
47
+ order_string = 'first_name,-id'
48
+ @users = @users.arrange(order_string)
49
+ ```
50
+
51
+ The previous example will generate the following SQL order clause: `ORDER BY first_name ASC, id DESC`.
52
+
53
+ Note that `id` can always be used for sorting regardless of whether you whitelist it or not. Any non whitelisted sorting keys will be ignored.
54
+
55
+ ## Contributing
56
+
57
+ Bug reports and pull requests are welcome on GitHub at https://github.com/umar221b/arrangeable.
58
+
59
+ ## License
60
+
61
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,38 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "arrangeable/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "arrangeable"
7
+ spec.version = Arrangeable::VERSION
8
+ spec.authors = ["Umar Al-Kfaween"]
9
+ spec.email = ["omar.ka923@gmail.com"]
10
+
11
+ spec.summary = %q{Arrangeable provides an organized and seamless way to sort your model objects by different attributes }
12
+ spec.description = %q{Arrangeable provides an organized and seamless way to sort your model objects by different attributes }
13
+ spec.homepage = "https://github.com/umar221b/arrangeable"
14
+ spec.license = "MIT"
15
+
16
+ spec.required_ruby_version = '>= 2.2.2'
17
+
18
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
19
+
20
+ spec.metadata["homepage_uri"] = spec.homepage
21
+ spec.metadata["source_code_uri"] = "https://github.com/umar221b/arrangeable"
22
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
23
+
24
+ # Specify which files should be added to the gem when it is released.
25
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
27
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
28
+ end
29
+ spec.bindir = "exe"
30
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.require_paths = ["lib"]
32
+
33
+ spec.add_dependency "activesupport", ">= 4.2.0"
34
+
35
+ spec.add_development_dependency "bundler", "~> 2.0"
36
+ spec.add_development_dependency "rake", "~> 10.0"
37
+ spec.add_development_dependency "rspec", "~> 3.0"
38
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "arrangeable"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,37 @@
1
+ require "arrangeable/version"
2
+ require "active_support/concern"
3
+
4
+ module Arrangeable
5
+ # class Error < StandardError; end
6
+
7
+ extend ActiveSupport::Concern
8
+ included {}
9
+
10
+ class_methods do
11
+ def arrange(order_param)
12
+ order_by_clause = order_string(order_param)
13
+ order(order_by_clause)
14
+ end
15
+
16
+ # array of strings of fields that support being sorted by
17
+ def arrangeable_fields
18
+ raise NotImplementedError, 'You need to overwrite this method in the calling class'
19
+ end
20
+
21
+ private
22
+
23
+ def order_string(sort_string)
24
+ keys = sort_string.gsub(' ', '').split(',').uniq.reject(&:blank?)
25
+ keys << 'id' unless keys.include?('id') || keys.include?('-id')
26
+ keys.map do |key|
27
+ order = ' ASC'
28
+ if key[0] == '-'
29
+ order = ' DESC'
30
+ key = key[1..-1]
31
+ end
32
+ next unless arrangeable_fields.include?(key)
33
+ key + order
34
+ end.compact.join(', ')
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Arrangeable
2
+ VERSION = "0.1.0"
3
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: arrangeable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Umar Al-Kfaween
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-02-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: 'Arrangeable provides an organized and seamless way to sort your model
70
+ objects by different attributes '
71
+ email:
72
+ - omar.ka923@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - ".rspec"
79
+ - ".travis.yml"
80
+ - Gemfile
81
+ - Gemfile.lock
82
+ - LICENSE.txt
83
+ - README.md
84
+ - Rakefile
85
+ - arrangeable.gemspec
86
+ - bin/console
87
+ - bin/setup
88
+ - lib/arrangeable.rb
89
+ - lib/arrangeable/version.rb
90
+ homepage: https://github.com/umar221b/arrangeable
91
+ licenses:
92
+ - MIT
93
+ metadata:
94
+ homepage_uri: https://github.com/umar221b/arrangeable
95
+ source_code_uri: https://github.com/umar221b/arrangeable
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: 2.2.2
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubygems_version: 3.0.3
112
+ signing_key:
113
+ specification_version: 4
114
+ summary: Arrangeable provides an organized and seamless way to sort your model objects
115
+ by different attributes
116
+ test_files: []