urls_for_humans 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4275044760bb0c20648da21ead4b707509dcb524
4
- data.tar.gz: a356512224993f2517d88265e853de51e27b3322
3
+ metadata.gz: 781ea4d78f5f63c5f05cd5cf429a9e22cd4ad95a
4
+ data.tar.gz: 5c62c5b45cdb175e6d21bffc34f8d6e93c33bbde
5
5
  SHA512:
6
- metadata.gz: 57b6dbd28a51ab52ae4e9da2f09a6cda4261447a0fdde418ff969e10be42152962208babb3c38b40f585f455032c93e2be3597c7795133a6b1de3fbd7e60d2a4
7
- data.tar.gz: e2d702b1f19fb4ee7c1a5fd7050d687e538390484d31885eba6cd4ac2f2bf1eefe66751b486b75e7b659611ebae8fa1920601bd0363b68e94ed781bee697c029
6
+ metadata.gz: e450763c2eec2fcb6a3a3f3b2c46e1835275292af89eb2db66ff9b07233741758cc3c8352b354aaa356cb9c24feb749e0af22bf3caa79d2c363ae3634ce05140
7
+ data.tar.gz: 7ed304d075f09ff68290b7d81971176037a48951bba78309a3f790c7726bae0216995d42f3fc7ce3cfa3e3426583b68b44a0e16405cae9af18ba3823cb401afd
data/LICENSE.txt CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 TODO: Write your name
1
+ Copyright (c) 2014 John Otander
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,28 +1,78 @@
1
- # UrlsForHumans
1
+ # Urls For Humans
2
2
 
3
- TODO: Write a gem description
3
+ Urls For Humans allows you to apply meaningful names to your Rails Application's urls by leveraging what happens under the covers with `Model.find(params[:id])` and `to_param`. So long as the url is prefixed with the model's id, the lookup will happen exactly how we intend it to with a few key benefits:
4
+
5
+ * Simplicity
6
+ * Lightweight
7
+ * Persistent urls because changes the the latter portions of a param won't affect it's lookup.
4
8
 
5
9
  ## Installation
6
10
 
7
11
  Add this line to your application's Gemfile:
8
12
 
9
- gem 'urls_for_humans'
13
+ ```ruby
14
+ gem 'urls_for_humans'
15
+ ```
10
16
 
11
17
  And then execute:
12
18
 
13
- $ bundle
19
+ ```bash
20
+ $ bundle
21
+ ```
14
22
 
15
23
  Or install it yourself as:
16
24
 
17
- $ gem install urls_for_humans
25
+ ```bash
26
+ $ gem install urls_for_humans
27
+ ```
18
28
 
19
29
  ## Usage
20
30
 
21
- TODO: Write usage instructions here
31
+
32
+ To use Urls For Humans you need to extend the `UrlsForHumans` module, and call the class method `urls_for_humans`:
33
+
34
+ ```ruby
35
+ class User < ActiveRecord::Base
36
+ extend UrlsForHumans
37
+
38
+ # ...
39
+
40
+ urls_for_humans :first_name, :last_name
41
+
42
+ # ...
43
+ end
44
+ ```
45
+
46
+ The `urls_for_humans` method can be a collection of any information that you'd like to include in the url. For example, with the above class we'd result in:
47
+
48
+ ```ruby
49
+ u = User.create(first_name: 'John', last_name: 'Otander')
50
+
51
+ u.to_param
52
+ # => '1-john-otander'
53
+
54
+ u.first_name = nil
55
+ u.to_param
56
+ # => '1-otander'
57
+ ```
58
+
59
+ With this solution, an ActiveRecord object will always produce the correct url throughout the application:
60
+
61
+ ```ruby
62
+ link_to user.first_name, user
63
+ # => <a href="http://localhost:3000/users/1-john-otander"
64
+ ```
65
+
66
+ Additionally, any link that hits the internet will persist because `1-random-content`, `1-other-random-content`, and `1-john-doe` will all route to the same resource.
67
+
68
+ ## Resources
69
+
70
+ * <https://github.com/norman/friendly_id>
71
+ * <https://gist.github.com/cdmwebs/1209732>
22
72
 
23
73
  ## Contributing
24
74
 
