superslug 1.0.0 → 1.1.0

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: 4bb95a3918571a903c9a509d9c946b210574a044
4
- data.tar.gz: ab49423eea4705981fe6f92b3313c6101449b417
3
+ metadata.gz: 2f0ee11116381b3e24a955f962973bda7198984b
4
+ data.tar.gz: a10c2275d5ebc3475f2c95633e13595d1ecd34b3
5
5
  SHA512:
6
- metadata.gz: 42be65db36d8de0dd0f295172faa5c5663ffd37ce4fbd32cd5f210e9792c6992c83a0a1e0515423dcb2dfd6a8644c0f7e01ecfd664e3d98510f8ff7b64fc2a93
7
- data.tar.gz: ca55bbda8233c591f3367886019d06e85e68e7977596fd8b1da9a0e6cfe90708334f28a34dca92cd76ae93d4c9bd8bde4c3af08bf55f30454ccc7d8b3078e21f
6
+ metadata.gz: 5b25d0056ce67fa436c15a7813873a57767429f6329a2ce99564fa7625f4fe417084db1138a2753b6de42e74ffae9755302ec4957393f07edf24402f7023a25c
7
+ data.tar.gz: dad171b682434a8d8ec046c27a474570ade5dbb8d449b901774c7575779111731b08373d83b89483c40ee85f753cb3e4dec550dcd25746f8e0d2161fe7db7636
@@ -0,0 +1,2 @@
1
+ .bundle/
2
+ pkg/
data/Gemfile ADDED
@@ -0,0 +1,14 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Declare your gem's dependencies in mark_it_zero.gemspec.
4
+ # Bundler will treat runtime dependencies like base dependencies, and
5
+ # development dependencies will be added by default to the :development group.
6
+ gemspec
7
+
8
+ # Declare any dependencies that are still in development here instead of in
9
+ # your gemspec. These might include edge Rails or gems from your path or
10
+ # Git. Remember to move these dependencies to your gemspec before releasing
11
+ # your gem to rubygems.org.
12
+
13
+ # To use debugger
14
+ # gem 'debugger'
@@ -0,0 +1,80 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ superslug (1.0.0)
5
+ rails (~> 4.1.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ actionmailer (4.1.10)
11
+ actionpack (= 4.1.10)
12
+ actionview (= 4.1.10)
13
+ mail (~> 2.5, >= 2.5.4)
14
+ actionpack (4.1.10)
15
+ actionview (= 4.1.10)
16
+ activesupport (= 4.1.10)
17
+ rack (~> 1.5.2)
18
+ rack-test (~> 0.6.2)
19
+ actionview (4.1.10)
20
+ activesupport (= 4.1.10)
21
+ builder (~> 3.1)
22
+ erubis (~> 2.7.0)
23
+ activemodel (4.1.10)
24
+ activesupport (= 4.1.10)
25
+ builder (~> 3.1)
26
+ activerecord (4.1.10)
27
+ activemodel (= 4.1.10)
28
+ activesupport (= 4.1.10)
29
+ arel (~> 5.0.0)
30
+ activesupport (4.1.10)
31
+ i18n (~> 0.6, >= 0.6.9)
32
+ json (~> 1.7, >= 1.7.7)
33
+ minitest (~> 5.1)
34
+ thread_safe (~> 0.1)
35
+ tzinfo (~> 1.1)
36
+ arel (5.0.1.20140414130214)
37
+ builder (3.2.2)
38
+ erubis (2.7.0)
39
+ i18n (0.7.0)
40
+ json (1.8.2)
41
+ mail (2.6.3)
42
+ mime-types (>= 1.16, < 3)
43
+ mime-types (2.5)
44
+ minitest (5.6.0)
45
+ rack (1.5.2)
46
+ rack-test (0.6.3)
47
+ rack (>= 1.0)
48
+ rails (4.1.10)
49
+ actionmailer (= 4.1.10)
50
+ actionpack (= 4.1.10)
51
+ actionview (= 4.1.10)
52
+ activemodel (= 4.1.10)
53
+ activerecord (= 4.1.10)
54
+ activesupport (= 4.1.10)
55
+ bundler (>= 1.3.0, < 2.0)
56
+ railties (= 4.1.10)
57
+ sprockets-rails (~> 2.0)
58
+ railties (4.1.10)
59
+ actionpack (= 4.1.10)
60
+ activesupport (= 4.1.10)
61
+ rake (>= 0.8.7)
62
+ thor (>= 0.18.1, < 2.0)
63
+ rake (10.4.2)
64
+ sprockets (3.0.2)
65
+ rack (~> 1.0)
66
+ sprockets-rails (2.2.4)
67
+ actionpack (>= 3.0)
68
+ activesupport (>= 3.0)
69
+ sprockets (>= 2.8, < 4.0)
70
+ thor (0.19.1)
71
+ thread_safe (0.3.5)
72
+ tzinfo (1.2.2)
73
+ thread_safe (~> 0.1)
74
+
75
+ PLATFORMS
76
+ ruby
77
+
78
+ DEPENDENCIES
79
+ bundler (~> 1.6)
80
+ superslug!
@@ -0,0 +1,20 @@
1
+ Copyright 2015 Warren Harrison, Sean C Davis
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,80 @@
1
+ SuperSlug
2
+ ==========
3
+
4
+ SuperSlug handles automatic generation of slugs (permalinks) for your rails
5
+ models
6
+
7
+ Installation
8
+ ----------
9
+
10
+ This gem is meant to work with Ruby on Rails projects. I recommend you add it
11
+ to your project's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'superslug'
15
+ ```
16
+
17
+ Then install your bundle:
18
+
19
+ ```text
20
+ $ bundle
21
+ ```
22
+
23
+ Usage
24
+ ----------
25
+
26
+ All you need are two columns on an Active Record model. I use `title` and
27
+ `slug` by default, but you can use whatever you want.
28
+
29
+ > Note: It's always faster to use string columns unless you absolutely have to
30
+ > use text.
31
+
32
+ When you have your columns, just add the `has_superslug` method into your
33
+ model.
34
+
35
+ ```ruby
36
+ has_superslug(source = :title, dest = :slug, options = {})
37
+ ```
38
+
39
+ The `source` column is the column *from which you want to generate the slug*,
40
+ while the destination (dest) column is *where the sluggified string is stored*.
41
+
42
+ ### Options
43
+
44
+ The only option is `separator`, which defines the character with which to fill
45
+ blank spaces in the string. For example, if it is a hyphen, then `Hello World`
46
+ becomes `hello-world`. See below for an example.
47
+
48
+ ### Example
49
+
50
+ If you have a `Page` model that has a `name` and a `permalink` column, and you
51
+ want to use underscore separators, then your model would look like this:
52
+
53
+ ```ruby
54
+ class Page < ActiveRecord::Base
55
+ has_superslug :name, :permalink, :separator => '_'
56
+ end
57
+ ```
58
+
59
+ ### Query Helpers
60
+
61
+ When you add the `has_superslug` method to your model, you also get a couple helpers.
62
+
63
+ First, SuperSlug assumes you are doing this to make friendly URLs, so it adds a
64
+ `to_param` method and uses your destination column for the parameter. Rails
65
+ uses the `id` attribute by default.
66
+
67
+ And second, the `find` method on an Active Record class using SuperSlug checks
68
+ for the slug first. Using the example above, if you ran `Page.find('hello-
69
+ world')`, it would check for pages with `permalink` matching `hello-world`, and
70
+ not the ID (which is the default).
71
+
72
+
73
+ Contributing
74
+ ----------
75
+
76
+ 1. Fork it ( https://github.com/[my-github-username]/cambium/fork )
77
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
78
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
79
+ 4. Push to the branch (`git push origin my-new-feature`)
80
+ 5. Create a new Pull Request
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -1,4 +1,5 @@
1
1
  require 'superslug/version'
2
2
  require 'superslug/superslug'
3
+
3
4
  module SuperSlug
4
- end
5
+ end
@@ -1,59 +1,64 @@
1
- module SuperSlug
2
- extend ActiveSupport::Concern
1
+ class << ActiveRecord::Base
3
2
 
4
- included do
5
- after_save :sluggify_slug
3
+ def has_superslug(source = :title, dest = :slug, options = {})
6
4
 
7
- def self.find(input)
5
+ source = source.to_s
6
+ dest = dest.to_s
7
+
8
+ # ---------------------------------------- Query Helpers
9
+
10
+ def find(input)
8
11
  if input.class == Array
9
12
  super
10
13
  else
11
14
  input.to_i.to_s == input.to_s ? super : find_by_slug(input)
12
15
  end
13
16
  end
14
- end
15
17
 
16
- def sluggify_slug
17
- if slug.blank?
18
- update_column(:slug, create_slug)
19
- else
20
- new_slug = slug.gsub(/[^a-zA-Z0-9 \-]/, "") # remove all bad characters
21
- new_slug.gsub!(/\ /, "-") # replace spaces with underscores
22
- new_slug.gsub!(/\-+/, "-") # replace repeating underscores
23
- update_column(:slug, new_slug) unless slug == new_slug
18
+ define_method "to_param" do
19
+ send(dest)
24
20
  end
25
- end
26
21
 
27
- def create_slug
28
- slug = self.title.downcase.gsub(/\&/, ' and ') # & -> and
29
- slug.gsub!(/[^a-zA-Z0-9 \-]/, "") # remove all bad characters
30
- slug.gsub!(/\ /, "-") # replace spaces with underscores
31
- slug.gsub!(/\-+/, "-") # replace repeating underscores
22
+ # ---------------------------------------- Validations
32
23
 
33
- dups = self.class.name.constantize.where(:slug => slug)
34
- if dups.count == 1 and dups.first != self
35
- if self.try(:idx)
36
- slug = "#{slug}-#{self.idx}"
37
- else
38
- slug = "#{slug}-#{self.id}"
39
- end
40
- end
41
- slug
42
- end
24
+ validates :"#{source}", :presence => true
43
25
 
44
- def make_slug_unique(slug)
45
- dups = self.class.name.constantize.where(:slug => slug)
46
- if dups.count == 1 and dups.first != self
47
- if self.try(:idx)
48
- slug = "#{slug}-#{self.idx}"
49
- else
50
- slug = "#{slug}-#{self.id}"
26
+ # ---------------------------------------- Callbacks
27
+
28
+ after_save :"convert_#{source}_to_#{dest}"
29
+
30
+ define_method "convert_#{source}_to_#{dest}" do
31
+ # reference the separator option
32
+ separator = options[:separator].present? ? options[:separator] : '-'
33
+ # Set the slug column to the source column if it's
34
+ # empty
35
+ superslug = send(dest).blank? ? self.send(source) : self.send(dest)
36
+ # make lower case
37
+ superslug = superslug.downcase
38
+ # replace ampersands with 'and'
39
+ superslug.gsub!(/\&/, ' and ')
40
+ # remove all bad characters
41
+ # (we allow hyphens, underscores, and plus marks)
42
+ superslug.gsub!(/[^a-zA-Z0-9 \-\_\+]/, "")
43
+ # replace spaces with underscores
44
+ superslug.gsub!(/\ /, separator)
45
+ # replace repeating underscores
46
+ superslug.gsub!(/#{separator}+/, separator)
47
+ # Find all records with the same slug value for the
48
+ # slug column
49
+ duplicates = self.class.name.constantize.where(dest.to_sym => superslug)
50
+ # Append the ID to the end of the slug if the slug
51
+ # column is already taken
52
+ if (duplicates - [self]).size > 0
53
+ superslug = "#{superslug}#{separator}#{self.id}"
54
+ end
55
+ # Update the column in the database unless it matches
56
+ # what's already there
57
+ unless superslug == self.send(dest)
58
+ update_columns(dest.to_sym => superslug)
51
59
  end
52
60
  end
53
- slug
54
- end
55
61
 
56
- def to_param
57
- slug
58
62
  end
59
- end
63
+
64
+ end
@@ -1,3 +1,3 @@
1
1
  module SuperSlug
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -1,13 +1,22 @@
1
1
  lib = File.expand_path('../lib', __FILE__)
2
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
  require 'superslug/version'
4
- Gem::Specification.new do |s|
5
- s.name = 'superslug'
6
- s.version = SuperSlug::VERSION
7
- s.summary = "Slugs, yo!"
8
- s.description = "A simple gem to autocreate slugs"
9
- s.authors = ['Warren Harrison','Sean Davis']
10
- s.email = ['warren@hungry-media.com','scdavis41@gmail.com']
11
- s.files = `git ls-files -z`.split("\x0")
12
- s.license = 'MIT'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'superslug'
7
+ spec.version = SuperSlug::VERSION
8
+ spec.authors = ['Warren Harrison','Sean Davis']
9
+ spec.email = ['warren@hungry-media.com','scdavis41@gmail.com']
10
+ spec.homepage = "https://github.com/seancdavis/mark_it_zero"
11
+ spec.summary = "Automate slug creation in your rails app"
12
+ spec.description = ""
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_dependency "rails", "~> 4.1.0"
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
13
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: superslug
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Warren Harrison
@@ -9,9 +9,37 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-02 00:00:00.000000000 Z
13
- dependencies: []
14
- description: A simple gem to autocreate slugs
12
+ date: 2015-04-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 4.1.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 4.1.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '1.6'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.6'
42
+ description: ''
15
43
  email:
16
44
  - warren@hungry-media.com
17
45
  - scdavis41@gmail.com
@@ -19,11 +47,17 @@ executables: []
19
47
  extensions: []
20
48
  extra_rdoc_files: []
21
49
  files:
50
+ - ".gitignore"
51
+ - Gemfile
52
+ - Gemfile.lock
53
+ - LICENSE.md
54
+ - README.md
55
+ - Rakefile
22
56
  - lib/superslug.rb
23
57
  - lib/superslug/superslug.rb
24
58
  - lib/superslug/version.rb
25
59
  - superslug.gemspec
26
- homepage:
60
+ homepage: https://github.com/seancdavis/mark_it_zero
27
61
  licenses:
28
62
  - MIT
29
63
  metadata: {}
@@ -46,5 +80,5 @@ rubyforge_project:
46
80
  rubygems_version: 2.2.0
47
81
  signing_key:
48
82
  specification_version: 4
49
- summary: Slugs, yo!
83
+ summary: Automate slug creation in your rails app
50
84
  test_files: []