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

Compare commits

..

30 Commits

Author SHA1 Message Date
a92774cc35
Update version and changelog 2018-04-19 13:04:46 -04:00
56abe4c340
Update homepage 2018-04-18 17:14:13 -04:00
38390b4e7c
Line break! 2018-04-18 17:12:06 -04:00
4b35645bc9
Update version and readme 2018-04-18 17:05:04 -04:00
5c06a15c39
Refactor fake model 2018-04-18 15:39:00 -04:00
4bedac5aed
Fix specs 2018-04-18 15:20:18 -04:00
1c4478223f
Update Gems 2018-04-18 15:19:30 -04:00
d8b335d8cf
Update rubocop and remove redundant travis config 2018-04-18 15:19:05 -04:00
ff59741b4d
Update rspec and rake 2016-03-26 00:11:58 +00:00
32ece72e95
Use semver for dependencies 2016-03-26 00:04:41 +00:00
13ea634db5
Add licences to gemspec 2016-03-26 00:04:33 +00:00
babb6d843c
Readme tweaks
We're no longer compatible with Ruby versions less than 2.0.0.
2016-03-25 23:59:35 +00:00
f067690272
Version number update to 1.3.0 2016-03-25 23:55:45 +00:00
1536e51534
Significant refactor and cleanup
Thanks Rubocop!
2016-03-25 23:55:29 +00:00
a6637f463a Switch to newer expect spec format 2015-11-01 10:45:03 +00:00
c1529f0867 Be more idiomatic 2015-11-01 10:41:37 +00:00
175bae7c50 Update bundle 2015-11-01 10:41:25 +00:00
8c6497934c Add Codeship badge 2015-11-01 10:24:17 +00:00
Dan Barber
3b09a3524b Add Ruby 2.0.0 to list of supported Rubies. 2013-04-15 14:32:54 +01:00
Dan Barber
da428eae3d Add homepage URL. 2013-04-15 12:48:21 +01:00
Dan Barber
c2fa3b810b Update version. 2013-04-15 12:37:21 +01:00
Dan Barber
2a4fa31aef Merge options. 2013-04-15 12:35:08 +01:00
Dan Barber
78bd5ee3bd Update changelog. 2013-02-12 17:55:22 +00:00
Dan Barber
c464bfda51 Update Gemfile.lock. 2013-02-12 17:53:43 +00:00
Dan Barber
ab98be95a0 Update version number. 2013-02-12 17:45:37 +00:00
Dan Barber
8d12d9e6b2 Update Gem dependencies. 2013-02-12 17:36:50 +00:00
Dan Barber
e5ca126c8a Add model additions for slug delimiter substitution. 2013-02-12 17:36:34 +00:00
Dan Barber
117b4e9398 Add delimiter substitution for slugs. 2013-02-12 17:15:51 +00:00
Dan Barber
066d38cb9b Slug generation now uses parameterize. 2012-12-20 15:42:40 +00:00
Dan Barber
edaaa06930 Updated changelog to reflect v1.0.0. 2012-08-21 10:19:47 +01:00
15 changed files with 832 additions and 77 deletions

651
.rubocop.yml Normal file
View File

@ -0,0 +1,651 @@
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

View File

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

View File

@ -1,3 +1,25 @@
## 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
* 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
gemspec

View File

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

View File

@ -1,4 +1,4 @@
Copyright (c) 2012 Dan Barber
Copyright (c) 2015 Dan Barber
MIT License
@ -19,4 +19,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

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

View File

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

View File

@ -1,19 +1,25 @@
module Slugtastic
module ModelAdditions
# 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.
# By default the slug will be generated from the <tt>title</tt> attribute, but
# you can specify by adding <tt>:from => {attribute}</tt>.
# By default the slug will be generated from the <tt>title</tt> attribute,
# but you can specify by adding <tt>:from => {attribute}</tt>.
#
# class Article < ActiveRecord::Base
# has_slug :slug, :from => :title
# end
def has_slug name, options = { :from => :title }
before_validation do |record|
send("#{name}=", Slugtastic.generate_slug(send(options[:from]))) if send(name).nil? or send(name).blank?
#
def slug(name, options = {})
options.reverse_merge!(from: :title)
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

View File

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

View File

@ -1,21 +1,24 @@
# -*- 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.authors = ["Dan Barber"]
gem.email = ["danbee@gmail.com"]
gem.description = %q{A simple slug string generator for ActiveRecord. Will populate a slug attribute from another attribute.}
gem.summary = %q{A simple slug string generator for ActiveRecord.}
gem.homepage = ""
gem.licenses = ["MIT"]
gem.description = "A simple slug string generator for ActiveRecord. " \
"Will populate a slug attribute from another attribute."
gem.summary = "A simple slug string generator for ActiveRecord."
gem.homepage = "https://danbee.github.io/slugtastic"
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.name = "slugtastic"
gem.require_paths = ["lib"]
gem.version = Slugtastic::VERSION
gem.add_development_dependency "rake"
gem.add_development_dependency "rspec"
gem.add_development_dependency "supermodel"
gem.add_development_dependency "activemodel", "~> 5"
gem.add_development_dependency "rake", "~> 12.3"
gem.add_development_dependency "rspec", "~> 3.7"
end

View File

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

View File

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

View File

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

View File

@ -0,0 +1,21 @@
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