Commit c1bcfef9 authored by Raphael Sofaer's avatar Raphael Sofaer

TAGS ARE SO COOL

parent 10345b14
......@@ -24,12 +24,12 @@ gem 'twitter', :git => 'git://github.com/jnunemaker/twitter.git', :ref => 'ef122
gem 'haml', '3.0.25'
gem 'will_paginate', '3.0.pre2'
#Statistics
gem 'googlecharts'
#Inflected translations
gem 'i18n-inflector-rails', '~> 1.0'
#Tags
gem 'acts-as-taggable-on', '2.0.6'
#Uncatagorized
gem 'roxml', :git => 'git://github.com/Empact/roxml.git', :ref => '7ea9a9ffd2338aaef5b0'
gem 'addressable', '2.2.2', :require => 'addressable/uri'
......
......@@ -86,6 +86,7 @@ GEM
activemodel (= 3.0.3)
activesupport (= 3.0.3)
activesupport (3.0.3)
acts-as-taggable-on (2.0.6)
addressable (2.2.2)
arel (2.0.9)
aws (2.3.32)
......@@ -189,7 +190,6 @@ GEM
gem_plugin (0.2.3)
gherkin (2.3.3)
json (~> 1.4.6)
googlecharts (1.6.1)
haml (3.0.25)
hashie (0.4.0)
highline (1.6.1)
......@@ -387,6 +387,7 @@ PLATFORMS
DEPENDENCIES
SystemTimer (= 1.2.1)
acts-as-taggable-on (= 2.0.6)
addressable (= 2.2.2)
aws (= 2.3.32)
bundler (>= 1.0.0)
......@@ -408,7 +409,6 @@ DEPENDENCIES
fog (= 0.3.25)
foreigner (= 0.9.1)
fuubar
googlecharts
haml (= 3.0.25)
http_accept_language!
i18n-inflector-rails (~> 1.0)
......
......@@ -8,6 +8,9 @@ class StatusMessage < Post
require File.join(Rails.root, 'lib/youtube_titles')
include ActionView::Helpers::TextHelper
acts_as_taggable
acts_as_taggable_on :tags
validates_length_of :message, :maximum => 1000, :message => "please make your status messages less than 1000 characters"
xml_name :status_message
xml_attr :raw_message
......@@ -22,6 +25,8 @@ class StatusMessage < Post
get_youtube_title message
end
before_create :build_tags
def message(opts = {})
self.formatted_message(opts)
end
......@@ -84,6 +89,22 @@ class StatusMessage < Post
identifiers.empty? ? [] : Person.where(:diaspora_handle => identifiers)
end
def build_tags
self.tag_list = tag_strings
end
def tag_strings
regex = /(^|\s)#(\w+)/
matches = self.raw_message.scan(regex).map do |match|
match.last
end
unique_matches = matches.inject(Hash.new) do |h,element|
h[element.downcase] = element unless h[element.downcase]
h
end
unique_matches.values
end
def to_activity
<<-XML
<entry>
......
class ActsAsTaggableOnMigration < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.string :name
end
create_table :taggings do |t|
t.references :tag
# You should make sure that the column created is
# long enough to store the required class names.
t.references :taggable, :polymorphic => {:limit => 127}
t.references :tagger, :polymorphic => {:limit => 127}
t.string :context, :limit => 127
t.datetime :created_at
end
add_index :taggings, :tag_id
add_index :taggings, [:taggable_id, :taggable_type, :context]
end
def self.down
drop_table :taggings
drop_table :tags
end
end
......@@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20110301202619) do
ActiveRecord::Schema.define(:version => 20110311000150) do
create_table "aspect_memberships", :force => true do |t|
t.integer "aspect_id", :null => false
......@@ -459,6 +459,23 @@ ActiveRecord::Schema.define(:version => 20110301202619) do
add_index "services", ["mongo_id"], :name => "index_services_on_mongo_id"
add_index "services", ["user_id"], :name => "index_services_on_user_id"
create_table "taggings", :force => true do |t|
t.integer "tag_id"
t.integer "taggable_id"
t.string "taggable_type", :limit => 127
t.integer "tagger_id"
t.string "tagger_type", :limit => 127
t.string "context", :limit => 127
t.datetime "created_at"
end
add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"
create_table "tags", :force => true do |t|
t.string "name"
end
create_table "users", :force => true do |t|
t.string "username"
t.text "serialized_private_key"
......
......@@ -18,6 +18,11 @@ describe StatusMessage do
status.should_receive(:create_mentions)
status.save
end
it 'calls build_tags' do
status = Factory.build(:status_message)
status.should_receive(:build_tags)
status.save
end
end
describe '#diaspora_handle=' do
......@@ -103,6 +108,9 @@ STR
it 'escapes the link title' do
p = @people[0].profile
p.first_name="</a><script>alert('h')</script>"
["a", "b", "A", "C"]\
.inject(Hash.new){ |h,element| h[element.downcase] = element unless h[element.downcase] ; h }\
.values
p.save!
@sm.formatted_message.should_not include(@people[0].profile.first_name)
......@@ -165,6 +173,44 @@ STR
end
end
end
describe 'tags' do
before do
@sm = Factory.build(:status_message)
end
describe '#build_tags' do
it 'builds the tags' do
@sm.message = '#what'
@sm.build_tags
@sm.tag_list.should == ['what']
lambda {
@sm.save
}.should change{@sm.tags.count}.by(1)
end
end
describe '#tag_strings' do
it 'returns a string for every #thing' do
str = '#what #hey #that"smybike. #@hey ##boo # #THATWASMYBIKE #hey#there #135440we #abc/23 ###'
arr = ['what', 'hey', 'that', 'THATWASMYBIKE', '135440we', 'abc']
@sm.message = str
@sm.tag_strings.should =~ arr
end
it 'returns no duplicates' do
str = '#what #what #what #whaaaaaaaaaat'
arr = ['what','whaaaaaaaaaat']
@sm.message = str
@sm.tag_strings.should =~ arr
end
it 'is case insensitive' do
str = '#what #wHaT #WHAT'
arr = ['what']
@sm.message = str
@sm.tag_strings.should =~ arr
end
end
end
describe "XML" do
before do
@message = Factory.create(:status_message, :message => "I hate WALRUSES!", :author => @user.person)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment