zulip 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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +79 -0
- data/Rakefile +1 -0
- data/example/zulip_message_echo.rb +26 -0
- data/lib/zulip/client/event_parser.rb +14 -0
- data/lib/zulip/client/event_streaming.rb +86 -0
- data/lib/zulip/client/messages.rb +31 -0
- data/lib/zulip/client/queue_registration.rb +25 -0
- data/lib/zulip/client/stream_subscriptions.rb +40 -0
- data/lib/zulip/client/users.rb +16 -0
- data/lib/zulip/client.rb +53 -0
- data/lib/zulip/message.rb +18 -0
- data/lib/zulip/stream_subscription.rb +12 -0
- data/lib/zulip/user.rb +9 -0
- data/lib/zulip/version.rb +3 -0
- data/lib/zulip.rb +7 -0
- data/spec/fixtures/add-subscription.json +1 -0
- data/spec/fixtures/get-message-event-success.json +1 -0
- data/spec/fixtures/get-private-message.json +1 -0
- data/spec/fixtures/get-user-subscriptions.json +1 -0
- data/spec/fixtures/get-users.json +1 -0
- data/spec/fixtures/post-message-to-stream.json +1 -0
- data/spec/fixtures/queue-registration-success.json +1 -0
- data/spec/fixtures/sending-private-message-success.json +1 -0
- data/spec/helper.rb +13 -0
- data/spec/lib/zulip/client/event_parser_spec.rb +19 -0
- data/spec/lib/zulip/client/event_streaming_spec.rb +85 -0
- data/spec/lib/zulip/client/messages_spec.rb +64 -0
- data/spec/lib/zulip/client/queue_registration_spec.rb +44 -0
- data/spec/lib/zulip/client/stream_subscriptions_spec.rb +42 -0
- data/spec/lib/zulip/client/users_spec.rb +24 -0
- data/spec/lib/zulip/client_spec.rb +16 -0
- data/spec/lib/zulip/message_spec.rb +79 -0
- data/spec/lib/zulip/stream_subscription_spec.rb +21 -0
- data/spec/lib/zulip/user_spec.rb +17 -0
- data/zulip-rb.gemspec +27 -0
- metadata +177 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7104e27dedb5006e5b02e35bf0a8cadf8c74985b
|
4
|
+
data.tar.gz: a33826034e2546c0ef6957b1e41bde933ae5b342
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4597dad59bb5b8269d3149a91c4629a6cf1f455ea961632b6a351cdcb39a1486e5d6a264609bcce36942b9910aea1b357729e5da9116a0c4e5ddca24929fdd40
|
7
|
+
data.tar.gz: ae289b999a7ebdd71d3504263de80d1255aba4f38aa4c3c141fa80ee28470774793a91e55bbb0bad6c961741cbe321f55725c2140c6302c1d823b20a247d0b5a
|
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Ryan Vergeront
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# Zulip-Rb
|
2
|
+
|
3
|
+
A ruby interface to the Zulip API.
|
4
|
+
|
5
|
+
### Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
`gem 'zulip-rb'`
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
`$ bundle`
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
`$ gem install zulip-rb`
|
18
|
+
|
19
|
+
### Configuration
|
20
|
+
You'll need to register a bot to use the Zulip API.
|
21
|
+
You can obtain your Zulip API key, create bots, and manage bots all
|
22
|
+
from your Zulip [settings page](https://zulip.com/#settings).
|
23
|
+
|
24
|
+
Set your api key and your bot's email address by passing a block to your Zulip::Client instance:
|
25
|
+
```ruby
|
26
|
+
client = Zulip::Client.new do |config|
|
27
|
+
config.bot_email_address = "YOUR_BOTS_EMAIL_ADDRESS"
|
28
|
+
config.api_key = "YOUR_API_KEY"
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
You'll need to subscribe your bot to streams you want to read from. Do so by adding your bot's email to the stream's membership from a zulip client, or use the #subscribe method (see example below).
|
33
|
+
|
34
|
+
### Usage
|
35
|
+
|
36
|
+
Send messages to a stream:
|
37
|
+
```ruby
|
38
|
+
client.send_message("Hey", "I'm posting to zulip", "test-stream")
|
39
|
+
```
|
40
|
+
|
41
|
+
Send private messages to one or more users:
|
42
|
+
```ruby
|
43
|
+
client.send_private_message("hey I heard you like the internet", "bob@the-internet.net", "alice@the-information-superhighway.org")
|
44
|
+
```
|
45
|
+
|
46
|
+
Stream messages:
|
47
|
+
```ruby
|
48
|
+
client.stream_messages do |message|
|
49
|
+
# Do some work
|
50
|
+
end
|
51
|
+
```
|
52
|
+
|
53
|
+
Get your bot's current subscriptions:
|
54
|
+
```ruby
|
55
|
+
client.get_subscriptions
|
56
|
+
```
|
57
|
+
|
58
|
+
Subscribe your bot to a stream, passing the stream name:
|
59
|
+
```ruby
|
60
|
+
client.subscribe "food"
|
61
|
+
```
|
62
|
+
|
63
|
+
List users:
|
64
|
+
```ruby
|
65
|
+
client.get_users
|
66
|
+
```
|
67
|
+
|
68
|
+
### Contributing
|
69
|
+
|
70
|
+
1. Fork it
|
71
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
72
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
73
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
74
|
+
5. Create new Pull Request
|
75
|
+
|
76
|
+
Some areas that could use contributions:
|
77
|
+
|
78
|
+
1. Error handling
|
79
|
+
2. Add unsubscribing from a stream
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,26 @@
|
|
1
|
+
$:.push File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'zulip'
|
3
|
+
|
4
|
+
### Sends a private message to a new thread is posted to a specified stream
|
5
|
+
|
6
|
+
class ZulipEcho
|
7
|
+
|
8
|
+
def run
|
9
|
+
client = Zulip::Client.new do |config|
|
10
|
+
config.bot_email_address = ENV['BOT_EMAIL_ADDRESS'] || "bot@example.com"
|
11
|
+
config.api_key = ENV['BOT_API_KEY'] || "apikey"
|
12
|
+
end
|
13
|
+
|
14
|
+
client.stream_messages do |message|
|
15
|
+
client.send_private_message(private_message_content(message), "example@gmail.com")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def private_message_content(message)
|
22
|
+
"#{message.sender_full_name}, posted to #{message.stream}:\n #{message.subject}: #{message.content}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
ZulipEcho.new.run
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Zulip
|
2
|
+
class Client
|
3
|
+
module EventStreaming
|
4
|
+
|
5
|
+
def stream_messages(&block)
|
6
|
+
stream_events("message", &block)
|
7
|
+
end
|
8
|
+
|
9
|
+
def stream_private_messages(&block)
|
10
|
+
stream_raw_events("message") do |raw_event|
|
11
|
+
yield parse_event(raw_event) if private_message?(raw_event)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def stream_public_messages(&block)
|
16
|
+
stream_raw_events("message") do |raw_event|
|
17
|
+
yield parse_event(raw_event) if public_message?(raw_event)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def stream_events(event_types, &block)
|
22
|
+
stream_raw_events(event_types) do |raw_event|
|
23
|
+
yield parse_event(raw_event)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def stream_raw_events(event_types, &block)
|
30
|
+
queue = register(event_types)
|
31
|
+
queue_id = queue.queue_id
|
32
|
+
last_event_id = queue.last_event_id
|
33
|
+
|
34
|
+
loop do
|
35
|
+
events = get_events(queue_id, last_event_id)
|
36
|
+
last_event_id = max_event_id_from(events)
|
37
|
+
|
38
|
+
events.each do |event|
|
39
|
+
yield event if event_types.include?(event["type"])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Makes a longpulling request on an event queue
|
45
|
+
def get_events(queue_id, last_event_id=nil)
|
46
|
+
connection.params = build_get_event_params(queue_id, last_event_id)
|
47
|
+
event_response.fetch("events")
|
48
|
+
end
|
49
|
+
|
50
|
+
def parse_event(raw_event)
|
51
|
+
Zulip::Client::EventParser.parse(raw_event)
|
52
|
+
end
|
53
|
+
|
54
|
+
def build_get_event_params(registered_queue_or_queue_id, last_event_id)
|
55
|
+
{ 'queue_id' => find_queue_id(registered_queue_or_queue_id),
|
56
|
+
'last_event_id' => last_event_id || registered_queue_or_queue_id.last_event_id }
|
57
|
+
end
|
58
|
+
|
59
|
+
def find_queue_id(registered_queue_or_queue_id)
|
60
|
+
if registered_queue_or_queue_id.respond_to?(:queue_id)
|
61
|
+
registered_queue_or_queue_id.queue_id
|
62
|
+
else
|
63
|
+
registered_queue_or_queue_id
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def event_response
|
68
|
+
response = connection.get("/v1/events").body
|
69
|
+
JSON.parse(response)
|
70
|
+
end
|
71
|
+
|
72
|
+
def max_event_id_from(events)
|
73
|
+
events.map{ |event| event['id']}.max
|
74
|
+
end
|
75
|
+
|
76
|
+
def private_message?(event)
|
77
|
+
event['message']['type'] == "private"
|
78
|
+
end
|
79
|
+
|
80
|
+
def public_message?(event)
|
81
|
+
event['message']['type'] == "stream"
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Zulip
|
4
|
+
class Client
|
5
|
+
module Messages
|
6
|
+
|
7
|
+
def send_message(subject, content, to_stream)
|
8
|
+
post_message("stream", content, to_stream, subject)
|
9
|
+
end
|
10
|
+
|
11
|
+
def send_private_message(content, *recipient_users)
|
12
|
+
post_message("private", content, recipient_users)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def post_message(type, content, recipients_or_stream, subject=nil)
|
18
|
+
connection.params = build_post_message_params(type, content,
|
19
|
+
recipients_or_stream, subject)
|
20
|
+
connection.post("v1/messages")
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_post_message_params(type, content, recipients_or_stream, subject=nil)
|
24
|
+
params = subject ? {"subject" => subject } : {}
|
25
|
+
params.merge({ "type" => type, "content" => content,
|
26
|
+
"to" => json_encode_list(recipients_or_stream) })
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Zulip
|
2
|
+
class Client
|
3
|
+
module QueueRegistration
|
4
|
+
EVENT_TYPES = { message: "message" }
|
5
|
+
# TODO: Add support for other event types
|
6
|
+
# TODO: Add support setting apply markdown to false
|
7
|
+
|
8
|
+
QueueRegistrationResponse = Struct.new(:queue_id, :last_event_id)
|
9
|
+
|
10
|
+
def register(event_types=nil, opts={})
|
11
|
+
|
12
|
+
if event_types
|
13
|
+
connection.params = { "event_types" => json_encode_list(event_types) }
|
14
|
+
end
|
15
|
+
|
16
|
+
QueueRegistrationResponse.new( registration_response['queue_id'],
|
17
|
+
registration_response['last_event_id'] )
|
18
|
+
end
|
19
|
+
|
20
|
+
def registration_response
|
21
|
+
@registration_response ||= parse_json(connection.post("v1/register").body)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Zulip
|
2
|
+
class Client
|
3
|
+
module StreamSubscriptions
|
4
|
+
|
5
|
+
def get_subscriptions
|
6
|
+
get_subscriptions_response.map do |subscription|
|
7
|
+
Zulip::StreamSubscription.new(subscription)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def subscribe(streams)
|
12
|
+
patch_subscriptions subscribe_params(streams)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def get_subscriptions_response
|
18
|
+
parse_response(connection.get(subscription_urn)).fetch("subscriptions") { [] }
|
19
|
+
end
|
20
|
+
|
21
|
+
def subscription_urn
|
22
|
+
'v1/users/me/subscriptions'
|
23
|
+
end
|
24
|
+
|
25
|
+
def subscribe_params(streams)
|
26
|
+
{ add: json_encoded_streams(streams) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def json_encoded_streams(streams)
|
30
|
+
streams = Array(streams).map { |subscription_name| { name: subscription_name } }
|
31
|
+
json_encode_list(streams)
|
32
|
+
end
|
33
|
+
|
34
|
+
def patch_subscriptions(req_params)
|
35
|
+
parse_response(connection.patch(subscription_urn, req_params))
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Zulip
|
2
|
+
class Client
|
3
|
+
module Users
|
4
|
+
def get_users
|
5
|
+
get_users_response.map { |user_data| Zulip::User.new(user_data) }
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def get_users_response
|
11
|
+
parse_response(connection.get('v1/users')).fetch("members") { [] }
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/zulip/client.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'faraday'
|
3
|
+
|
4
|
+
require 'zulip/client/messages'
|
5
|
+
require 'zulip/client/users'
|
6
|
+
require 'zulip/client/stream_subscriptions'
|
7
|
+
require 'zulip/client/queue_registration'
|
8
|
+
require 'zulip/client/event_streaming'
|
9
|
+
require 'zulip/client/event_parser'
|
10
|
+
|
11
|
+
module Zulip
|
12
|
+
class Client
|
13
|
+
include Zulip::Client::Messages
|
14
|
+
include Zulip::Client::Users
|
15
|
+
include Zulip::Client::StreamSubscriptions
|
16
|
+
include Zulip::Client::QueueRegistration
|
17
|
+
include Zulip::Client::EventStreaming
|
18
|
+
include Zulip::Client::EventParser
|
19
|
+
|
20
|
+
attr_accessor :bot_email_address, :api_key
|
21
|
+
attr_writer :connection
|
22
|
+
ENDPOINT = "https://api.zulip.com"
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
yield self if block_given?
|
26
|
+
end
|
27
|
+
|
28
|
+
def connection
|
29
|
+
@connection ||= initialize_connection
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def initialize_connection
|
35
|
+
conn = Faraday.new(url: ENDPOINT)
|
36
|
+
conn.basic_auth(bot_email_address, api_key)
|
37
|
+
conn
|
38
|
+
end
|
39
|
+
|
40
|
+
def json_encode_list(items)
|
41
|
+
JSON.generate(Array(items).flatten)
|
42
|
+
end
|
43
|
+
|
44
|
+
def parse_response(http_response)
|
45
|
+
parse_json(http_response.body)
|
46
|
+
end
|
47
|
+
|
48
|
+
def parse_json(json)
|
49
|
+
JSON.parse(json)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Zulip
|
2
|
+
class Message
|
3
|
+
attr_reader :id, :recipient_id, :sender_email, :timestamp, :display_recipient,
|
4
|
+
:sender_id, :sender_full_name, :sender_domain, :content, :gravatar_hash,
|
5
|
+
:avatar_url, :client, :content_type, :subject_links, :sender_short_name,
|
6
|
+
:type, :subject
|
7
|
+
|
8
|
+
alias :stream :display_recipient
|
9
|
+
alias :display_recipients :display_recipient
|
10
|
+
|
11
|
+
def initialize(attrs={})
|
12
|
+
attrs.each do |name, value|
|
13
|
+
instance_variable_set("@#{name}", value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Zulip
|
2
|
+
class StreamSubscription
|
3
|
+
attr_reader :name, :color, :notifications, :subscribers, :invite_only,
|
4
|
+
:email_address, :in_home_view
|
5
|
+
|
6
|
+
def initialize(attrs={})
|
7
|
+
attrs.each do |name, value|
|
8
|
+
instance_variable_set("@#{name}", value)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/zulip/user.rb
ADDED
data/lib/zulip.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"subscribed":{"test_zulip_cli-bot@students.hackerschool.com":["clojure"]},"not_subscribed":[],"result":"success","msg":"","already_subscribed":{"test_zulip_cli-bot@students.hackerschool.com":["ruby"]},"removed":[]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"result":"success","queue_id":"1384457534:662","msg":"","events":[{"flags":[],"message":{"recipient_id":23442,"sender_email":"ryanvergeront@gmail.com","timestamp":1384460690,"display_recipient":"test-stream","sender_id":2874,"sender_full_name":"Ryan Vergeront (F'13)","sender_domain":"students.hackerschool.com","content":"register an event type of 'message' not 'messages'","gravatar_hash":"a8e2e659c929c79669f97603bd73fcc5","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a8e2e659c929c79669f97603bd73fcc5?d=identicon","client":"desktop app Mac 0.3.10","content_type":"text\/x-markdown","subject_links":[],"sender_short_name":"ryanvergeront","type":"stream","id":12791579,"subject":"sending some internet websites to the internet"},"type":"message","id":0}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"result":"success","queue_id":"1384457534:662","msg":"","events":[{"flags":[],"message":{"recipient_id":25207,"sender_email":"ryanvergeront@gmail.com","timestamp":1384561238,"display_recipient":[{"full_name":"Ryan Vergeront (F'13)","domain":"students.hackerschool.com","email":"ryanvergeront@gmail.com","short_name":"ryanvergeront","id":2874},{"domain":"students.hackerschool.com","short_name":"test_zulip_cli-bot","email":"test_zulip_cli-bot@students.hackerschool.com","full_name":"Ryan's Bot","id":2934}],"sender_id":2874,"sender_full_name":"Ryan Vergeront (F'13)","sender_domain":"students.hackerschool.com","content":"the messages are less funny when I'm PMing myself","gravatar_hash":"a8e2e659c929c79669f97603bd73fcc5","avatar_url":"https://secure.gravatar.com/avatar/a8e2e659c929c79669f97603bd73fcc5?d=identicon","client":"desktop app Mac 0.3.10","content_type":"text/x-markdown","subject_links":[],"sender_short_name":"ryanvergeront","type":"private","id":12855410,"subject":""},"type":"message","id":0}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"msg":"","result":"success","subscriptions":[{"name":"VIM","color":"#76ce90","notifications":false,"subscribers":["bob@example.com","alice@example.com"],"invite_only":false,"email_address":"VIM+c46cdd8670afe104a66e5f1af277aa05@streams.zulip.com","in_home_view":true},{"name":"social","color":"#94c849","notifications":false,"subscribers":["alice@example.com","jane@example.com"],"invite_only":false,"email_address":"social+06435131f9e681a9835c2733893baad2@streams.zulip.com","in_home_view":true}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"msg":"","result":"success","members":[{"email":"bob@example.org","full_name":"Bob G"},{"email":"alice@example.org","full_name":"Alice P"}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"msg":"","result":"success","id":12743014}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"msg":"","max_message_id":12779330,"last_event_id":-1,"result":"success","queue_id":"1384438093:1161"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"msg":"","result":"success","id":12745890}
|
data/spec/helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative "../../../../lib/zulip"
|
2
|
+
require 'helper'
|
3
|
+
|
4
|
+
module Zulip
|
5
|
+
class Client
|
6
|
+
describe EventParser do
|
7
|
+
it "parses message events" do
|
8
|
+
event_hash = parsed_json_fixture("get-message-event-success.json")['events'].first
|
9
|
+
result = Zulip::Client::EventParser.parse(event_hash)
|
10
|
+
expect(result).to be_kind_of Zulip::Message
|
11
|
+
end
|
12
|
+
|
13
|
+
it "parses heartbeat events"
|
14
|
+
it "parses presence events"
|
15
|
+
it "parses subscriptions events"
|
16
|
+
it "parses error events"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require_relative "../../../../lib/zulip"
|
3
|
+
|
4
|
+
class ExitStreamingGracefullyError < StandardError; end
|
5
|
+
|
6
|
+
module Zulip
|
7
|
+
class Client
|
8
|
+
describe EventStreaming do
|
9
|
+
let(:private_message_fixture) { fixture("get-private-message.json") }
|
10
|
+
let(:public_message_fixture) { fixture("get-message-event-success.json") }
|
11
|
+
|
12
|
+
context "streaming messages" do
|
13
|
+
|
14
|
+
let(:client) { Zulip::Client.new }
|
15
|
+
let(:fake_connection) { double("fake connection", :params= => nil) }
|
16
|
+
let(:fake_response) { double("response") }
|
17
|
+
let(:fake_queue) { double("fake queue", queue_id: "id", last_event_id: -1) }
|
18
|
+
|
19
|
+
describe "#stream_private_messages" do
|
20
|
+
it "returns private messages viewable to the bot" do
|
21
|
+
|
22
|
+
# Returns a public-message, then a private message
|
23
|
+
fake_response.stub(:body).and_return(public_message_fixture, private_message_fixture)
|
24
|
+
fake_connection.stub(:get).with('/v1/events').and_return(fake_response)
|
25
|
+
client.stub(:register).and_return(fake_queue)
|
26
|
+
|
27
|
+
client.connection = fake_connection
|
28
|
+
|
29
|
+
messages = []
|
30
|
+
begin
|
31
|
+
client.stream_private_messages do |msg|
|
32
|
+
messages << msg
|
33
|
+
raise ExitStreamingGracefullyError if messages.count == 2
|
34
|
+
end
|
35
|
+
rescue ExitStreamingGracefullyError
|
36
|
+
messages.each { |msg| expect(msg.type).to eq("private") }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#stream_public_messages" do
|
42
|
+
it "only returns public messages" do
|
43
|
+
fake_response.stub(:body).and_return(private_message_fixture, public_message_fixture)
|
44
|
+
fake_connection.stub(:get).with('/v1/events').and_return(fake_response)
|
45
|
+
client.stub(:register).and_return(fake_queue)
|
46
|
+
|
47
|
+
client.connection = fake_connection
|
48
|
+
|
49
|
+
messages = []
|
50
|
+
begin
|
51
|
+
client.stream_public_messages do |msg|
|
52
|
+
messages << msg
|
53
|
+
raise ExitStreamingGracefullyError if messages.count == 1
|
54
|
+
end
|
55
|
+
rescue ExitStreamingGracefullyError
|
56
|
+
messages.each { |msg| expect(msg.type).to eq("stream") }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "#stream_messages" do
|
62
|
+
it "streams both public and private messages" do
|
63
|
+
fake_response.stub(:body).and_return(public_message_fixture, private_message_fixture)
|
64
|
+
fake_connection.stub(:get).with('/v1/events').and_return(fake_response)
|
65
|
+
client.stub(:register).and_return(fake_queue)
|
66
|
+
|
67
|
+
client.connection = fake_connection
|
68
|
+
|
69
|
+
messages = []
|
70
|
+
begin
|
71
|
+
client.stream_messages do |msg|
|
72
|
+
messages << msg
|
73
|
+
raise ExitStreamingGracefullyError if messages.count == 2
|
74
|
+
end
|
75
|
+
rescue ExitStreamingGracefullyError
|
76
|
+
expect(messages.first.type).to eq "stream"
|
77
|
+
expect(messages.last.type).to eq "private"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require_relative "../../../../lib/zulip"
|
3
|
+
|
4
|
+
module Zulip
|
5
|
+
class Client
|
6
|
+
describe Messages do
|
7
|
+
it "posts a message to a stream" do
|
8
|
+
subject = "sending some internet websites to the internet"
|
9
|
+
content = "Hey, I found this on the internet: http://nbapaintings.blogspot.com/"
|
10
|
+
stream = "test-stream"
|
11
|
+
|
12
|
+
client = Zulip::Client.new
|
13
|
+
fake_response = fixture("post-message-to-stream.json")
|
14
|
+
fake_connection = double("fake connection", post: fake_response )
|
15
|
+
client.connection = fake_connection
|
16
|
+
|
17
|
+
fake_connection.should_receive(:params=).with({"type"=>"stream", "content"=>content,
|
18
|
+
"to" => json_encode_list(stream),
|
19
|
+
"subject"=>subject})
|
20
|
+
|
21
|
+
fake_connection.should_receive(:post).with("v1/messages")
|
22
|
+
client.send_message(subject, content, stream)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "sends private messages to a single user" do
|
26
|
+
content = "Hi, I heard you like the internet. Here: http://en.wikipedia.org/wiki/Zebroid"
|
27
|
+
recipient = "internet_cat@example.com"
|
28
|
+
|
29
|
+
client = Zulip::Client.new
|
30
|
+
|
31
|
+
fake_response = fixture("sending-private-message-success.json")
|
32
|
+
fake_connection = double("fake connection", post: fake_response )
|
33
|
+
client.connection = fake_connection
|
34
|
+
|
35
|
+
fake_connection.should_receive(:params=).with({"type"=>"private", "content"=>content,
|
36
|
+
"to" => json_encode_list(recipient)})
|
37
|
+
fake_connection.should_receive(:post).with("v1/messages")
|
38
|
+
client.send_private_message(content, recipient)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "sends private messages to multiple users" do
|
42
|
+
|
43
|
+
content = 'testing private messages to multiple users'
|
44
|
+
recipients = ["bob@gmail.com", "alice@gmail.com"]
|
45
|
+
|
46
|
+
client = Zulip::Client.new
|
47
|
+
|
48
|
+
fake_response = fixture("sending-private-message-success.json")
|
49
|
+
fake_connection = double("fake connection", post: fake_response )
|
50
|
+
client.connection = fake_connection
|
51
|
+
|
52
|
+
fake_connection.should_receive(:params=).with({"type"=>"private", "content"=>content,
|
53
|
+
"to" => json_encode_list(recipients)})
|
54
|
+
fake_connection.should_receive(:post).with("v1/messages")
|
55
|
+
|
56
|
+
client.send_private_message(content, recipients)
|
57
|
+
end
|
58
|
+
|
59
|
+
def json_encode_list(item)
|
60
|
+
JSON.generate(Array(item).flatten)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require_relative "../../../../lib/zulip"
|
3
|
+
|
4
|
+
module Zulip
|
5
|
+
class Client
|
6
|
+
describe QueueRegistration do
|
7
|
+
describe "registering a queue to stream messages" do
|
8
|
+
context "with an event type of messages" do
|
9
|
+
it "posts to the register api" do
|
10
|
+
fake_connection = double("fake connection")
|
11
|
+
fake_response = double("response", body: fixture("queue-registration-success.json"))
|
12
|
+
fake_connection.stub(:post).with("v1/register").and_return(fake_response)
|
13
|
+
|
14
|
+
client = Zulip::Client.new
|
15
|
+
client.connection = fake_connection
|
16
|
+
|
17
|
+
fake_connection.should_receive(:params=).with( { "event_types" => '["message"]' } )
|
18
|
+
fake_connection.should_receive(:post).with("v1/register")
|
19
|
+
|
20
|
+
stream_type = :message
|
21
|
+
client.register(stream_type)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns an object with the queue's id and last event id" do
|
25
|
+
fake_response = double("response", body: fixture("queue-registration-success.json"))
|
26
|
+
fake_connection = double("fake connection", :params= => nil )
|
27
|
+
fake_connection.stub(:post).with("v1/register").and_return(fake_response)
|
28
|
+
|
29
|
+
client = Zulip::Client.new
|
30
|
+
client.connection = fake_connection
|
31
|
+
|
32
|
+
the_expected_queue_id = "1384438093:1161"
|
33
|
+
the_expected_last_event_id = -1
|
34
|
+
stream_type = :message
|
35
|
+
response = client.register(stream_type)
|
36
|
+
|
37
|
+
expect(response.queue_id).to eq the_expected_queue_id
|
38
|
+
expect(response.last_event_id).to eq the_expected_last_event_id
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require_relative "../../../../lib/zulip"
|
3
|
+
|
4
|
+
module Zulip
|
5
|
+
class Client
|
6
|
+
describe StreamSubscriptions do
|
7
|
+
describe "#get_subscriptions" do
|
8
|
+
it "returns the bot's stream subscriptions" do
|
9
|
+
fake_http_response = double("fake http response",
|
10
|
+
body: fixture("get-user-subscriptions.json"))
|
11
|
+
fake_connection = double("fake connection", get: fake_http_response)
|
12
|
+
|
13
|
+
client = Zulip::Client.new
|
14
|
+
client.connection = fake_connection
|
15
|
+
|
16
|
+
subscriptions = client.get_subscriptions
|
17
|
+
expect(subscriptions.first).to be_a Zulip::StreamSubscription
|
18
|
+
expect(subscriptions.last).to be_a Zulip::StreamSubscription
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#subscribe" do
|
23
|
+
it "sends a PATCH message to subscribe the user to a stream" do
|
24
|
+
fake_http_response = double("fake response",
|
25
|
+
body: fixture("add-subscription.json"))
|
26
|
+
fake_connection = double("fake connection", patch: fake_http_response)
|
27
|
+
|
28
|
+
client = Zulip::Client.new
|
29
|
+
client.connection = fake_connection
|
30
|
+
|
31
|
+
expected_params = ["v1/users/me/subscriptions",
|
32
|
+
{:add=>"[{\"name\":\"clojure\"},{\"name\":\"ruby\"}]"}]
|
33
|
+
fake_connection.should_receive(:patch).with(*expected_params)
|
34
|
+
|
35
|
+
streams = ["clojure", "ruby"]
|
36
|
+
client.subscribe(streams)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require_relative "../../../../lib/zulip"
|
3
|
+
|
4
|
+
module Zulip
|
5
|
+
class Client
|
6
|
+
describe Users do
|
7
|
+
describe "get_users" do
|
8
|
+
it "returns users in the bot's realm" do
|
9
|
+
|
10
|
+
fake_http_response = double("fake http response", body: fixture("get-users.json"))
|
11
|
+
fake_connection = double("fake connection", get: fake_http_response)
|
12
|
+
|
13
|
+
client = Zulip::Client.new
|
14
|
+
client.connection = fake_connection
|
15
|
+
|
16
|
+
users = client.get_users
|
17
|
+
expect(users.first).to be_kind_of Zulip::User
|
18
|
+
expect(users.last).to be_kind_of Zulip::User
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative "../../../lib/zulip"
|
2
|
+
|
3
|
+
describe Zulip::Client do
|
4
|
+
describe "configuration" do
|
5
|
+
it "yields itself upon initialization for configuration" do
|
6
|
+
|
7
|
+
client = Zulip::Client.new do |config|
|
8
|
+
config.bot_email_address = "bot@example.com"
|
9
|
+
config.api_key = "apikey"
|
10
|
+
end
|
11
|
+
|
12
|
+
expect(client.bot_email_address).to eq "bot@example.com"
|
13
|
+
expect(client.api_key).to eq "apikey"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require_relative "../../../lib/zulip"
|
2
|
+
|
3
|
+
module Zulip
|
4
|
+
describe Message do
|
5
|
+
let(:message_data) { {
|
6
|
+
"recipient_id"=>23442,
|
7
|
+
"sender_email"=>"ryanvergeront@gmail.com",
|
8
|
+
"timestamp"=>1384460690,
|
9
|
+
"display_recipient"=>"test-stream",
|
10
|
+
"sender_id"=>2874,
|
11
|
+
"sender_full_name"=>"Ryan Vergeront (F'13)",
|
12
|
+
"sender_domain"=>"students.hackerschool.com",
|
13
|
+
"content"=>"register an event type of 'message' not 'messages'",
|
14
|
+
"gravatar_hash"=>"a8e2e659c929c79669f97603bd73fcc5",
|
15
|
+
"avatar_url"=>
|
16
|
+
"https://secure.gravatar.com/avatar/a8e2e659c929c79669f97603bd73fcc5?d=identicon",
|
17
|
+
"client"=>"desktop app Mac 0.3.10",
|
18
|
+
"content_type"=>"text/x-markdown",
|
19
|
+
"subject_links"=>[],
|
20
|
+
"sender_short_name"=>"ryanvergeront",
|
21
|
+
"type"=>"stream",
|
22
|
+
"id"=>12791579,
|
23
|
+
"subject"=>"sending some internet websites to the internet" } }
|
24
|
+
|
25
|
+
it "implements attr_readers for it's attributes" do
|
26
|
+
message = Message.new(message_data)
|
27
|
+
expect(message.sender_email).to eq "ryanvergeront@gmail.com"
|
28
|
+
|
29
|
+
message_data.keys.each do |name|
|
30
|
+
return_value = message.send(name.to_sym)
|
31
|
+
expect(return_value).not_to be_nil
|
32
|
+
end
|
33
|
+
expect(message.stream).to eq "test-stream"
|
34
|
+
end
|
35
|
+
|
36
|
+
let(:pm_data) { {"recipient_id"=>25104,
|
37
|
+
"sender_email"=>"test_zulip_cli-bot@students.hackerschool.com",
|
38
|
+
"timestamp"=>1384536182,
|
39
|
+
"display_recipient"=>
|
40
|
+
[{"domain"=>"students.hackerschool.com",
|
41
|
+
"short_name"=>"ryanvergeront",
|
42
|
+
"email"=>"ryanvergeront@gmail.com",
|
43
|
+
"full_name"=>"Ryan Vergeront (F'13)",
|
44
|
+
"id"=>2874},
|
45
|
+
{"full_name"=>"Ryan's Bot",
|
46
|
+
"domain"=>"students.hackerschool.com",
|
47
|
+
"email"=>"test_zulip_cli-bot@students.hackerschool.com",
|
48
|
+
"short_name"=>"test_zulip_cli-bot",
|
49
|
+
"id"=>2934}],
|
50
|
+
"sender_id"=>2934,
|
51
|
+
"sender_full_name"=>"Ryan's Bot",
|
52
|
+
"sender_domain"=>"students.hackerschool.com",
|
53
|
+
"content"=>
|
54
|
+
"Ryan Vergeront (F'13), posted to test-stream:\n sending some internet websites to the internet: :)",
|
55
|
+
"gravatar_hash"=>"9edc706c9ea089025a4bede65630866b",
|
56
|
+
"avatar_url"=>
|
57
|
+
"https://secure.gravatar.com/avatar/9edc706c9ea089025a4bede65630866b?d=identicon",
|
58
|
+
"client"=>"API",
|
59
|
+
"content_type"=>"text/x-markdown",
|
60
|
+
"subject_links"=>[],
|
61
|
+
"sender_short_name"=>"test_zulip_cli-bot",
|
62
|
+
"type"=>"private",
|
63
|
+
"id"=>12836310,
|
64
|
+
"subject"=>""} }
|
65
|
+
|
66
|
+
it "works for private messages" do
|
67
|
+
pm = Message.new(pm_data)
|
68
|
+
expect(pm.display_recipients).to be_a(Array)
|
69
|
+
|
70
|
+
pm_data.each do |name, value|
|
71
|
+
unless value.class == Array
|
72
|
+
return_value = pm.send(name.to_sym)
|
73
|
+
expect(return_value).not_to be_nil
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative "../../../lib/zulip"
|
2
|
+
|
3
|
+
module Zulip
|
4
|
+
describe StreamSubscription do
|
5
|
+
let(:data) { { "name"=>"VIM",
|
6
|
+
"color"=>"#76ce90",
|
7
|
+
"notifications"=>false,
|
8
|
+
"subscribers"=>["bob@example.com", "alice@example.com"],
|
9
|
+
"invite_only"=>false,
|
10
|
+
"email_address"=>"VIM@streams.zulip.com",
|
11
|
+
"in_home_view"=>true } }
|
12
|
+
|
13
|
+
it "has attrs" do
|
14
|
+
subscription = StreamSubscription.new(data)
|
15
|
+
data.each do |key, value|
|
16
|
+
expect(subscription.send(key)).to eq value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative "../../../lib/zulip"
|
2
|
+
|
3
|
+
module Zulip
|
4
|
+
describe User do
|
5
|
+
it "has an email" do
|
6
|
+
data = {"email"=>"bob@example.org","full_name"=>"Bob G"}
|
7
|
+
user = User.new(data)
|
8
|
+
expect(user.email).to eq "bob@example.org"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "has a full name" do
|
12
|
+
data = {"email"=>"bob@example.org","full_name"=>"Bob G"}
|
13
|
+
user = User.new(data)
|
14
|
+
expect(user.full_name).to eq "Bob G"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/zulip-rb.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'zulip/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "zulip"
|
8
|
+
spec.version = Zulip::VERSION
|
9
|
+
spec.authors = ["Ryan Vergeront"]
|
10
|
+
spec.email = ["ryan.vergeront@gmail.com"]
|
11
|
+
spec.description = %q{A ruby wrapper for the Zulip API.}
|
12
|
+
spec.summary = spec.description
|
13
|
+
spec.homepage = "https://github.com/verg/zulip-rb"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency('faraday', ['>= 0.7', '< 0.9'])
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
23
|
+
spec.add_development_dependency "rake"
|
24
|
+
spec.add_development_dependency('rspec', '~> 2.4')
|
25
|
+
spec.add_development_dependency "pry"
|
26
|
+
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zulip
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Vergeront
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-11-18 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: faraday
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.7'
|
20
|
+
- - <
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0.9'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.7'
|
30
|
+
- - <
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.9'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: bundler
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ~>
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.3'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ~>
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '1.3'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rake
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ~>
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '2.4'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ~>
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '2.4'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: pry
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
description: A ruby wrapper for the Zulip API.
|
90
|
+
email:
|
91
|
+
- ryan.vergeront@gmail.com
|
92
|
+
executables: []
|
93
|
+
extensions: []
|
94
|
+
extra_rdoc_files: []
|
95
|
+
files:
|
96
|
+
- .gitignore
|
97
|
+
- Gemfile
|
98
|
+
- LICENSE.txt
|
99
|
+
- README.md
|
100
|
+
- Rakefile
|
101
|
+
- example/zulip_message_echo.rb
|
102
|
+
- lib/zulip.rb
|
103
|
+
- lib/zulip/client.rb
|
104
|
+
- lib/zulip/client/event_parser.rb
|
105
|
+
- lib/zulip/client/event_streaming.rb
|
106
|
+
- lib/zulip/client/messages.rb
|
107
|
+
- lib/zulip/client/queue_registration.rb
|
108
|
+
- lib/zulip/client/stream_subscriptions.rb
|
109
|
+
- lib/zulip/client/users.rb
|
110
|
+
- lib/zulip/message.rb
|
111
|
+
- lib/zulip/stream_subscription.rb
|
112
|
+
- lib/zulip/user.rb
|
113
|
+
- lib/zulip/version.rb
|
114
|
+
- spec/fixtures/add-subscription.json
|
115
|
+
- spec/fixtures/get-message-event-success.json
|
116
|
+
- spec/fixtures/get-private-message.json
|
117
|
+
- spec/fixtures/get-user-subscriptions.json
|
118
|
+
- spec/fixtures/get-users.json
|
119
|
+
- spec/fixtures/post-message-to-stream.json
|
120
|
+
- spec/fixtures/queue-registration-success.json
|
121
|
+
- spec/fixtures/sending-private-message-success.json
|
122
|
+
- spec/helper.rb
|
123
|
+
- spec/lib/zulip/client/event_parser_spec.rb
|
124
|
+
- spec/lib/zulip/client/event_streaming_spec.rb
|
125
|
+
- spec/lib/zulip/client/messages_spec.rb
|
126
|
+
- spec/lib/zulip/client/queue_registration_spec.rb
|
127
|
+
- spec/lib/zulip/client/stream_subscriptions_spec.rb
|
128
|
+
- spec/lib/zulip/client/users_spec.rb
|
129
|
+
- spec/lib/zulip/client_spec.rb
|
130
|
+
- spec/lib/zulip/message_spec.rb
|
131
|
+
- spec/lib/zulip/stream_subscription_spec.rb
|
132
|
+
- spec/lib/zulip/user_spec.rb
|
133
|
+
- zulip-rb.gemspec
|
134
|
+
homepage: https://github.com/verg/zulip-rb
|
135
|
+
licenses:
|
136
|
+
- MIT
|
137
|
+
metadata: {}
|
138
|
+
post_install_message:
|
139
|
+
rdoc_options: []
|
140
|
+
require_paths:
|
141
|
+
- lib
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
requirements: []
|
153
|
+
rubyforge_project:
|
154
|
+
rubygems_version: 2.0.5
|
155
|
+
signing_key:
|
156
|
+
specification_version: 4
|
157
|
+
summary: A ruby wrapper for the Zulip API.
|
158
|
+
test_files:
|
159
|
+
- spec/fixtures/add-subscription.json
|
160
|
+
- spec/fixtures/get-message-event-success.json
|
161
|
+
- spec/fixtures/get-private-message.json
|
162
|
+
- spec/fixtures/get-user-subscriptions.json
|
163
|
+
- spec/fixtures/get-users.json
|
164
|
+
- spec/fixtures/post-message-to-stream.json
|
165
|
+
- spec/fixtures/queue-registration-success.json
|
166
|
+
- spec/fixtures/sending-private-message-success.json
|
167
|
+
- spec/helper.rb
|
168
|
+
- spec/lib/zulip/client/event_parser_spec.rb
|
169
|
+
- spec/lib/zulip/client/event_streaming_spec.rb
|
170
|
+
- spec/lib/zulip/client/messages_spec.rb
|
171
|
+
- spec/lib/zulip/client/queue_registration_spec.rb
|
172
|
+
- spec/lib/zulip/client/stream_subscriptions_spec.rb
|
173
|
+
- spec/lib/zulip/client/users_spec.rb
|
174
|
+
- spec/lib/zulip/client_spec.rb
|
175
|
+
- spec/lib/zulip/message_spec.rb
|
176
|
+
- spec/lib/zulip/stream_subscription_spec.rb
|
177
|
+
- spec/lib/zulip/user_spec.rb
|