dm-is-sluggable 0.9.10

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.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jakub Stastny aka Botanicus
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.textile ADDED
@@ -0,0 +1,22 @@
1
+ h1. About
2
+
3
+ This is plugin for easy creating unique slugs from other properties.
4
+
5
+
6
+ h1. Initialization
7
+
8
+ You need to have DataMapper model with property slug. To set slug just use before create hook with set_slug model method. This method takes the slug as parameter. Use String#to_slug to get this parameter if you need.
9
+
10
+ <pre>
11
+ class Post
12
+ include DataMapper::Resource
13
+ is :sluggable
14
+ property :title, String
15
+ property :slug, String, :key => true
16
+ before :create do
17
+ set_slug(self.title.to_slug)
18
+ end
19
+ end
20
+ </pre>
21
+
22
+ So what exactly set_slug does? It look for given slug, if not found than save it, let say as "foo-bar". If found, than increase number of iteraction and tries it again with "foo-bar-2".
data/Rakefile ADDED
@@ -0,0 +1,56 @@
1
+ # coding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'rake/gempackagetask'
5
+ require 'lib/dm-is-sluggable/is/version'
6
+
7
+ GEM_NAME = "dm-is-sluggable"
8
+ AUTHOR = "Jakub Stastny aka Botanicus"
9
+ EMAIL = "knava.bestvinensis@gmail.com"
10
+ HOMEPAGE = "http://101Ideas.cz/"
11
+ SUMMARY = "Creates unique slug from property. For DataMapper ORM."
12
+ GEM_VERSION = DataMapper::Is::Sluggable::VERSION
13
+
14
+ spec = Gem::Specification.new do |s|
15
+ s.name = GEM_NAME
16
+ s.version = GEM_VERSION
17
+ s.platform = Gem::Platform::RUBY
18
+ s.has_rdoc = true
19
+ s.extra_rdoc_files = ["README.textile", "LICENSE"]
20
+ s.summary = SUMMARY
21
+ s.description = s.summary
22
+ s.author = AUTHOR
23
+ s.email = EMAIL
24
+ s.homepage = HOMEPAGE
25
+ s.require_path = 'lib'
26
+ s.files = %w(LICENSE README.textile Rakefile) + Dir.glob("{lib,spec,app,public,stubs}/**/*")
27
+ end
28
+
29
+ Rake::GemPackageTask.new(spec) do |pkg|
30
+ pkg.gem_spec = spec
31
+ end
32
+
33
+ desc "Create a gemspec file"
34
+ task :gemspec do
35
+ File.open("#{GEM_NAME}.gemspec", "w") do |file|
36
+ file.puts spec.to_ruby
37
+ end
38
+ end
39
+
40
+ def sudo_gem(cmd)
41
+ sh "#{SUDO} #{RUBY} -S gem #{cmd}", :verbose => false
42
+ end
43
+
44
+ desc "Install #{GEM_NAME} #{GEM_VERSION}"
45
+ task :install => [ :package ] do
46
+ sudo_gem "install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources"
47
+ end
48
+
49
+ desc "Uninstall #{GEM_NAME} #{GEM_VERSION}"
50
+ task :uninstall => [ :clobber ] do
51
+ sudo_gem "uninstall #{GEM_NAME} -v#{GEM_VERSION} -Ix"
52
+ end
53
+
54
+ require 'spec/rake/spectask'
55
+ desc 'Default: run spec examples'
56
+ task :default => 'spec'
data/TODO ADDED
@@ -0,0 +1 @@
1
+ - find a better way how to remove diacritics (not just Czech one)
@@ -0,0 +1,23 @@
1
+ begin
2
+ require "rubygems/specification"
3
+ rescue SecurityError
4
+ # http://gems.github.com
5
+ end
6
+
7
+ VERSION = "0.9.10"
8
+ SPECIFICATION = ::Gem::Specification.new do |s|
9
+ s.name = "dm-is-sluggable"
10
+ # s.version = Rango::VERSION
11
+ s.version = VERSION
12
+ s.authors = ["Jakub Šťastný aka Botanicus"]
13
+ s.homepage = "http://github.com/botanicus/dm-is-sluggable"
14
+ s.summary = "This is plugin for easy creating unique slugs from other properties."
15
+ # s.description = "" # TODO: long description
16
+ s.cert_chain = nil
17
+ s.email = ["knava.bestvinensis", "gmail.com"].join("@")
18
+ s.files = Dir.glob("**/*") - Dir.glob("pkg/*")
19
+ s.add_dependency "dm-core"
20
+ s.require_paths = ["lib"]
21
+ # s.required_ruby_version = ::Gem::Requirement.new(">= 1.9.1")
22
+ # s.rubyforge_project = "rango"
23
+ end
@@ -0,0 +1,18 @@
1
+ # coding: utf-8
2
+
3
+ require 'pathname'
4
+
5
+ # Add all external dependencies for the plugin here
6
+ gem 'dm-core'
7
+ require 'dm-core'
8
+
9
+ # Require plugin-files
10
+ require Pathname(__FILE__).dirname.expand_path / 'dm-is-sluggable' / 'is' / 'sluggable.rb'
11
+ require Pathname(__FILE__).dirname.expand_path / 'dm-is-sluggable' / 'string'
12
+
13
+ # Include the plugin in Resource
14
+ module DataMapper
15
+ module Model
16
+ include DataMapper::Is::Sluggable
17
+ end
18
+ end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+
3
+ module DataMapper
4
+ module Is
5
+ module Sluggable
6
+ ##
7
+ # fired when your plugin gets included into Resource
8
+ #
9
+ def self.included(base)
10
+ end
11
+
12
+ ##
13
+ # Methods that should be included in DataMapper::Model.
14
+ # Normally this should just be your generator, so that the namespace
15
+ # does not get cluttered. ClassMethods and InstanceMethods gets added
16
+ # in the specific resources when you fire is :example
17
+ ##
18
+
19
+ def is_sluggable(options = Hash.new)
20
+ # Add class-methods
21
+ extend DataMapper::Is::Sluggable::ClassMethods
22
+ # Add instance-methods
23
+ include DataMapper::Is::Sluggable::InstanceMethods
24
+ end
25
+
26
+ module ClassMethods
27
+ end
28
+
29
+ module InstanceMethods
30
+ def set_slug(slug, iteraction = 1)
31
+ raise ArgumentError if slug.nil?
32
+ new_slug = "#{slug}#{"-#{iteraction}" unless iteraction == 1}"
33
+ self.attribute_set(:slug, new_slug)
34
+ if self.class.first(:slug => self.slug)
35
+ self.set_slug(slug, iteraction.to_i + 1)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,9 @@
1
+ # coding: utf-8
2
+
3
+ module DataMapper
4
+ module Is
5
+ module Sluggable
6
+ VERSION = '0.9.10'
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+
3
+ class String
4
+ # Important: it do not work with self.tr("á", "a") in Ruby 1.8
5
+ def unicode_chars
6
+ { "á" => "a", "č" => "c", "ď" => "d",
7
+ "ě" => "e", "é" => "e", "í" => "i",
8
+ "ň" => "n", "ó" => "o", "ř" => "r",
9
+ "š" => "s", "ť" => "t", "ú" => "u",
10
+ "ů" => "u", "ý" => "y", "ž" => "z",
11
+ "Á" => "A", "Č" => "C", "Ď" => "D",
12
+ "Ě" => "E", "É" => "E", "Í" => "I",
13
+ "Ň" => "N", "Ó" => "O", "Ř" => "R",
14
+ "Š" => "S", "Ť" => "T", "Ú" => "U",
15
+ "Ů" => "U", "Ý" => "Y", "Ž" => "Z" }
16
+ end
17
+
18
+ def to_ascii
19
+ string = self.dup
20
+ self.unicode_chars.each do |unicode, ascii|
21
+ string.gsub!(/#{unicode}/u, ascii)
22
+ end
23
+ return string
24
+ end
25
+
26
+ def to_slug
27
+ string = self.to_ascii.strip.downcase
28
+ string.gsub!(/[ \t]+/, "-") # replace blank chars by "-"
29
+ string.gsub!(/-*(.+)-*/, '\1') # no "-" at begin or end
30
+ string.delete!(%q{!@#$%^&*(){}[];:"'\|<>,./?]`~±})
31
+ return string
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), '..', "spec_helper")
4
+ require "dm-is-sluggable"
5
+
6
+ class Post
7
+ include DataMapper::Resource
8
+ is :sluggable
9
+ property :title, String
10
+ property :slug, String, :key => true
11
+ before :create do
12
+ set_slug(self.title.to_slug)
13
+ end
14
+ end
15
+
16
+ describe DataMapper::Is::Sluggable do
17
+ before do
18
+ @post = Post.create(:title => "Hello Bloody World")
19
+ end
20
+
21
+ describe "#set_slug" do
22
+ it "should create slug" do
23
+ @post.slug.should eql("hello-bloody-world")
24
+ end
25
+
26
+ it "should create unique slug" do
27
+ second = Post.create(:title => "Hello Bloody World")
28
+ second.slug.should eql("hello-bloody-world-2")
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), '..', "spec_helper")
4
+
5
+ describe "String#to_ascii" do
6
+ it "should remove diacritics" do
7
+ "Žádná česká znaménka".to_ascii.should eql("Zadna ceska znamenka")
8
+ end
9
+ end
10
+
11
+ describe "String#to_slug" do
12
+ it "should remove diacritics" do
13
+ "česká".to_slug.should eql("ceska")
14
+ end
15
+
16
+ it "should downcase slug" do
17
+ "BIG".to_slug.should eql("big")
18
+ end
19
+
20
+ it "should remove nonwords chars" do
21
+ "%^@$".to_slug.should eql("")
22
+ end
23
+
24
+ it "should works" do
25
+ " Samolepka X2 (černá). ".to_slug.should eql("samolepka-x2-cerna")
26
+ end
27
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,5 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
@@ -0,0 +1,12 @@
1
+ # coding: utf-8
2
+
3
+ $: << File.dirname(__FILE__) + "/../lib"
4
+
5
+ require "dm-core"
6
+ DataMapper.setup(:default, "sqlite3::memory")
7
+
8
+ Spec::Runner.configure do |config|
9
+ config.before(:each) do
10
+ DataMapper.auto_migrate!
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dm-is-sluggable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.10
5
+ platform: ruby
6
+ authors:
7
+ - "Jakub \xC5\xA0\xC5\xA5astn\xC3\xBD aka Botanicus"
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ date: 2009-11-26 00:00:00 +00:00
12
+ default_executable:
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: dm-core
16
+ type: :runtime
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ version:
24
+ description:
25
+ email: knava.bestvinensis@gmail.com
26
+ executables: []
27
+
28
+ extensions: []
29
+
30
+ extra_rdoc_files: []
31
+
32
+ files:
33
+ - dm-is-sluggable.gemspec
34
+ - lib/dm-is-sluggable/is/sluggable.rb
35
+ - lib/dm-is-sluggable/is/version.rb
36
+ - lib/dm-is-sluggable/string.rb
37
+ - lib/dm-is-sluggable.rb
38
+ - LICENSE
39
+ - Rakefile
40
+ - README.textile
41
+ - spec/dm-is-sluggable/sluggable_spec.rb
42
+ - spec/dm-is-sluggable/string_spec.rb
43
+ - spec/spec.opts
44
+ - spec/spec_helper.rb
45
+ - TODO
46
+ has_rdoc: true
47
+ homepage: http://github.com/botanicus/dm-is-sluggable
48
+ licenses: []
49
+
50
+ post_install_message:
51
+ rdoc_options: []
52
+
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ version:
67
+ requirements: []
68
+
69
+ rubyforge_project:
70
+ rubygems_version: 1.3.5
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: This is plugin for easy creating unique slugs from other properties.
74
+ test_files: []
75
+