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

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