1
0
mirror of https://github.com/danbee/slugtastic synced 2025-03-04 08:49:05 +00:00

Compare commits

..

No commits in common. "master" and "v1.0.0" have entirely different histories.

15 changed files with 77 additions and 832 deletions

View File

@ -1,651 +0,0 @@
AllCops:
Exclude:
- db/schema.rb
TargetRubyVersion: 2.3
Naming/AccessorMethodName:
Description: Check the naming of accessor methods for get_/set_.
Enabled: false
Style/Alias:
Description: 'Use alias_method instead of alias.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#alias-method'
Enabled: false
Style/ArrayJoin:
Description: 'Use Array#join instead of Array#*.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#array-join'
Enabled: false
Style/AsciiComments:
Description: 'Use only ascii symbols in comments.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-comments'
Enabled: false
Naming/AsciiIdentifiers:
Description: 'Use only ascii symbols in identifiers.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-identifiers'
Enabled: false
Style/Attr:
Description: 'Checks for uses of Module#attr.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr'
Enabled: false
Metrics/BlockNesting:
Description: 'Avoid excessive block nesting'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#three-is-the-number-thou-shalt-count'
Enabled: false
Style/CaseEquality:
Description: 'Avoid explicit use of the case equality operator(===).'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-case-equality'
Enabled: false
Style/CharacterLiteral:
Description: 'Checks for uses of character literals.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-character-literals'
Enabled: false
Style/ClassAndModuleChildren:
Description: 'Checks style of children classes and modules.'
Enabled: true
EnforcedStyle: nested
Metrics/ClassLength:
Description: 'Avoid classes longer than 100 lines of code.'
Enabled: false
Metrics/ModuleLength:
Description: 'Avoid modules longer than 100 lines of code.'
Enabled: false
Style/ClassVars:
Description: 'Avoid the use of class variables.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-class-vars'
Enabled: false
Style/CollectionMethods:
Enabled: true
PreferredMethods:
find: detect
inject: reduce
collect: map
find_all: select
Style/ColonMethodCall:
Description: 'Do not use :: for method call.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#double-colons'
Enabled: false
Style/CommentAnnotation:
Description: >-
Checks formatting of special comments
(TODO, FIXME, OPTIMIZE, HACK, REVIEW).
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#annotate-keywords'
Enabled: false
Metrics/AbcSize:
Description: >-
A calculated magnitude based on number of assignments,
branches, and conditions.
Enabled: false
Metrics/BlockLength:
CountComments: true # count full line comments?
Max: 25
ExcludedMethods: []
Exclude:
- "spec/**/*"
Metrics/CyclomaticComplexity:
Description: >-
A complexity metric that is strongly correlated to the number
of test cases needed to validate a method.
Enabled: false
Rails/Delegate:
Description: 'Prefer delegate method for delegations.'
Enabled: false
Style/PreferredHashMethods:
Description: 'Checks use of `has_key?` and `has_value?` Hash methods.'
StyleGuide: '#hash-key'
Enabled: false
Style/Documentation:
Description: 'Document classes and non-namespace modules.'
Enabled: false
Style/DoubleNegation:
Description: 'Checks for uses of double negation (!!).'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-bang-bang'
Enabled: false
Style/EachWithObject:
Description: 'Prefer `each_with_object` over `inject` or `reduce`.'
Enabled: false
Style/EmptyLiteral:
Description: 'Prefer literals to Array.new/Hash.new/String.new.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#literal-array-hash'
Enabled: false
# Checks whether the source file has a utf-8 encoding comment or not
# AutoCorrectEncodingComment must match the regex
# /#.*coding\s?[:=]\s?(?:UTF|utf)-8/
Style/Encoding:
Enabled: false
Style/EvenOdd:
Description: 'Favor the use of Fixnum#even? && Fixnum#odd?'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods'
Enabled: false
Naming/FileName:
Description: 'Use snake_case for source file names.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-files'
Enabled: false
Style/FrozenStringLiteralComment:
Description: >-
Add the frozen_string_literal comment to the top of files
to help transition from Ruby 2.3.0 to Ruby 3.0.
Enabled: false
Style/FlipFlop:
Description: 'Checks for flip flops'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-flip-flops'
Enabled: false
Style/FormatString:
Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#sprintf'
Enabled: false
Style/GlobalVars:
Description: 'Do not introduce global variables.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#instance-vars'
Reference: 'http://www.zenspider.com/Languages/Ruby/QuickRef.html'
Enabled: false
Style/GuardClause:
Description: 'Check for conditionals that can be replaced with guard clauses'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals'
Enabled: false
Style/IfUnlessModifier:
Description: >-
Favor modifier if/unless usage when you have a
single-line body.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier'
Enabled: false
Style/IfWithSemicolon:
Description: 'Do not use if x; .... Use the ternary operator instead.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon-ifs'
Enabled: false
Style/InlineComment:
Description: 'Avoid inline comments.'
Enabled: false
Style/Lambda:
Description: 'Use the new lambda literal syntax for single-line blocks.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#lambda-multi-line'
Enabled: false
Style/LambdaCall:
Description: 'Use lambda.call(...) instead of lambda.(...).'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc-call'
Enabled: false
Style/LineEndConcatenation:
Description: >-
Use \ instead of + or << to concatenate two string literals at
line end.
Enabled: false
Metrics/LineLength:
Description: 'Limit lines to 80 characters.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#80-character-limits'
Max: 80
Metrics/MethodLength:
Description: 'Avoid methods longer than 10 lines of code.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
Enabled: false
Style/ModuleFunction:
Description: 'Checks for usage of `extend self` in modules.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#module-function'
Enabled: false
Style/MultilineBlockChain:
Description: 'Avoid multi-line chains of blocks.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks'
Enabled: false
Style/NegatedIf:
Description: >-
Favor unless over if for negative conditions
(or control flow or).
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#unless-for-negatives'
Enabled: false
Style/NegatedWhile:
Description: 'Favor until over while for negative conditions.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#until-for-negatives'
Enabled: false
Style/Next:
Description: 'Use `next` to skip iteration instead of a condition at the end.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals'
Enabled: false
Style/NilComparison:
Description: 'Prefer x.nil? to x == nil.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods'
Enabled: false
Style/Not:
Description: 'Use ! instead of not.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bang-not-not'
Enabled: false
Style/NumericLiterals:
Description: >-
Add underscores to large numeric literals to improve their
readability.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics'
Enabled: false
Style/OneLineConditional:
Description: >-
Favor the ternary operator(?:) over
if/then/else/end constructs.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#ternary-operator'
Enabled: false
Naming/BinaryOperatorParameterName:
Description: 'When defining binary operators, name the argument other.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#other-arg'
Enabled: false
Metrics/ParameterLists:
Description: 'Avoid parameter lists longer than three or four parameters.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params'
Enabled: false
Style/PercentLiteralDelimiters:
Description: 'Use `%`-literal delimiters consistently'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-literal-braces'
Enabled: false
Style/PerlBackrefs:
Description: 'Avoid Perl-style regex back references.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers'
Enabled: false
Naming/PredicateName:
Description: 'Check the names of predicate methods.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark'
NamePrefixBlacklist:
- is_
Exclude:
- spec/**/*
Style/Proc:
Description: 'Use proc instead of Proc.new.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc'
Enabled: false
Style/RaiseArgs:
Description: 'Checks the arguments passed to raise/fail.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#exception-class-messages'
Enabled: false
Style/RegexpLiteral:
Description: 'Use / or %r around regular expressions.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-r'
Enabled: false
Style/SelfAssignment:
Description: >-
Checks for places where self-assignment shorthand should have
been used.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#self-assignment'
Enabled: false
Style/SingleLineBlockParams:
Description: 'Enforces the names of some block params.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#reduce-blocks'
Enabled: false
Style/SingleLineMethods:
Description: 'Avoid single-line methods.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-single-line-methods'
Enabled: false
Style/SignalException:
Description: 'Checks for proper usage of fail and raise.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#fail-method'
Enabled: false
Style/SpecialGlobalVars:
Description: 'Avoid Perl-style global variables.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms'
Enabled: false
Style/StringLiterals:
Description: 'Checks if uses of quotes match the configured preference.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-string-literals'
EnforcedStyle: double_quotes
Enabled: true
Style/TrailingCommaInArguments:
Description: 'Checks for trailing comma in argument lists.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
EnforcedStyleForMultiline: comma
SupportedStylesForMultiline:
- comma
- consistent_comma
- no_comma
Enabled: true
Style/TrailingCommaInArrayLiteral:
Description: 'Checks for trailing comma in array literals.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
EnforcedStyleForMultiline: comma
SupportedStylesForMultiline:
- comma
- consistent_comma
- no_comma
Enabled: true
Style/TrailingCommaInHashLiteral:
Description: 'Checks for trailing comma in hash literals.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas'
EnforcedStyleForMultiline: comma
SupportedStylesForMultiline:
- comma
- consistent_comma
- no_comma
Enabled: true
Style/TrivialAccessors:
Description: 'Prefer attr_* methods to trivial readers/writers.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr_family'
Enabled: false
Style/VariableInterpolation:
Description: >-
Don't interpolate global, instance and class variables
directly in strings.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#curlies-interpolate'
Enabled: false
Style/WhenThen:
Description: 'Use when x then ... for one-line cases.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#one-line-cases'
Enabled: false
Style/WhileUntilModifier:
Description: >-
Favor modifier while/until usage when you have a
single-line body.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#while-as-a-modifier'
Enabled: false
Style/WordArray:
Description: 'Use %w or %W for arrays of words.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-w'
Enabled: false
# Layout
Layout/AlignParameters:
Description: 'Here we check if the parameters on a multi-line method call or definition are aligned.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-double-indent'
Enabled: false
Layout/ConditionPosition:
Description: >-
Checks for condition placed in a confusing position relative to
the keyword.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#same-line-condition'
Enabled: false
Layout/DotPosition:
Description: 'Checks the position of the dot in multi-line method calls.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains'
EnforcedStyle: leading
Layout/ExtraSpacing:
Description: 'Do not use unnecessary spacing.'
Enabled: true
Layout/MultilineOperationIndentation:
Description: >-
Checks indentation of binary operations that span more than
one line.
Enabled: true
EnforcedStyle: indented
Layout/MultilineMethodCallIndentation:
Description: >-
Checks indentation of method calls with the dot operator
that span more than one line.
Enabled: true
EnforcedStyle: indented
Layout/InitialIndentation:
Description: >-
Checks the indentation of the first non-blank non-comment line in a file.
Enabled: false
# Lint
Lint/AmbiguousOperator:
Description: >-
Checks for ambiguous operators in the first argument of a
method invocation without parentheses.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-as-args'
Enabled: false
Lint/AmbiguousRegexpLiteral:
Description: >-
Checks for ambiguous regexp literals in the first argument of
a method invocation without parenthesis.
Enabled: false
Lint/AssignmentInCondition:
Description: "Don't use assignment in conditions."
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition'
Enabled: false
Lint/CircularArgumentReference:
Description: "Don't refer to the keyword argument in the default value."
Enabled: false
Lint/DeprecatedClassMethods:
Description: 'Check for deprecated class method calls.'
Enabled: false
Lint/DuplicatedKey:
Description: 'Check for duplicate keys in hash literals.'
Enabled: false
Lint/EachWithObjectArgument:
Description: 'Check for immutable argument given to each_with_object.'
Enabled: false
Lint/ElseLayout:
Description: 'Check for odd code arrangement in an else block.'
Enabled: false
Lint/FormatParameterMismatch:
Description: 'The number of parameters to format/sprint must match the fields.'
Enabled: false
Lint/HandleExceptions:
Description: "Don't suppress exception."
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions'
Enabled: false
Lint/LiteralAsCondition:
Description: 'Checks of literals used in conditions.'
Enabled: false
Lint/LiteralInInterpolation:
Description: 'Checks for literals used in interpolation.'
Enabled: false
Lint/Loop:
Description: >-
Use Kernel#loop with break rather than begin/end/until or
begin/end/while for post-loop tests.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#loop-with-break'
Enabled: false
Lint/NestedMethodDefinition:
Description: 'Do not use nested method definitions.'
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-methods'
Enabled: false
Lint/NonLocalExitFromIterator:
Description: 'Do not use return in iterator to cause non-local exit.'
Enabled: false
Lint/ParenthesesAsGroupedExpression:
Description: >-
Checks for method calls with a space before the opening
parenthesis.
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces'
Enabled: false
Lint/RequireParentheses:
Description: >-
Use parentheses in the method call to avoid confusion
about precedence.
Enabled: false
Lint/UnderscorePrefixedVariableName:
Description: 'Do not use prefix `_` for a variable that is used.'
Enabled: false
Lint/UnneededCopDisableDirective:
Description: >-
Checks for rubocop:disable comments that can be removed.
Note: this cop is not disabled when disabling all cops.
It must be explicitly disabled.
Enabled: false
Lint/Void:
Description: 'Possible use of operator/literal/variable in void context.'
Enabled: false
# Performance
Performance/CaseWhenSplat:
Description: >-
Place `when` conditions that use splat at the end
of the list of `when` branches.
Enabled: false
Performance/Count:
Description: >-
Use `count` instead of `select...size`, `reject...size`,
`select...count`, `reject...count`, `select...length`,
and `reject...length`.
Enabled: false
Performance/Detect:
Description: >-
Use `detect` instead of `select.first`, `find_all.first`,
`select.last`, and `find_all.last`.
Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerabledetect-vs-enumerableselectfirst-code'
Enabled: false
Performance/FlatMap:
Description: >-
Use `Enumerable#flat_map`
instead of `Enumerable#map...Array#flatten(1)`
or `Enumberable#collect..Array#flatten(1)`
Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablemaparrayflatten-vs-enumerableflat_map-code'
Enabled: false
Performance/ReverseEach:
Description: 'Use `reverse_each` instead of `reverse.each`.'
Reference: 'https://github.com/JuanitoFatas/fast-ruby#enumerablereverseeach-vs-enumerablereverse_each-code'
Enabled: false
Performance/Sample:
Description: >-
Use `sample` instead of `shuffle.first`,
`shuffle.last`, and `shuffle[Fixnum]`.
Reference: 'https://github.com/JuanitoFatas/fast-ruby#arrayshufflefirst-vs-arraysample-code'
Enabled: false
Performance/Size:
Description: >-
Use `size` instead of `count` for counting
the number of elements in `Array` and `Hash`.
Reference: 'https://github.com/JuanitoFatas/fast-ruby#arraycount-vs-arraysize-code'
Enabled: false
Performance/StringReplacement:
Description: >-
Use `tr` instead of `gsub` when you are replacing the same
number of characters. Use `delete` instead of `gsub` when
you are deleting characters.
Reference: 'https://github.com/JuanitoFatas/fast-ruby#stringgsub-vs-stringtr-code'
Enabled: false
# Rails
Rails/ActionFilter:
Description: 'Enforces consistent use of action filter methods.'
Enabled: false
Rails/Date:
Description: >-
Checks the correct usage of date aware methods,
such as Date.today, Date.current etc.
Enabled: false
Rails/FindBy:
Description: 'Prefer find_by over where.first.'
Enabled: false
Rails/FindEach:
Description: 'Prefer all.find_each over all.find.'
Enabled: false
Rails/HasAndBelongsToMany:
Description: 'Prefer has_many :through to has_and_belongs_to_many.'
Enabled: false
Rails/Output:
Description: 'Checks for calls to puts, print, etc.'
Enabled: false
Rails/ReadWriteAttribute:
Description: >-
Checks for read_attribute(:attr) and
write_attribute(:attr, val).
Enabled: false
Rails/ScopeArgs:
Description: 'Checks the arguments of ActiveRecord scopes.'
Enabled: false
Rails/TimeZone:
Description: 'Checks the correct usage of time zone aware methods.'
StyleGuide: 'https://github.com/bbatsov/rails-style-guide#time'
Reference: 'http://danilenko.org/2012/7/6/rails_timezones'
Enabled: false
Rails/Validation:
Description: 'Use validates :attribute, hash of validations.'
Enabled: false

