schatter 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.
- data/bin/schatter +7 -0
- data/lib/schatter/colour.rb +7 -0
- data/lib/schatter/command/create_conversation.rb +16 -0
- data/lib/schatter/command/create_message.rb +13 -0
- data/lib/schatter/command/delete_message.rb +23 -0
- data/lib/schatter/command/invite_person.rb +13 -0
- data/lib/schatter/command/join_conversation.rb +23 -0
- data/lib/schatter/command/list_conversations.rb +29 -0
- data/lib/schatter/command/list_messages.rb +35 -0
- data/lib/schatter/command/list_people.rb +15 -0
- data/lib/schatter/command/reply_to_message.rb +24 -0
- data/lib/schatter/commands.rb +10 -0
- data/lib/schatter/conversation.rb +42 -0
- data/lib/schatter/conversation_context.rb +18 -0
- data/lib/schatter/index.rb +11 -0
- data/lib/schatter/message.rb +15 -0
- data/lib/schatter/person.rb +7 -0
- data/lib/schatter/resource.rb +71 -0
- data/lib/schatter/root_context.rb +22 -0
- data/lib/schatter/session.rb +16 -0
- data/lib/schatter/version.rb +1 -1
- data/schatter.gemspec +2 -0
- data/spec/schatter/index_spec.rb +14 -0
- data/spec/spec_helper.rb +1 -0
- metadata +47 -7
- data/lib/schatter.rb +0 -4
data/bin/schatter
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'schatter/conversation_context'
|
2
|
+
|
3
|
+
class Schatter::Command::CreateConversation
|
4
|
+
attr_reader :usage, :help, :session
|
5
|
+
|
6
|
+
def initialize session
|
7
|
+
@session = session
|
8
|
+
@usage = '<name>'
|
9
|
+
@help = 'Creates and joins a new conversation'
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute name
|
13
|
+
conversation = session.create_conversation name
|
14
|
+
Schatter::ConversationContext.new(conversation).push
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Schatter::Command::CreateMessage
|
2
|
+
attr_reader :usage, :help, :conversation
|
3
|
+
|
4
|
+
def initialize conversation
|
5
|
+
@conversation = conversation
|
6
|
+
@usage = 'content'
|
7
|
+
@help = 'Creates a new message in the current conversation'
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute content
|
11
|
+
conversation.create_message content: content
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'schatter/index'
|
2
|
+
|
3
|
+
class Schatter::Command::DeleteMessage
|
4
|
+
include Schatter::Index
|
5
|
+
|
6
|
+
attr_reader :usage, :help, :conversation
|
7
|
+
|
8
|
+
def initialize conversation
|
9
|
+
@conversation = conversation
|
10
|
+
@usage = '<index>'
|
11
|
+
@help = 'Deletes the specified message'
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute index
|
15
|
+
message = conversation.messages.values[from_index(index)]
|
16
|
+
unless message
|
17
|
+
puts "invalid index"
|
18
|
+
return
|
19
|
+
end
|
20
|
+
message.destroy
|
21
|
+
puts "message #{index} destroyed"
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Schatter::Command::InvitePerson
|
2
|
+
attr_reader :usage, :help, :conversation
|
3
|
+
|
4
|
+
def initialize conversation
|
5
|
+
@conversation = conversation
|
6
|
+
@usage = '<email>'
|
7
|
+
@help = 'Invites someone to join a conversation'
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute email
|
11
|
+
conversation.create_person email: email
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'schatter/conversation_context'
|
2
|
+
require 'schatter/index'
|
3
|
+
|
4
|
+
class Schatter::Command::JoinConversation
|
5
|
+
include Schatter::Index
|
6
|
+
|
7
|
+
attr_reader :usage, :help, :session
|
8
|
+
|
9
|
+
def initialize session
|
10
|
+
@session = session
|
11
|
+
@usage = '<index>'
|
12
|
+
@help = 'Joins a specified conversation'
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute index
|
16
|
+
conversation = session.conversations.values[from_index(index)]
|
17
|
+
unless conversation
|
18
|
+
puts "invalid index"
|
19
|
+
return
|
20
|
+
end
|
21
|
+
Schatter::ConversationContext.new(conversation).push
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'schatter/colour'
|
2
|
+
require 'schatter/index'
|
3
|
+
|
4
|
+
class Schatter::Command::ListConversations
|
5
|
+
include Schatter::Colour
|
6
|
+
include Schatter::Index
|
7
|
+
|
8
|
+
attr_reader :usage, :help, :session
|
9
|
+
|
10
|
+
def initialize session
|
11
|
+
@session = session
|
12
|
+
@usage = ''
|
13
|
+
@help = 'Lists current conversations'
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute ignored
|
17
|
+
session.conversations(true).values.each_with_index do |conversation, index|
|
18
|
+
puts description conversation, index
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def description conversation, index
|
23
|
+
[
|
24
|
+
c(to_index(index), :yellow),
|
25
|
+
c(conversation.formatted_timestamp, :blue),
|
26
|
+
c(conversation.name, :magenta),
|
27
|
+
].join ' '
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'schatter/colour'
|
2
|
+
require 'schatter/index'
|
3
|
+
|
4
|
+
class Schatter::Command::ListMessages
|
5
|
+
include Schatter::Colour
|
6
|
+
include Schatter::Index
|
7
|
+
|
8
|
+
attr_reader :usage, :help, :conversation
|
9
|
+
|
10
|
+
def initialize conversation
|
11
|
+
@conversation = conversation
|
12
|
+
@usage = ''
|
13
|
+
@help = 'Lists messages for the current conversation'
|
14
|
+
end
|
15
|
+
|
16
|
+
def execute *ignored
|
17
|
+
conversation.messages(true).values.each_with_index do |message, index|
|
18
|
+
puts description message, index
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def description message, index
|
23
|
+
person = conversation.people[message.person_id]
|
24
|
+
parent_index = conversation.messages.keys.index message.parent_id
|
25
|
+
email = person ? person.email : '?'
|
26
|
+
list = [
|
27
|
+
c(to_index(index), :yellow),
|
28
|
+
c(message.formatted_timestamp, :blue),
|
29
|
+
c(email, :magenta),
|
30
|
+
message.content
|
31
|
+
]
|
32
|
+
list << c("(reply to #{to_index(parent_index)})", :green) if parent_index
|
33
|
+
list.join ' '
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Schatter::Command::ListPeople
|
2
|
+
attr_reader :usage, :help, :conversation
|
3
|
+
|
4
|
+
def initialize conversation
|
5
|
+
@conversation = conversation
|
6
|
+
@usage = ''
|
7
|
+
@help = 'Lists people in the current conversation'
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute *ignored
|
11
|
+
conversation.people(true).values.each do |person|
|
12
|
+
puts "#{person.email}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'schatter/index'
|
2
|
+
|
3
|
+
class Schatter::Command::ReplyToMessage
|
4
|
+
include Schatter::Index
|
5
|
+
|
6
|
+
attr_reader :usage, :help, :conversation, :context
|
7
|
+
|
8
|
+
def initialize conversation, context
|
9
|
+
@conversation = conversation
|
10
|
+
@context = context
|
11
|
+
@usage = '<index> <content>'
|
12
|
+
@help = 'Replies to the specified message'
|
13
|
+
end
|
14
|
+
|
15
|
+
def execute text
|
16
|
+
index, content = context.head_tail text
|
17
|
+
message = conversation.messages.values[from_index(index)]
|
18
|
+
unless message
|
19
|
+
puts "invalid index #{index}"
|
20
|
+
return
|
21
|
+
end
|
22
|
+
conversation.create_message content: content, parent_id: message.uuid
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'schatter/resource'
|
2
|
+
require 'schatter/message'
|
3
|
+
require 'schatter/person'
|
4
|
+
|
5
|
+
class Schatter::Conversation < Schatter::Resource
|
6
|
+
def messages reload=false
|
7
|
+
@messages = nil if reload
|
8
|
+
return @messages if @messages
|
9
|
+
@messages = Hash[get(links[:messages])['messages'].map do |resource|
|
10
|
+
[resource['uuid'], Schatter::Message.new(resource: resource)]
|
11
|
+
end]
|
12
|
+
end
|
13
|
+
|
14
|
+
def new_messages
|
15
|
+
params = {}
|
16
|
+
params[:message_id] = messages.last.uuid unless messages.empty?
|
17
|
+
get(links[:messages], params)['messages'].each do |resource|
|
18
|
+
messages[resource['uuid']] = Schatter::Message.new(resource: resource)
|
19
|
+
end
|
20
|
+
@messages
|
21
|
+
end
|
22
|
+
|
23
|
+
def people reload=false
|
24
|
+
@people = nil if reload
|
25
|
+
return @people if @people
|
26
|
+
@people = Hash[get(links[:people])['people'].map do |resource|
|
27
|
+
[resource['uuid'], Schatter::Person.new(resource: resource)]
|
28
|
+
end]
|
29
|
+
end
|
30
|
+
|
31
|
+
def create_message params
|
32
|
+
post links[:messages], params
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_person params
|
36
|
+
post links[:people], params
|
37
|
+
end
|
38
|
+
|
39
|
+
def name
|
40
|
+
resource['name']
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'schatter/commands'
|
2
|
+
require 'shell_shock/context'
|
3
|
+
|
4
|
+
class Schatter::ConversationContext
|
5
|
+
include Schatter::Command
|
6
|
+
include ShellShock::Context
|
7
|
+
|
8
|
+
def initialize conversation
|
9
|
+
@prompt = "#{conversation.name} > "
|
10
|
+
@conversation = conversation
|
11
|
+
add_command load_command(:list_messages, conversation), "'"
|
12
|
+
add_command load_command(:create_message, conversation), 'say'
|
13
|
+
add_command load_command(:reply_to_message, conversation, self), 'reply'
|
14
|
+
add_command load_command(:delete_message, conversation), 'delete'
|
15
|
+
add_command load_command(:invite_person, conversation), 'invite'
|
16
|
+
add_command load_command(:list_people, conversation), 'who'
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'cgi'
|
3
|
+
|
4
|
+
class Schatter::Resource
|
5
|
+
def initialize params
|
6
|
+
@url = params[:url]
|
7
|
+
@resource = params[:resource]
|
8
|
+
@url = links[:self] if @resource
|
9
|
+
end
|
10
|
+
|
11
|
+
def destroy
|
12
|
+
delete @url
|
13
|
+
end
|
14
|
+
|
15
|
+
def resource
|
16
|
+
return @resource if @resource
|
17
|
+
@resource = get @url
|
18
|
+
end
|
19
|
+
|
20
|
+
def links
|
21
|
+
return @links if @links
|
22
|
+
@links = {}
|
23
|
+
resource['_links'].each do |k, v|
|
24
|
+
@links[k.to_sym] = v['href']
|
25
|
+
end
|
26
|
+
puts "#{@links}" if ENV['DEBUG']
|
27
|
+
@links
|
28
|
+
end
|
29
|
+
|
30
|
+
def uuid
|
31
|
+
resource['uuid']
|
32
|
+
end
|
33
|
+
|
34
|
+
def timestamp
|
35
|
+
Time.at resource['timestamp']
|
36
|
+
end
|
37
|
+
|
38
|
+
def formatted_timestamp
|
39
|
+
timestamp.strftime "%d/%m/%Y %H:%M:%S"
|
40
|
+
end
|
41
|
+
|
42
|
+
def get url, params={}
|
43
|
+
params[:auth_token] = ENV['SCHATTER_AUTH_TOKEN']
|
44
|
+
full_url = "#{url}?#{params.map{ |k,v| "#{k}=#{CGI.escape v.to_s}" }.join('&')}"
|
45
|
+
puts "GET #{full_url}" if ENV['DEBUG']
|
46
|
+
response = HTTParty.get full_url,
|
47
|
+
headers: {'Accept' => 'application/json'}
|
48
|
+
puts response if ENV['DEBUG']
|
49
|
+
response
|
50
|
+
end
|
51
|
+
|
52
|
+
def delete url, params={}
|
53
|
+
params[:auth_token] = ENV['SCHATTER_AUTH_TOKEN']
|
54
|
+
full_url = "#{url}?#{params.map{ |k,v| "#{k}=#{CGI.escape v.to_s}" }.join('&')}"
|
55
|
+
puts "DELETE #{full_url}" if ENV['DEBUG']
|
56
|
+
response = HTTParty.delete full_url,
|
57
|
+
headers: {'Accept' => 'application/json'}
|
58
|
+
puts response if ENV['DEBUG']
|
59
|
+
response
|
60
|
+
end
|
61
|
+
|
62
|
+
def post url, body
|
63
|
+
body[:auth_token] = ENV['SCHATTER_AUTH_TOKEN']
|
64
|
+
puts "POST #{url} #{body.to_json}" if ENV['DEBUG']
|
65
|
+
response = HTTParty.post url,
|
66
|
+
headers: {'Accept' => 'application/json', 'Content-Type' => 'application/json'},
|
67
|
+
body: body.to_json
|
68
|
+
puts response if ENV['DEBUG']
|
69
|
+
response
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'schatter/version'
|
2
|
+
require 'schatter/session'
|
3
|
+
require 'schatter/commands'
|
4
|
+
require 'shell_shock/context'
|
5
|
+
|
6
|
+
class Schatter::RootContext
|
7
|
+
include Schatter::Command
|
8
|
+
include ShellShock::Context
|
9
|
+
|
10
|
+
def initialize url=nil
|
11
|
+
url = "http://localhost:3000" unless url
|
12
|
+
unless ENV['SCHATTER_AUTH_TOKEN']
|
13
|
+
puts "Please register at #{url} and set environment variable SCHATTER_AUTH_TOKEN"
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
@prompt = "schatter.#{Schatter::VERSION} #{url}> "
|
17
|
+
session = Schatter::Session.new url: url
|
18
|
+
add_command load_command(:list_conversations, session), "'"
|
19
|
+
add_command load_command(:join_conversation, session), 'join'
|
20
|
+
add_command load_command(:create_conversation, session), 'create'
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'schatter/resource'
|
2
|
+
require 'schatter/conversation'
|
3
|
+
|
4
|
+
class Schatter::Session < Schatter::Resource
|
5
|
+
def conversations reload=false
|
6
|
+
@conversations = nil if reload
|
7
|
+
return @conversations if @conversations
|
8
|
+
@conversations = Hash[get(links[:conversations])['conversations'].map do |resource|
|
9
|
+
[resource['uuid'], Schatter::Conversation.new(resource: resource)]
|
10
|
+
end]
|
11
|
+
end
|
12
|
+
|
13
|
+
def create_conversation name
|
14
|
+
Schatter::Conversation.new post links['conversations'], name: name
|
15
|
+
end
|
16
|
+
end
|
data/lib/schatter/version.rb
CHANGED
data/schatter.gemspec
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
require 'schatter/index'
|
3
|
+
|
4
|
+
describe Schatter::Index do
|
5
|
+
include Schatter::Index
|
6
|
+
|
7
|
+
it 'should translate to string' do
|
8
|
+
to_index(123).must_equal 'bcd'
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should translate to string' do
|
12
|
+
from_index('bcd').must_equal 123
|
13
|
+
end
|
14
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'minitest/autorun'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schatter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
@@ -27,6 +27,22 @@ dependencies:
|
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rainbow
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '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: '0'
|
30
46
|
- !ruby/object:Gem::Dependency
|
31
47
|
name: bundler
|
32
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -62,7 +78,8 @@ dependencies:
|
|
62
78
|
description: command line interface to schatter
|
63
79
|
email:
|
64
80
|
- mark@ryall.name
|
65
|
-
executables:
|
81
|
+
executables:
|
82
|
+
- schatter
|
66
83
|
extensions: []
|
67
84
|
extra_rdoc_files: []
|
68
85
|
files:
|
@@ -71,9 +88,30 @@ files:
|
|
71
88
|
- LICENSE.txt
|
72
89
|
- README.md
|
73
90
|
- Rakefile
|
74
|
-
-
|
91
|
+
- bin/schatter
|
92
|
+
- lib/schatter/colour.rb
|
93
|
+
- lib/schatter/command/create_conversation.rb
|
94
|
+
- lib/schatter/command/create_message.rb
|
95
|
+
- lib/schatter/command/delete_message.rb
|
96
|
+
- lib/schatter/command/invite_person.rb
|
97
|
+
- lib/schatter/command/join_conversation.rb
|
98
|
+
- lib/schatter/command/list_conversations.rb
|
99
|
+
- lib/schatter/command/list_messages.rb
|
100
|
+
- lib/schatter/command/list_people.rb
|
101
|
+
- lib/schatter/command/reply_to_message.rb
|
102
|
+
- lib/schatter/commands.rb
|
103
|
+
- lib/schatter/conversation.rb
|
104
|
+
- lib/schatter/conversation_context.rb
|
105
|
+
- lib/schatter/index.rb
|
106
|
+
- lib/schatter/message.rb
|
107
|
+
- lib/schatter/person.rb
|
108
|
+
- lib/schatter/resource.rb
|
109
|
+
- lib/schatter/root_context.rb
|
110
|
+
- lib/schatter/session.rb
|
75
111
|
- lib/schatter/version.rb
|
76
112
|
- schatter.gemspec
|
113
|
+
- spec/schatter/index_spec.rb
|
114
|
+
- spec/spec_helper.rb
|
77
115
|
homepage: http://github.com/markryall/schatter_gem
|
78
116
|
licenses:
|
79
117
|
- MIT
|
@@ -89,7 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
127
|
version: '0'
|
90
128
|
segments:
|
91
129
|
- 0
|
92
|
-
hash:
|
130
|
+
hash: 1971852999253736068
|
93
131
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
132
|
none: false
|
95
133
|
requirements:
|
@@ -98,11 +136,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
136
|
version: '0'
|
99
137
|
segments:
|
100
138
|
- 0
|
101
|
-
hash:
|
139
|
+
hash: 1971852999253736068
|
102
140
|
requirements: []
|
103
141
|
rubyforge_project:
|
104
142
|
rubygems_version: 1.8.23
|
105
143
|
signing_key:
|
106
144
|
specification_version: 3
|
107
145
|
summary: api wrapper and command line binary for interaction with schatter rails application
|
108
|
-
test_files:
|
146
|
+
test_files:
|
147
|
+
- spec/schatter/index_spec.rb
|
148
|
+
- spec/spec_helper.rb
|
data/lib/schatter.rb
DELETED