acts-as-taggable-hstore 0.0.1
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/.gitignore +8 -0
- data/.rspec +2 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.rdoc +61 -0
- data/Rakefile +13 -0
- data/acts-as-taggable-hstore.gemspec +28 -0
- data/lib/acts-as-taggable-hstore/version.rb +3 -0
- data/lib/acts-as-taggable-hstore.rb +36 -0
- data/lib/acts_as_taggable_hstore/acts_as_taggable_hstore/core.rb +65 -0
- data/lib/acts_as_taggable_hstore/taggable.rb +23 -0
- data/rails/init.rb +1 -0
- data/spec/acts_as_taggable_hstore/acts_as_taggable_hstore_spec.rb +48 -0
- data/spec/acts_as_taggable_hstore/taggable_spec.rb +66 -0
- data/spec/database.yml.sample +7 -0
- data/spec/models.rb +6 -0
- data/spec/schema.rb +16 -0
- data/spec/spec_helper.rb +60 -0
- metadata +190 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Jt Gleason
|
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.rdoc
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
= ActsAsTaggableHstore
|
2
|
+
|
3
|
+
This plugin uses the semantics from ActsAsTaggableOn but uses Hstore to implement the tags. This limits this gem to Postgres databases.
|
4
|
+
|
5
|
+
It has a generator for adding the tag column to an existing table. Then you can include the acts_as_taggable_hstore method on the class and
|
6
|
+
everything is added as you would expect.
|
7
|
+
|
8
|
+
== Installation
|
9
|
+
|
10
|
+
=== Rails 3.x
|
11
|
+
|
12
|
+
To use it, add it to your Gemfile:
|
13
|
+
gem 'acts-as-taggable-hstore' , '~> 0.1.1'
|
14
|
+
|
15
|
+
==== Post Installation
|
16
|
+
|
17
|
+
Each table needs to be modified in order for this to work. Run
|
18
|
+
|
19
|
+
1. rails generate acts_as_taggable_hstore:migration TABLENAME
|
20
|
+
2. rake db:migrate
|
21
|
+
|
22
|
+
== Testing
|
23
|
+
|
24
|
+
Acts as Taggable Hstore uses Rspec tests. You can run the usual rake task to test it.
|
25
|
+
|
26
|
+
rake spec
|
27
|
+
|
28
|
+
== Usage
|
29
|
+
|
30
|
+
First, run the migration for the particular table you want to be taggable. Then
|
31
|
+
|
32
|
+
class Video < ActiveRecord::Base
|
33
|
+
acts_as_taggable
|
34
|
+
end
|
35
|
+
|
36
|
+
@video = Video.new()
|
37
|
+
@video.tag_list = "starcraft 2,gameplay,mlg"
|
38
|
+
@video.save
|
39
|
+
|
40
|
+
@video.tags # => [<Tag name:"starcraft 2">,<Tag name:"gameplay">,<Tag name:"mlg">]
|
41
|
+
|
42
|
+
=== Finding Tagged Objects
|
43
|
+
|
44
|
+
Acts as Taggable On uses scopes to create associations for tags. It should work with will_paginate as well:
|
45
|
+
|
46
|
+
Video.tagged_vith("starcraft 2")
|
47
|
+
|
48
|
+
#Find a video with all matching tags
|
49
|
+
|
50
|
+
Video.tagged_with(["starcraft 2","mlg"], :match_all => true)
|
51
|
+
|
52
|
+
#Find a video with any matching tags
|
53
|
+
Video.tagged_with(["starcraft 2","mlg"], :any => true)
|
54
|
+
|
55
|
+
#Find videos with no matching tags
|
56
|
+
Video.tagged_with(["starcraft 2","mlg"], :exclude => true)
|
57
|
+
|
58
|
+
== Help
|
59
|
+
|
60
|
+
== License
|
61
|
+
Copyright @ 2012 Jt Gleason MIT License
|
data/Rakefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup :default, :development
|
4
|
+
|
5
|
+
desc 'Default: run specs'
|
6
|
+
task :default => :spec
|
7
|
+
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
RSpec::Core::RakeTask.new do |t|
|
10
|
+
t.pattern = "spec/**/*_spec.rb"
|
11
|
+
end
|
12
|
+
|
13
|
+
Bundler::GemHelper.install_tasks
|
@@ -0,0 +1,28 @@
|
|
1
|
+
$:.push File.dirname(__FILE__) + '/lib'
|
2
|
+
require 'acts-as-taggable-hstore/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.name = %q{acts-as-taggable-hstore}
|
6
|
+
gem.authors = ["Jt Gleason"]
|
7
|
+
gem.date = %q{2012-02-29}
|
8
|
+
gem.description = %q{With ActsAsTaggableHstore, you can tag a single model that uses postgres hstore type}
|
9
|
+
gem.summary = "Basic postgres hstore tagging for Rails."
|
10
|
+
gem.email = %q{jt@twitch.tv}
|
11
|
+
gem.homepage = ''
|
12
|
+
|
13
|
+
gem.add_runtime_dependency 'rails', '~> 3.0'
|
14
|
+
gem.add_runtime_dependency 'activerecord-postgres-hstore-core', "~> 0.0.4"
|
15
|
+
gem.add_development_dependency 'rspec', '~> 2.6'
|
16
|
+
gem.add_development_dependency 'ammeter', '~> 0.1.3'
|
17
|
+
gem.add_development_dependency 'pg'
|
18
|
+
gem.add_development_dependency 'guard'
|
19
|
+
gem.add_development_dependency 'guard-rspec'
|
20
|
+
|
21
|
+
|
22
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
23
|
+
gem.files = `git ls-files`.split("\n")
|
24
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
25
|
+
gem.name = "acts-as-taggable-hstore"
|
26
|
+
gem.require_paths = ['lib']
|
27
|
+
gem.version = ActsAsTaggableHstore::VERSION
|
28
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require "active_record"
|
2
|
+
require "active_record/version"
|
3
|
+
require "activerecord-postgres-hstore-core"
|
4
|
+
|
5
|
+
require "action_view"
|
6
|
+
require "digest/sha1"
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
9
|
+
|
10
|
+
module ActsAsTaggableHstore
|
11
|
+
mattr_accessor :delimiter
|
12
|
+
@@delimiter = ','
|
13
|
+
|
14
|
+
mattr_accessor :force_lowercase
|
15
|
+
@@force_lowercase = false
|
16
|
+
|
17
|
+
mattr_accessor :default_column
|
18
|
+
@@default_column = :tag_hstore
|
19
|
+
|
20
|
+
def self.glue
|
21
|
+
@@delimiter.ends_with?(" ") ? @@delimiter : "#{@@delimiter} "
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.setup
|
25
|
+
yield self
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
require "acts_as_taggable_hstore/taggable"
|
30
|
+
require "acts_as_taggable_hstore/acts_as_taggable_hstore/core"
|
31
|
+
|
32
|
+
$LOAD_PATH.shift
|
33
|
+
|
34
|
+
if defined?(ActiveRecord::Base)
|
35
|
+
ActiveRecord::Base.extend ActsAsTaggableHstore::Taggable
|
36
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module ActsAsTaggableHstore::Taggable
|
2
|
+
module Core
|
3
|
+
def self.included(base)
|
4
|
+
base.send :include, ActsAsTaggableHstore::Taggable::Core::InstanceMethods
|
5
|
+
base.extend ActsAsTaggableHstore::Taggable::Core::ClassMethods
|
6
|
+
|
7
|
+
# base.class_eval do
|
8
|
+
# class_attribute :hstore_column
|
9
|
+
# end
|
10
|
+
end
|
11
|
+
|
12
|
+
module ClassMethods
|
13
|
+
#allow inheritence
|
14
|
+
def acts_as_taggable_hstore_by(*args)
|
15
|
+
super(*args)
|
16
|
+
end
|
17
|
+
|
18
|
+
def tagged_with(tag_list, options= {})
|
19
|
+
empty_result = scoped(:conditions => "1 = 0")
|
20
|
+
return empty_result if tag_list.blank?
|
21
|
+
|
22
|
+
if tag_list.is_a? String
|
23
|
+
tag_list = [tag_list]
|
24
|
+
end
|
25
|
+
|
26
|
+
connect_with = " AND "
|
27
|
+
if options.delete(:any)
|
28
|
+
connect_with = " OR "
|
29
|
+
end
|
30
|
+
|
31
|
+
conditions = []
|
32
|
+
tag_list.each do |tag_name|
|
33
|
+
conditions << self.tag_hstore_column.to_s + " ? '#{tag_name}' "
|
34
|
+
end
|
35
|
+
|
36
|
+
return where(conditions.join(connect_with))
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
module InstanceMethods
|
43
|
+
|
44
|
+
def tag_list
|
45
|
+
hstore_result = self.send(self.class.tag_hstore_column)
|
46
|
+
|
47
|
+
if hstore_result.nil?
|
48
|
+
return []
|
49
|
+
end
|
50
|
+
|
51
|
+
return hstore_result.keys.join(ActsAsTaggableHstore.glue)
|
52
|
+
end
|
53
|
+
|
54
|
+
def tag_list=(tags)
|
55
|
+
prep_hstore = tags.split(ActsAsTaggableHstore.delimiter).map(&:strip).inject({}) { |h,k| h[k] = nil; h }
|
56
|
+
self.send(self.class.tag_hstore_column.to_s + "=", prep_hstore)
|
57
|
+
end
|
58
|
+
|
59
|
+
def tags
|
60
|
+
tag_hstore.keys
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module ActsAsTaggableHstore
|
2
|
+
module Taggable
|
3
|
+
def taggable?
|
4
|
+
false
|
5
|
+
end
|
6
|
+
def acts_as_taggable_hstore
|
7
|
+
acts_as_taggable_hstore_by ActsAsTaggableHstore.default_column
|
8
|
+
end
|
9
|
+
|
10
|
+
def acts_as_taggable_hstore_by(*column_name)
|
11
|
+
|
12
|
+
class_attribute :tag_hstore_column
|
13
|
+
self.tag_hstore_column = column_name.first
|
14
|
+
|
15
|
+
class_eval do
|
16
|
+
def self.taggable?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
include ActsAsTaggableHstore::Taggable::Core
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'acts-as-taggable-hstore'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe "Acts As Taggable Hstore" do
|
4
|
+
before(:each) do
|
5
|
+
clean_database!
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should provide a class method 'taggable?' that is false for untaggable models" do
|
9
|
+
UntaggableModel.should_not be_taggable
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "Taggable Method Generation" do
|
13
|
+
before(:each) do
|
14
|
+
clean_database!
|
15
|
+
@taggable = TaggableModel.new(:name => "Bob Jones")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should respond 'true' to taggable?" do
|
19
|
+
@taggable.class.should be_taggable
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should generate a tag_list accessor/setter for each tag type" do
|
23
|
+
@taggable.should respond_to(:tag_list)
|
24
|
+
@taggable.should respond_to(:tag_list=)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have a hstore sql type" do
|
28
|
+
@taggable.class.columns_hash[@taggable.class.tag_hstore_column.to_s].sql_type.should == "hstore"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should make strings have valid_hstore" do
|
32
|
+
"bob".valid_hstore?.should == false
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should have a hstore column type" do
|
36
|
+
@taggable.class.columns_hash[@taggable.class.tag_hstore_column.to_s].type.should == :hstore
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "Reloading" do
|
42
|
+
it "should save a model instantiated by Model.find" do
|
43
|
+
taggable = TaggableModel.create!(:name => "Taggable")
|
44
|
+
found_taggable = TaggableModel.find(taggable.id)
|
45
|
+
found_taggable.save
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe "Taggable" do
|
4
|
+
before(:each) do
|
5
|
+
clean_database!
|
6
|
+
@taggable = TaggableModel.new(:name => "Bob Jones")
|
7
|
+
@taggables = [@taggable, TaggableModel.new(:name => "John Doe")]
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should return [] right after new" do
|
11
|
+
blank_taggable = TaggableModel.new(:name => "Bob Jones")
|
12
|
+
blank_taggable.tag_list.should == []
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should return [] right after create" do
|
16
|
+
blank_taggable = TaggableModel.create(:name => "Bob Jones")
|
17
|
+
blank_taggable.tag_list.should == []
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be able to remove tags through list alone" do
|
21
|
+
@taggable.tag_list = "ruby, rails, css"
|
22
|
+
@taggable.save
|
23
|
+
|
24
|
+
@taggable.reload
|
25
|
+
@taggable.should have(3).tags
|
26
|
+
@taggable.tag_list = "ruby, rails"
|
27
|
+
@taggable.save
|
28
|
+
@taggable.reload
|
29
|
+
@taggable.should have(2).tags
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be able to find by tag" do
|
33
|
+
@taggable.tag_list = "ruby, rails, css"
|
34
|
+
@taggable.save
|
35
|
+
|
36
|
+
TaggableModel.tagged_with("ruby").first.should == @taggable
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should not return read-only records" do
|
40
|
+
TaggableModel.create(:name => "Bob", :tag_list => "ruby, rails, css")
|
41
|
+
TaggableModel.tagged_with("ruby").first.should_not be_readonly
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should be able to find tagged with only the matching tags" do
|
45
|
+
bob = TaggableModel.create(:name => "Bob", :tag_list => "lazy, happier")
|
46
|
+
frank = TaggableModel.create(:name => "Frank", :tag_list => "fitter, happier, inefficient")
|
47
|
+
steve = TaggableModel.create(:name => 'Steve', :tag_list => "fitter, happier")
|
48
|
+
|
49
|
+
TaggableModel.tagged_with(["fitter", "happier"]).to_a.sort.should == [steve,frank].sort
|
50
|
+
end
|
51
|
+
|
52
|
+
# it "should be able to find tagged with some excluded tags" do
|
53
|
+
# bob = TaggableModel.create(:name => "Bob", :tag_list => "happier, lazy")
|
54
|
+
# frank = TaggableModel.create(:name => "Frank", :tag_list => "happier")
|
55
|
+
# steve = TaggableModel.create(:name => 'Steve', :tag_list => "happier")
|
56
|
+
|
57
|
+
# TaggableModel.tagged_with("lazy", :exclude => true).to_a.should == [frank, steve]
|
58
|
+
# end
|
59
|
+
|
60
|
+
it "should return an empty scope for empty tags" do
|
61
|
+
TaggableModel.tagged_with('').should == []
|
62
|
+
TaggableModel.tagged_with(' ').should == []
|
63
|
+
TaggableModel.tagged_with(nil).should == []
|
64
|
+
TaggableModel.tagged_with([]).should == []
|
65
|
+
end
|
66
|
+
end
|
data/spec/models.rb
ADDED
data/spec/schema.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
ActiveRecord::Schema.define :version => 0 do
|
2
|
+
|
3
|
+
create_table :taggable_models, :force => true do |t|
|
4
|
+
t.column :name, :string
|
5
|
+
t.column :type, :string
|
6
|
+
end
|
7
|
+
|
8
|
+
add_column :taggable_models, :tag_hstore, :hstore
|
9
|
+
|
10
|
+
execute "create index concurrently idx_tag_model_tag_hstore on taggable_models using gist (tag_hstore)"
|
11
|
+
|
12
|
+
create_table :untaggable_models, :force => true do |t|
|
13
|
+
t.column :name, :string
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
$LOAD_PATH << "." unless $LOAD_PATH.include?(".")
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require "rubygems"
|
6
|
+
require "bundler"
|
7
|
+
if Gem::Version.new(Bundler::VERSION) <= Gem::Version.new("0.9.5")
|
8
|
+
raise RuntimeError, "Your bundler version is too old." +
|
9
|
+
"Run `gem install bundler` to upgrade."
|
10
|
+
end
|
11
|
+
|
12
|
+
# Set up load paths for all bundled gems
|
13
|
+
Bundler.setup
|
14
|
+
rescue Bundler::GemNotFound
|
15
|
+
raise RuntimeError, "Bundler couldn't find some gems." +
|
16
|
+
"Did you run \`bundlee install\`?"
|
17
|
+
end
|
18
|
+
|
19
|
+
Bundler.require
|
20
|
+
require File.expand_path('../../lib/acts-as-taggable-hstore', __FILE__)
|
21
|
+
#require "activerecord-postgres-hstore-core"
|
22
|
+
db_name = 'postgresql'
|
23
|
+
database_yml = File.expand_path('../database.yml', __FILE__)
|
24
|
+
|
25
|
+
if File.exists?(database_yml)
|
26
|
+
active_record_configuration = YAML.load_file(database_yml)
|
27
|
+
|
28
|
+
ActiveRecord::Base.configurations = active_record_configuration
|
29
|
+
config = ActiveRecord::Base.configurations[db_name]
|
30
|
+
|
31
|
+
begin
|
32
|
+
ActiveRecord::Base.establish_connection(db_name)
|
33
|
+
ActiveRecord::Base.connection
|
34
|
+
rescue
|
35
|
+
ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
|
36
|
+
ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => 'utf8'))
|
37
|
+
end
|
38
|
+
|
39
|
+
ActiveRecord::Base.establish_connection(config)
|
40
|
+
ActiveRecord::Base.logger = Logger.new(File.join(File.dirname(__FILE__), "debug.log"))
|
41
|
+
ActiveRecord::Base.default_timezone = :utc
|
42
|
+
|
43
|
+
ActiveRecord::Base.silence do
|
44
|
+
ActiveRecord::Migration.verbose = false
|
45
|
+
|
46
|
+
load(File.dirname(__FILE__) + '/schema.rb')
|
47
|
+
load(File.dirname(__FILE__) + '/models.rb')
|
48
|
+
end
|
49
|
+
else
|
50
|
+
raise "Please create #{database_yml} first to configure your database. Take a look at: #{database_yml}.sample"
|
51
|
+
end
|
52
|
+
|
53
|
+
def clean_database!
|
54
|
+
models = [TaggableModel, UntaggableModel]
|
55
|
+
models.each do |model|
|
56
|
+
ActiveRecord::Base.connection.execute "DELETE FROM #{model.table_name}"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
clean_database!
|
metadata
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: acts-as-taggable-hstore
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jt Gleason
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-02-29 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rails
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 7
|
29
|
+
segments:
|
30
|
+
- 3
|
31
|
+
- 0
|
32
|
+
version: "3.0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: activerecord-postgres-hstore-core
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 23
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
- 0
|
47
|
+
- 4
|
48
|
+
version: 0.0.4
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
- !ruby/object:Gem::Dependency
|
52
|
+
name: rspec
|
53
|
+
prerelease: false
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
57
|
+
- - ~>
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 15
|
60
|
+
segments:
|
61
|
+
- 2
|
62
|
+
- 6
|
63
|
+
version: "2.6"
|
64
|
+
type: :development
|
65
|
+
version_requirements: *id003
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: ammeter
|
68
|
+
prerelease: false
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ~>
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 29
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
- 1
|
78
|
+
- 3
|
79
|
+
version: 0.1.3
|
80
|
+
type: :development
|
81
|
+
version_requirements: *id004
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: pg
|
84
|
+
prerelease: false
|
85
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
91
|
+
segments:
|
92
|
+
- 0
|
93
|
+
version: "0"
|
94
|
+
type: :development
|
95
|
+
version_requirements: *id005
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: guard
|
98
|
+
prerelease: false
|
99
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
hash: 3
|
105
|
+
segments:
|
106
|
+
- 0
|
107
|
+
version: "0"
|
108
|
+
type: :development
|
109
|
+
version_requirements: *id006
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: guard-rspec
|
112
|
+
prerelease: false
|
113
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 3
|
119
|
+
segments:
|
120
|
+
- 0
|
121
|
+
version: "0"
|
122
|
+
type: :development
|
123
|
+
version_requirements: *id007
|
124
|
+
description: With ActsAsTaggableHstore, you can tag a single model that uses postgres hstore type
|
125
|
+
email: jt@twitch.tv
|
126
|
+
executables: []
|
127
|
+
|
128
|
+
extensions: []
|
129
|
+
|
130
|
+
extra_rdoc_files: []
|
131
|
+
|
132
|
+
files:
|
133
|
+
- .gitignore
|
134
|
+
- .rspec
|
135
|
+
- Gemfile
|
136
|
+
- LICENSE
|
137
|
+
- README.rdoc
|
138
|
+
- Rakefile
|
139
|
+
- acts-as-taggable-hstore.gemspec
|
140
|
+
- lib/acts-as-taggable-hstore.rb
|
141
|
+
- lib/acts-as-taggable-hstore/version.rb
|
142
|
+
- lib/acts_as_taggable_hstore/acts_as_taggable_hstore/core.rb
|
143
|
+
- lib/acts_as_taggable_hstore/taggable.rb
|
144
|
+
- rails/init.rb
|
145
|
+
- spec/acts_as_taggable_hstore/acts_as_taggable_hstore_spec.rb
|
146
|
+
- spec/acts_as_taggable_hstore/taggable_spec.rb
|
147
|
+
- spec/database.yml.sample
|
148
|
+
- spec/models.rb
|
149
|
+
- spec/schema.rb
|
150
|
+
- spec/spec_helper.rb
|
151
|
+
homepage: ""
|
152
|
+
licenses: []
|
153
|
+
|
154
|
+
post_install_message:
|
155
|
+
rdoc_options: []
|
156
|
+
|
157
|
+
require_paths:
|
158
|
+
- lib
|
159
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
160
|
+
none: false
|
161
|
+
requirements:
|
162
|
+
- - ">="
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
hash: 3
|
165
|
+
segments:
|
166
|
+
- 0
|
167
|
+
version: "0"
|
168
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
hash: 3
|
174
|
+
segments:
|
175
|
+
- 0
|
176
|
+
version: "0"
|
177
|
+
requirements: []
|
178
|
+
|
179
|
+
rubyforge_project:
|
180
|
+
rubygems_version: 1.8.6
|
181
|
+
signing_key:
|
182
|
+
specification_version: 3
|
183
|
+
summary: Basic postgres hstore tagging for Rails.
|
184
|
+
test_files:
|
185
|
+
- spec/acts_as_taggable_hstore/acts_as_taggable_hstore_spec.rb
|
186
|
+
- spec/acts_as_taggable_hstore/taggable_spec.rb
|
187
|
+
- spec/database.yml.sample
|
188
|
+
- spec/models.rb
|
189
|
+
- spec/schema.rb
|
190
|
+
- spec/spec_helper.rb
|