3
.travis.yml Normal file
View File

@ -0,0 +1,3 @@
rvm:
- 1.9.2
- 1.9.3

View File

@ -1,25 +1,3 @@
## v2.0.1
* Update homepage to new location.
## v2.0.0
* Remove dependency on supermodel for tests.
## v1.2.0
* Added ability to substitute hyphen delimiter.
## v1.1.0
* Slugs are now generated with `parameterize`.
* Spaces get converted to hyphens instead of underscores. Hyphens in the original string are collapsed.
* Removed dependence on iconv.
## v1.0.0
* Added test for slugs with numbers.
## v0.2.1 ## v0.2.1
* Added basic transliteration with IConv. * Added basic transliteration with IConv.

View File

@ -1,4 +1,4 @@
source "https://rubygems.org" source 'https://rubygems.org'
# Specify your gem's dependencies in slugtastic.gemspec # Specify your gem's dependencies in slugtastic.gemspec
gemspec gemspec

View File

@ -1,49 +1,36 @@
PATH PATH
remote: . remote: .
specs: specs:
slugtastic (2.0.1) slugtastic (0.2.1)
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
activemodel (5.2.0) activemodel (3.0.17)
activesupport (= 5.2.0) activesupport (= 3.0.17)
activesupport (5.2.0) builder (~> 2.1.2)
concurrent-ruby (~> 1.0, >= 1.0.2) i18n (~> 0.5.0)
i18n (>= 0.7, < 2) activesupport (3.0.17)
minitest (~> 5.1) builder (2.1.2)
tzinfo (~> 1.1) diff-lcs (1.1.3)
concurrent-ruby (1.0.5) i18n (0.5.0)
diff-lcs (1.3) rake (0.9.2.2)
i18n (1.0.1) rspec (2.11.0)
concurrent-ruby (~> 1.0) rspec-core (~> 2.11.0)
minitest (5.11.3) rspec-expectations (~> 2.11.0)
rake (12.3.1) rspec-mocks (~> 2.11.0)
rspec (3.7.0) rspec-core (2.11.1)
rspec-core (~> 3.7.0) rspec-expectations (2.11.2)
rspec-expectations (~> 3.7.0) diff-lcs (~> 1.1.3)
rspec-mocks (~> 3.7.0) rspec-mocks (2.11.2)
rspec-core (3.7.1) supermodel (0.1.6)
rspec-support (~> 3.7.0) activemodel (~> 3.0.0)
rspec-expectations (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.7.0)
rspec-mocks (3.7.0)
diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.7.0)
rspec-support (3.7.1)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
activemodel (~> 5) rake
rake (~> 12.3) rspec
rspec (~> 3.7)
slugtastic! slugtastic!
supermodel
BUNDLED WITH
1.16.1