25
- 1. Fork it ( http://github.com/<my-github-username>/urls_for_humans/fork )
75
+ 1. Fork it ( http://github.com/johnotander/urls_for_humans/fork )
26
76
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
77
  3. Commit your changes (`git commit -am 'Add some feature'`)
28
78
  4. Push to the branch (`git push origin my-new-feature`)
data/Rakefile CHANGED
@@ -1 +1,12 @@
1
1
  require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new
6
+
7
+ task default: :spec
8
+ task test: :spec
9
+
10
+ task :build do
11
+ system "gem build urls_for_humans.gemspec"
12
+ end
@@ -1,3 +1,3 @@
1
1
  module UrlsForHumans
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -1,30 +1,23 @@
1
- require "urls_for_humans/version"
1
+ require 'urls_for_humans/version'
2
2
 
3
- module UrlsForHumans
4
- def self.extended(model_class)
5
- return if model_class.respond_to?(:urls_for_humans)
6
-
7
- model_class.class_eval do
8
- class << self
9
- attr_accessor :humanly_attrs
10
- end
11
-
12
- extend Base
13
- include Model
14
- end
15
- end
3
+ require 'active_support/concern'
4
+ require 'active_support/inflector'
5
+ require 'active_support/core_ext/object/blank'
16
6
 
17
- module Base
7
+ module UrlsForHumans
8
+ extend ActiveSupport::Concern
9
+
10
+ module ClassMethods
11
+ attr_accessor :humanly_attrs
12
+
18
13
  def urls_for_humans(*humanly_attrs)
19
14
  @humanly_attrs = humanly_attrs
20
15
  end
21
16
  end
22
-
23
- module Model
24
- def to_param
25
- self.class.humanly_attrs.dup.unshift(:id).map do |attrib|
26
- send(attrib).to_s.parameterize
27
- end.reject(&:blank?).join('-')
28
- end
17
+
18
+ def to_param
19
+ (self.class.humanly_attrs || humanly_attrs).dup.unshift(:id).map do |attrib|
20
+ send(attrib).to_s.parameterize
21
+ end.reject(&:blank?).join('-')
29
22
  end
30
23
  end
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'rspec'
4
+
5
+ require 'urls_for_humans'
6
+
7
+ I18n.enforce_available_locales = false
8
+
9
+ RSpec.configure do |config|
10
+ config.color_enabled = true
11
+ end
12
+
13
+ class User
14
+ include UrlsForHumans
15
+
16
+ urls_for_humans :first_name, :last_name
17
+
18
+ attr_accessor :first_name, :last_name
19
+
20
+ def initialize(first_name, last_name)
21
+ self.first_name = first_name
22
+ self.last_name = last_name
23
+ end
24
+
25
+ def id
26
+ 10
27
+ end
28
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe UrlsForHumans do
4
+
5
+ let(:first) { 'John' }
6
+ let(:last) { 'Doe' }
7
+
8
+ let(:user) { User.new(first, last) }
9
+
10
+ subject { user }
11
+
12
+ describe '.to_param' do
13
+
14
+ it 'should return the correct string' do
15
+ expect(subject.to_param).to eq("#{ user.id }-#{ user.first_name.parameterize }-#{ user.last_name.parameterize }")
16
+ end
17
+
18
+ context 'with no first name' do
19
+
20
+ let(:user) { User.new(nil, last) }
21
+
22
+ it 'should return the correct string' do
23
+ expect(subject.to_param).to eq("#{ user.id }-#{ user.last_name.parameterize }")
24
+ end
25
+ end
26
+
27
+ context 'with no last name' do
28
+
29
+ let(:user) { User.new(first, nil) }
30
+
31
+ it 'should return the correct string' do
32
+ expect(subject.to_param).to eq("#{ user.id }-#{ user.first_name.parameterize }")
33
+ end
34
+ end
35
+
36
+ context 'with no first or last name' do
37
+
38
+ let(:user) { User.new(nil, nil) }
39
+
40
+ it 'should return the correct string' do
41
+ expect(subject.to_param).to eq(user.id.to_s)
42
+ end
43
+ end
44
+ end
45
+
46
+ describe '.urls_for_humans and @humanly_attrs' do
47
+
48
+ let(:attrs) { [:fake, :attrs] }
49
+
50
+ before { User.urls_for_humans(*attrs) }
51
+
52
+ it 'should return the correct attributes' do
53
+ expect(User.humanly_attrs).to eq(attrs)
54
+ end
55
+ end
56
+ end
@@ -18,6 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_dependency "activesupport"
22
+
21
23
  spec.add_development_dependency "bundler", "~> 1.5"
22
24
  spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
23
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urls_for_humans
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Otander
@@ -10,6 +10,20 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2014-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - ">="
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  description: A delightfully simple way to make your urls friendly to end users, without
42
70
  muddying up the backend.
43
71
  email:
@@ -53,6 +81,8 @@ files:
53
81
  - Rakefile
54
82
  - lib/urls_for_humans.rb
55
83
  - lib/urls_for_humans/version.rb
84
+ - spec/spec_helper.rb
85
+ - spec/urls_for_humans_spec.rb
56
86
  - urls_for_humans.gemspec
57
87
  homepage: https://github.com/johnotander/urls_for_humans
58
88
  licenses:
@@ -78,4 +108,6 @@ rubygems_version: 2.2.2
78
108
  signing_key:
79
109
  specification_version: 4
80
110
  summary: Urls for humans in Rails apps.
81
- test_files: []
111
+ test_files:
112
+ - spec/spec_helper.rb
113
+ - spec/urls_for_humans_spec.rb