smalltalk 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ spec/internal/db/*.sqlite
6
+ spec/internal/config/database.yml
data/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.2@smalltalk --create
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ # language: ruby
2
+ # before_script:
3
+ # - cp spec/internal/config/database.yml.sample spec/internal/config/database.yml
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in smalltalk.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ gem 'rspec'
8
+ gem 'rspec-rails'
9
+ gem 'sqlite3'
10
+ gem 'database_cleaner', '>= 1.2.0'
11
+ end
data/README.md ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+
6
+ # If you want to make this the default task
7
+ task :default => :spec
8
+ require "bundler/gem_tasks"
data/config.ru ADDED
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize!
7
+ run Combustion::Application
@@ -0,0 +1,30 @@
1
+ module Smalltalk
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ include Rails::Generators::Migration
5
+
6
+ source_root File.expand_path("../templates", __FILE__)
7
+
8
+ desc <<-CONTENT
9
+ Copies the smalltalk migration file to the migrations
10
+ folder.
11
+
12
+ Please run rake db:migrate once the installer is
13
+ complete.
14
+
15
+ CONTENT
16
+
17
+ def self.next_migration_number(dirname) #:nodoc:
18
+ if ActiveRecord::Base.timestamped_migrations
19
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
20
+ else
21
+ "%.3d" % (current_migration_number(dirname) + 1)
22
+ end
23
+ end
24
+
25
+ def create_migration_file
26
+ migration_template 'migration.rb', 'db/migrate/create_smalltalk_tables.rb'
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,22 @@
1
+ class CreateSmalltalkTables < ActiveRecord::Migration
2
+ def self.change
3
+
4
+ create_table "smalltalk_messages", :force => true do |t|
5
+ t.integer "sender_id", :null => false
6
+ t.string "sender_type", :null => false
7
+ t.integer "recipient_id", :null => false
8
+ t.string "recipient_type", :null => false
9
+ t.text "content"
10
+ t.boolean "viewed"
11
+ t.boolean "hidden"
12
+ t.string "workflow_state"
13
+ t.datetime "created_at", :null => false
14
+ t.datetime "updated_at", :null => false
15
+ end
16
+
17
+ add_index "smalltalk_messages", ["recipient_id", "recipient_type"], :name => "index_smalltalk_messages_on_recipient_id_and_recipient_type"
18
+ add_index "smalltalk_messages", ["sender_id", "sender_type"], :name => "index_smalltalk_messages_on_sender_id_and_sender_type"
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,34 @@
1
+ module Smalltalk
2
+
3
+ class Conversation
4
+
5
+ attr_accessor :messages, :sender, :recipient, :viewed, :owner
6
+
7
+ def initialize(messages)
8
+ self.messages = messages
9
+ self.sender = messages.first.sender
10
+ self.recipient = messages.first.recipient
11
+ self.viewed = messages.all?{|m| m.viewed?}
12
+ end
13
+
14
+ def self.for(messenger)
15
+ time_range = (Date.today - 45.days).beginning_of_day..Date.today.end_of_day
16
+
17
+ hash = Smalltalk::Message.visible.for(messenger).created_between(time_range).order("created_at DESC").group_by do |m|
18
+ if messenger == m.sender
19
+ "#{m.recipient_type}#{m.recipient_id}"
20
+ else
21
+ "#{m.sender_type}#{m.sender_id}"
22
+ end
23
+ end
24
+
25
+ hash.map do |k, v|
26
+ c = Conversation.new(v)
27
+ c.owner = messenger
28
+ c
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,34 @@
1
+ module Smalltalk
2
+
3
+ module HasMessages
4
+
5
+ def self.included(base)
6
+ base.class_eval do
7
+
8
+ # has_many :messages,
9
+ # :as => :sender,
10
+ # :class_name => 'Message',
11
+ # :conditions => {:hidden_at => nil},
12
+ # :order => 'messages.created_at DESC'
13
+ end
14
+ end
15
+
16
+ def messages
17
+ Smalltalk::Message.visible.for(self)
18
+ end
19
+
20
+ def sent_messages
21
+ Smalltalk::Message.visible.sent_by(self)
22
+ end
23
+
24
+ def received_messages
25
+ Smalltalk::Message.visible.received_by(self)
26
+ end
27
+
28
+ def conversations
29
+ Smalltalk::Conversation.for(self)
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,85 @@
1
+ module Smalltalk
2
+
3
+ class Message < ActiveRecord::Base
4
+ include Workflow
5
+
6
+ validates_presence_of :sender_id, :sender_type, :recipient_type, :recipient_id, :content
7
+
8
+ scope :unsent, where(workflow_state: 'unsent')
9
+ scope :queued, where(workflow_state: 'queued')
10
+ scope :delivered, where(workflow_state: 'delivered')
11
+ scope :hidden, where(hidden: true)
12
+ scope :visible, where(hidden: false)
13
+ scope :viewed, where(viewed: true)
14
+ scope :unviewed, where(viewed: false)
15
+ scope :created_between, lambda {|time_range| where(created_at: time_range)}
16
+ scope :search, lambda {|term| unless term.blank?;where("content LIKE :q", q: "%#{term}%");end;}
17
+
18
+ workflow do
19
+ state :unsent do
20
+ event :queue, :transitions_to => :queued
21
+ event :deliver, :transitions_to => :delivered
22
+ end
23
+
24
+ state :queued do
25
+ event :deliver, :transitions_to => :delivered
26
+ end
27
+
28
+ state :delivered
29
+ end
30
+
31
+ def self.for(messenger)
32
+ where("(sender_type = ? AND sender_id = ?) OR (recipient_type = ? AND recipient_id = ?)", messenger.class.name, messenger.id, messenger.class.name, messenger.id)
33
+ end
34
+
35
+ def self.sent_by(sender)
36
+ where(sender_type: sender.class.name, sender_id: sender.id)
37
+ end
38
+
39
+ def self.received_by(recipient)
40
+ where(recipient_type: recipient.class.name, recipient_id: recipient.id)
41
+ end
42
+
43
+ def sent_by?(sender)
44
+ (sender_type == sender.class.name) && (sender.id == sender.id)
45
+ end
46
+
47
+ def received_by?(recipient)
48
+ (recipient_type == recipient.class.name) && (recipient_id == recipient.id)
49
+ end
50
+
51
+ def sender
52
+ self.sender_type.constantize.find(sender_id)
53
+ end
54
+
55
+ def sender=(sender)
56
+ self.sender_type = sender.class.name
57
+ self.sender_id = sender.id
58
+ end
59
+
60
+ def recipient
61
+ self.recipient_type.constantize.find(recipient_id)
62
+ end
63
+
64
+ def recipient=(recipient)
65
+ self.recipient_type = recipient.class.name
66
+ self.recipient_id = recipient.id
67
+ end
68
+
69
+ def reply(params = {})
70
+ Smalltalk::Reply.new(params.merge(message: self)).build!
71
+ end
72
+
73
+ def hide!
74
+ self.hidden = true
75
+ self.save!
76
+ end
77
+
78
+ def view!
79
+ self.viewed = true
80
+ self.save!
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -0,0 +1,31 @@
1
+ module Smalltalk
2
+ class Reply
3
+ attr_accessor :sender, :message, :content
4
+
5
+ def initialize(params = {})
6
+ self.sender = params[:sender]
7
+ self.message = params[:message]
8
+ self.content = params[:content]
9
+ end
10
+
11
+ def build!
12
+ validate
13
+
14
+ reply = Smalltalk::Message.new
15
+ reply.sender = sender
16
+ reply.recipient = message.sender
17
+ reply.content = content
18
+ reply.hidden = false
19
+ reply.viewed = false
20
+ reply.save!
21
+
22
+ reply
23
+ end
24
+
25
+ def validate
26
+ raise HTTPStatus::UnprocessableEntity, "No message specified!" if message.blank?
27
+ raise HTTPStatus::UnprocessableEntity, "No sender specified!" if sender.blank?
28
+ raise HTTPStatus::UnprocessableEntity, "No message content was provided!" if content.blank?
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,23 @@
1
+ module Smalltalk
2
+
3
+ class Search
4
+
5
+ attr_accessor :search
6
+
7
+ def initialize(search)
8
+ self.search = search
9
+ end
10
+
11
+ def run!
12
+ results = Smalltalk::Message
13
+
14
+ search[:q].split.each do |term|
15
+ results = results.where("content LIKE :q", q: "%#{term}%")
16
+ end
17
+
18
+ results
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,3 @@
1
+ module Smalltalk
2
+ VERSION = "0.0.1"
3
+ end
data/lib/smalltalk.rb ADDED
@@ -0,0 +1,17 @@
1
+ require "active_record"
2
+ require "workflow"
3
+ require "smalltalk/version"
4
+
5
+ module Smalltalk
6
+
7
+ def self.table_name_prefix
8
+ 'smalltalk_'
9
+ end
10
+
11
+ end
12
+
13
+ require "smalltalk/has_messages"
14
+ require "smalltalk/conversation"
15
+ require "smalltalk/message"
16
+ require "smalltalk/reply"
17
+ require "smalltalk/search"
data/smalltalk.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "smalltalk/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "smalltalk"
7
+ s.version = Smalltalk::VERSION
8
+ s.authors = ["Douglas Anderson"]
9
+ s.email = ["i.am.douglas.anderson@gmail.com"]
10
+ s.homepage = 'https://github.com/teachme2/smalltalk'
11
+ s.summary = %q{ A smalltalk gem. }
12
+ s.description = %q{ Trolololo. }
13
+
14
+ s.rubyforge_project = "smalltalk"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_dependency "activesupport"
22
+ s.add_dependency "activerecord", "~> 3.0"
23
+ s.add_dependency "i18n"
24
+ s.add_dependency "workflow", '= 0.8.7'
25
+
26
+ s.add_development_dependency 'combustion', '~> 0.3.1'
27
+ s.add_development_dependency 'database_cleaner', '~> 1.2.0'
28
+ end
data/spec/README ADDED
File without changes
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: db/smalltalk_test.sqlite
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ #
3
+ end
@@ -0,0 +1,51 @@
1
+ ActiveRecord::Schema.define do
2
+
3
+ create_table :smalltalk_lists do |t|
4
+ t.string :name
5
+ t.references :trollable, polymorphic: true
6
+ t.timestamps
7
+ end
8
+
9
+ create_table :smalltalk_cards do |t|
10
+ t.references :list
11
+ t.integer :ordinal
12
+ t.string :name
13
+ t.string :workflow_state
14
+ t.timestamp :due_at
15
+ t.references :trollable, polymorphic: true
16
+ t.timestamps
17
+ end
18
+
19
+ create_table :smalltalk_tasklists do |t|
20
+ t.references :card
21
+ t.integer :ordinal
22
+ t.string :name
23
+ t.string :workflow_state
24
+ t.timestamp :due_at
25
+ t.references :trollable, polymorphic: true
26
+ t.timestamps
27
+ end
28
+
29
+ create_table :smalltalk_tasks do |t|
30
+ t.references :tasklist
31
+ t.integer :ordinal
32
+ t.string :name
33
+ t.string :group
34
+ t.string :workflow_state
35
+ t.timestamp :due_at
36
+ t.references :trollable, polymorphic: true
37
+ t.timestamps
38
+ end
39
+
40
+ add_index :smalltalk_lists, [:trollable_type, :trollable_id]
41
+
42
+ add_index :smalltalk_cards, :list_id
43
+ add_index :smalltalk_cards, [:trollable_type, :trollable_id]
44
+
45
+ add_index :smalltalk_tasklists, :card_id
46
+ add_index :smalltalk_tasklists, [:trollable_type, :trollable_id]
47
+
48
+ add_index :smalltalk_tasks, :tasklist_id
49
+ add_index :smalltalk_tasks, [:trollable_type, :trollable_id]
50
+
51
+ end
@@ -0,0 +1 @@
1
+ *.log
File without changes
@@ -0,0 +1,9 @@
1
+ require 'spec_helper'
2
+
3
+ describe Smalltalk::Message do
4
+
5
+ it "should load" do
6
+ puts 'here'
7
+ end
8
+
9
+ end
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize! :active_record
7
+
8
+ require 'rspec/rails'
9
+
10
+ RSpec.configure do |config|
11
+ config.use_transactional_fixtures = true
12
+ config.color_enabled = true
13
+ config.formatter = :documentation
14
+
15
+ config.before(:suite) do
16
+ DatabaseCleaner.strategy = :truncation
17
+ end
18
+
19
+ config.before(:each) do
20
+ DatabaseCleaner.clean
21
+ end
22
+
23
+ end
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smalltalk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Douglas Anderson
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-11-26 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: activerecord
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '3.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '3.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: i18n
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: workflow
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.8.7
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.8.7
78
+ - !ruby/object:Gem::Dependency
79
+ name: combustion
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.3.1
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: 0.3.1
94
+ - !ruby/object:Gem::Dependency
95
+ name: database_cleaner
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 1.2.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 1.2.0
110
+ description: ! ' Trolololo. '
111
+ email:
112
+ - i.am.douglas.anderson@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - .rvmrc
119
+ - .travis.yml
120
+ - Gemfile
121
+ - README.md
122
+ - Rakefile
123
+ - config.ru
124
+ - lib/generators/active_record/smalltalk_generator.rb
125
+ - lib/generators/active_record/templates/migration.rb
126
+ - lib/smalltalk.rb
127
+ - lib/smalltalk/conversation.rb
128
+ - lib/smalltalk/has_messages.rb
129
+ - lib/smalltalk/message.rb
130
+ - lib/smalltalk/reply.rb
131
+ - lib/smalltalk/search.rb
132
+ - lib/smalltalk/version.rb
133
+ - smalltalk.gemspec
134
+ - spec/README
135
+ - spec/internal/config/database.yml.sample
136
+ - spec/internal/config/routes.rb
137
+ - spec/internal/db/schema.rb
138
+ - spec/internal/log/.gitignore
139
+ - spec/internal/public/favicon.ico
140
+ - spec/lib/smalltalk/task_spec.rb
141
+ - spec/spec_helper.rb
142
+ homepage: https://github.com/teachme2/smalltalk
143
+ licenses: []
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ! '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ requirements: []
161
+ rubyforge_project: smalltalk
162
+ rubygems_version: 1.8.24
163
+ signing_key:
164
+ specification_version: 3
165
+ summary: A smalltalk gem.
166
+ test_files:
167
+ - spec/README
168
+ - spec/internal/config/database.yml.sample
169
+ - spec/internal/config/routes.rb
170
+ - spec/internal/db/schema.rb
171
+ - spec/internal/log/.gitignore
172
+ - spec/internal/public/favicon.ico
173
+ - spec/lib/smalltalk/task_spec.rb
174
+ - spec/spec_helper.rb