View File

@ -1,4 +1,4 @@
Copyright (c) 2015 Dan Barber Copyright (c) 2012 Dan Barber
MIT License MIT License

View File

@ -1,25 +1,19 @@
# Slugtastic # Slugtastic [![Build Status](https://secure.travis-ci.org/danbee/slugtastic.png?branch=master)](http://travis-ci.org/danbee/slugtastic)
[![Codeship Status for danbee/slugtastic](https://codeship.com/projects/7a08ef30-0518-0132-d4b6-223503fac7d3/status?branch=master)](https://codeship.com/projects/30797) Simple gem for autogenerating permalink style slugs for your ActiveRecord models.
[![Gem Version](https://badge.fury.io/rb/slugtastic.svg)](https://badge.fury.io/rb/slugtastic)
Simple gem for autogenerating permalink style slugs for your ActiveRecord
models.
## Requirements ## Requirements
* Ruby 2.2.0+ * Ruby 1.9.2 or 1.9.3
* Rails 5 or higher. * Rails 3.1 or higher.
It will probably work just find with earlier versions--down to Rails 3.1 and It should work with Rails 3.0 but it hasn't been tested.
Ruby 1.9.3--but it's not tested.
## Installation ## Installation
Add this line to your application's Gemfile: Add this line to your application's Gemfile:
gem "slugtastic" gem 'slugtastic'
And then execute: And then execute:
@ -33,11 +27,9 @@ Or install it yourself as:
Usage is very simple. Just add the following to your model: Usage is very simple. Just add the following to your model:
slug :slug, from: :title has_slug :slug, :from => :title
This will generate a slug string from the title attribute and store it in the This will generate a slug string from the title atrribute and store it in the slug attribute unless the slug already contains a string. The slug is generated pre-validation so you can still use `validates_presence_of :slug`.
slug attribute unless the slug already contains a string. The slug is generated
pre-validation so you can still use `validates_presence_of :slug`.
There are no extra options at present. There are no extra options at present.

View File

@ -2,11 +2,12 @@ require "slugtastic/version"
require "slugtastic/model_additions" require "slugtastic/model_additions"
require "slugtastic/railtie" if defined? Rails require "slugtastic/railtie" if defined? Rails
# TODO: iconv will be deprecated in the future.
require 'iconv'
module Slugtastic module Slugtastic
def self.generate_slug(string, delimiter = nil) def self.generate_slug(string)
return if string.nil? return if string.nil?
slug = string.parameterize Iconv.iconv("ASCII//TRANSLIT//IGNORE", "UTF-8", string).join.downcase.gsub(/ /, '_').gsub(/[^a-z0-9\-_]/, '')
slug.gsub!("-", delimiter) if delimiter
slug
end end
end end

View File

@ -1,25 +1,19 @@
module Slugtastic module Slugtastic
module ModelAdditions module ModelAdditions
# To generate a slug from another value, call <tt>has_slug</tt> in any # To generate a slug from another value, call <tt>has_slug</tt> in any
# ActiveRecord model and pass in the name of the slug attribute. # ActiveRecord model and pass in the name of the slug attribute.
# By default the slug will be generated from the <tt>title</tt> attribute, # By default the slug will be generated from the <tt>title</tt> attribute, but
# but you can specify by adding <tt>:from => {attribute}</tt>. # you can specify by adding <tt>:from => {attribute}</tt>.
# #
# class Article < ActiveRecord::Base # class Article < ActiveRecord::Base
# has_slug :slug, :from => :title # has_slug :slug, :from => :title
# end # end
# def has_slug name, options = { :from => :title }
def slug(name, options = {}) before_validation do |record|
options.reverse_merge!(from: :title) send("#{name}=", Slugtastic.generate_slug(send(options[:from]))) if send(name).nil? or send(name).blank?
before_validation do
if send(name).nil? || send(name).blank?
send(
"#{name}=",
Slugtastic.generate_slug(send(options[:from]), options[:delimiter]),
)
end
end end
end end
end end
end end

View File

@ -1,3 +1,3 @@
module Slugtastic module Slugtastic
VERSION = "2.0.1".freeze VERSION = "1.0.0"
end end

View File

@ -1,24 +1,21 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
require File.expand_path('../lib/slugtastic/version', __FILE__)
require File.expand_path("lib/slugtastic/version", __dir__)
Gem::Specification.new do |gem| Gem::Specification.new do |gem|
gem.authors = ["Dan Barber"] gem.authors = ["Dan Barber"]
gem.email = ["danbee@gmail.com"] gem.email = ["danbee@gmail.com"]
gem.licenses = ["MIT"] gem.description = %q{A simple slug string generator for ActiveRecord. Will populate a slug attribute from another attribute.}
gem.description = "A simple slug string generator for ActiveRecord. " \ gem.summary = %q{A simple slug string generator for ActiveRecord.}
"Will populate a slug attribute from another attribute." gem.homepage = ""
gem.summary = "A simple slug string generator for ActiveRecord."
gem.homepage = "https://danbee.github.io/slugtastic"
gem.files = `git ls-files`.split($\) gem.files = `git ls-files`.split($\)
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) } gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
gem.name = "slugtastic" gem.name = "slugtastic"
gem.require_paths = ["lib"] gem.require_paths = ["lib"]
gem.version = Slugtastic::VERSION gem.version = Slugtastic::VERSION
gem.add_development_dependency "activemodel", "~> 5" gem.add_development_dependency "rake"
gem.add_development_dependency "rake", "~> 12.3" gem.add_development_dependency "rspec"
gem.add_development_dependency "rspec", "~> 3.7" gem.add_development_dependency "supermodel"
end end

View File

@ -1,48 +1,24 @@
# encoding: utf-8 # encoding: utf-8
require 'spec_helper'
require "spec_helper" class Model < SuperModel::Base
require "support/fake_model" include ActiveModel::Validations::Callbacks
class BaseModel < FakeModel
extend Slugtastic::ModelAdditions extend Slugtastic::ModelAdditions
end
class Model < BaseModel
attr_accessor :slug, :name
slug :slug, from: :name
end
class ModelDefault < BaseModel
attr_accessor :slug, :title attr_accessor :slug, :title
slug :slug has_slug :slug, from: :title
end
class ModelDelimiter < BaseModel
attr_accessor :slug, :title
slug :slug, delimiter: "_"
end end
describe Slugtastic::ModelAdditions do describe Slugtastic::ModelAdditions do
it "generates a slug from the name" do it "generates a slug from the title" do
expect(Model.create!(name: "A Simple Name").slug).to eq "a-simple-name" Model.create!(:title => "A Simple Title").slug.should eq "a_simple_title"
end
it "defaults to generating the slug from title" do
expect(ModelDefault.create!(title: "A Simple Title").slug)
.to eq "a-simple-title"
end
it "generates a slug from the title with delimiter substitutions" do
expect(ModelDelimiter.create!(title: "A Simple Title").slug)
.to eq "a_simple_title"
end end
it "doesn't regenerate the slug if it already exists" do it "doesn't regenerate the slug if it already exists" do
model = Model.create!(name: "A Simple Name") model = Model.create!(:title => "A Simple Title")
expect(model.slug).to eq "a-simple-name" model.slug.should eq "a_simple_title"
model.name = "A new title" model.title = "A new title"
model.save model.save
expect(model.slug).to eq "a-simple-name" model.slug.should eq "a_simple_title"
end end
end end

View File

@ -1,43 +1,31 @@
# encoding: utf-8 # encoding: utf-8
require 'spec_helper'
require "spec_helper"
describe Slugtastic do describe Slugtastic do
describe ".generate_slug" do describe ".generate_slug" do
it "returns empty if the input string is empty" do it "returns empty if the input string is empty" do
expect(Slugtastic.generate_slug("")).to eq "" Slugtastic.generate_slug("").should eq ""
end end
it "generates a slug from a simple string" do it "generates a slug from a simple string" do
expect(Slugtastic.generate_slug("A simple string.")) Slugtastic.generate_slug("A simple string.").should eq "a_simple_string"
.to eq "a-simple-string"
end
it "substitutes hyphens for delimiter if specified" do
expect(Slugtastic.generate_slug("A simple string.", "_"))
.to eq "a_simple_string"
end end
it "generates a slug from a string with numbers" do it "generates a slug from a string with numbers" do
expect(Slugtastic.generate_slug("Slugtastic was built in 2012.")) Slugtastic.generate_slug("Slugtastic was built in 2012.").should eq "slugtastic_was_built_in_2012"
.to eq "slugtastic-was-built-in-2012"
end end
it "handles strings with hypens in them" do it "handles strings with hypens in them" do
expect(Slugtastic.generate_slug("A string - with Hyphens")) Slugtastic.generate_slug("A string - with Hyphens").should eq "a_string_-_with_hyphens"
.to eq "a-string-with-hyphens"
end end
it "handles strings with other characters in them" do it "handles strings with other characters in them" do
expect(Slugtastic.generate_slug("A string, with /All sorts!")) Slugtastic.generate_slug("A string, with /All sorts!").should eq "a_string_with_all_sorts"
.to eq "a-string-with-all-sorts"
end end
it "handles basic transliteration" do it "handles basic transliteration" do
expect(Slugtastic.generate_slug("Un été À la maison.")) Slugtastic.generate_slug("Un été À la maison.").should eq "un_ete_a_la_maison"
.to eq "un-ete-a-la-maison" Slugtastic.generate_slug("Ātri brūna lapsa").should eq "atri_bruna_lapsa"
expect(Slugtastic.generate_slug("Ātri brūna lapsa"))
.to eq "atri-bruna-lapsa"
end end
end end
end end

View File

@ -1 +1,2 @@
require "slugtastic" require "slugtastic"
require "supermodel"

View File

@ -1,21 +0,0 @@
require "active_support/core_ext/hash/reverse_merge"
require "active_model"
class FakeModel
include ActiveModel::Validations::Callbacks
def initialize(attrs = {})
attrs.each do |key, value|
instance_variable_set(:"@#{key}", value)
end
end
def self.create!(attrs)
new(attrs).save
end
def save
_run_validation_callbacks
self
end
end