lita 4.3.2 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/lib/lita.rb +2 -1
- data/lib/lita/adapter.rb +22 -3
- data/lib/lita/adapters/shell.rb +21 -3
- data/lib/lita/config.rb +1 -0
- data/lib/lita/default_configuration.rb +3 -0
- data/lib/lita/logger.rb +2 -4
- data/lib/lita/response.rb +3 -3
- data/lib/lita/robot.rb +13 -1
- data/lib/lita/room.rb +113 -0
- data/lib/lita/source.rb +21 -7
- data/lib/lita/template_resolver.rb +1 -1
- data/lib/lita/user.rb +5 -3
- data/lib/lita/version.rb +1 -1
- data/spec/lita/adapter_spec.rb +1 -1
- data/spec/lita/adapters/shell_spec.rb +8 -0
- data/spec/lita/robot_spec.rb +40 -1
- data/spec/lita/room_spec.rb +134 -0
- data/spec/lita/source_spec.rb +39 -10
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9215364634b3989e49830b555b053790f05cea4
|
4
|
+
data.tar.gz: beb555742378d6644ae0f0f907d16e44051441ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5f9eff256a23b5e9888427f2f91cedc37e2560948db164b103a118da49cf8232f17dc1c8b0c96d05d9156da2af57a8bb040fa2c0ed9b57475b36e05007891da
|
7
|
+
data.tar.gz: a1258925bedd819e2af1e6742abb3b555b23e596829e7cfa4df5baa4bd6253488be406704054d24cc54d113b360a22cb9f21bf903e52bd9454a6eb7bc5ecd455
|
data/.travis.yml
CHANGED
data/lib/lita.rb
CHANGED
@@ -40,7 +40,7 @@ module Lita
|
|
40
40
|
# The global Logger object.
|
41
41
|
# @return [::Logger] The global Logger object.
|
42
42
|
def logger
|
43
|
-
@logger ||= Logger.get_logger(config.robot.log_level)
|
43
|
+
@logger ||= Logger.get_logger(config.robot.log_level, config.robot.log_formatter)
|
44
44
|
end
|
45
45
|
|
46
46
|
# The root Redis object.
|
@@ -103,6 +103,7 @@ require_relative "lita/handler/http_router"
|
|
103
103
|
require_relative "lita/handler/event_router"
|
104
104
|
require_relative "lita/handler"
|
105
105
|
require_relative "lita/user"
|
106
|
+
require_relative "lita/room"
|
106
107
|
require_relative "lita/source"
|
107
108
|
require_relative "lita/authorization"
|
108
109
|
require_relative "lita/message"
|
data/lib/lita/adapter.rb
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
module Lita
|
2
2
|
# Adapters are the glue between Lita's API and a chat service.
|
3
3
|
class Adapter
|
4
|
+
# The names of methods that should be implemented by an adapter.
|
5
|
+
# @since 4.4.0
|
6
|
+
REQUIRED_METHODS = %i(
|
7
|
+
join
|
8
|
+
part
|
9
|
+
roster
|
10
|
+
run
|
11
|
+
send_messages
|
12
|
+
set_topic
|
13
|
+
shut_down
|
14
|
+
).freeze
|
15
|
+
|
4
16
|
extend Namespace
|
5
17
|
extend Configurable
|
6
18
|
|
@@ -53,20 +65,27 @@ module Lita
|
|
53
65
|
robot.config.adapters.public_send(self.class.namespace)
|
54
66
|
end
|
55
67
|
|
56
|
-
# @!method join
|
68
|
+
# @!method join(room_id)
|
57
69
|
# Joins the room with the specified ID.
|
58
70
|
# @param room_id [String] The ID of the room.
|
59
71
|
# @return [void]
|
60
72
|
# @abstract This should be implemented by the adapter.
|
61
73
|
# @since 3.0.0
|
62
74
|
|
63
|
-
# @!method part
|
75
|
+
# @!method part(room_id)
|
64
76
|
# Parts from the room with the specified ID.
|
65
77
|
# @param room_id [String] The ID of the room.
|
66
78
|
# @return [void]
|
67
79
|
# @abstract This should be implemented by the adapter.
|
68
80
|
# @since 3.0.0
|
69
81
|
|
82
|
+
# @!method roster(room)
|
83
|
+
# Get a list of users that are online in the given room.
|
84
|
+
# @param room [Lita::Room] The room to return a roster for.
|
85
|
+
# @return [Array<Lita::Roster>] An array of users.
|
86
|
+
# @abstract This should be implemented by the adapter.
|
87
|
+
# @since 4.4.0
|
88
|
+
|
70
89
|
# @!method run
|
71
90
|
# The main loop. Should connect to the chat service, listen for incoming
|
72
91
|
# messages, create {Lita::Message} objects from them, and dispatch them to
|
@@ -92,7 +111,7 @@ module Lita
|
|
92
111
|
# Performs any clean up necessary when disconnecting from the chat service.
|
93
112
|
# @return [void]
|
94
113
|
# @abstract This should be implemented by the adapter.
|
95
|
-
|
114
|
+
REQUIRED_METHODS.each do |method|
|
96
115
|
define_method(method) do |*_args|
|
97
116
|
Lita.logger.warn(I18n.t("lita.adapter.method_not_implemented", method: method))
|
98
117
|
end
|
data/lib/lita/adapters/shell.rb
CHANGED
@@ -5,11 +5,27 @@ module Lita
|
|
5
5
|
class Shell < Adapter
|
6
6
|
config :private_chat, default: false
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
def initialize(robot)
|
9
|
+
super
|
10
|
+
|
11
|
+
self.user = User.create(1, name: "Shell User")
|
12
|
+
end
|
13
|
+
|
14
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
15
|
+
|
16
|
+
# Returns the users in the room, which is only ever the "Shell User."
|
17
|
+
# @param room [Lita::Room] The room to return a roster for. Not used in this adapter.
|
18
|
+
# @return [Array<Lita::User>] The users in the room.
|
19
|
+
# @since 4.4.0
|
20
|
+
def roster(room)
|
21
|
+
[user]
|
22
|
+
end
|
23
|
+
|
24
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
25
|
+
|
26
|
+
# Displays a prompt and requests input in a loop, passing the incoming messages to the robot.
|
10
27
|
# @return [void]
|
11
28
|
def run
|
12
|
-
user = User.create(1, name: "Shell User")
|
13
29
|
room = robot.config.adapters.shell.private_chat ? nil : "shell"
|
14
30
|
@source = Source.new(user: user, room: room)
|
15
31
|
puts t("startup_message")
|
@@ -40,6 +56,8 @@ module Lita
|
|
40
56
|
|
41
57
|
private
|
42
58
|
|
59
|
+
attr_accessor :user
|
60
|
+
|
43
61
|
def build_message(input, source)
|
44
62
|
message = Message.new(robot, input, source)
|
45
63
|
message.command! if robot.config.adapters.shell.private_chat
|
data/lib/lita/config.rb
CHANGED
@@ -138,6 +138,9 @@ module Lita
|
|
138
138
|
end
|
139
139
|
end
|
140
140
|
end
|
141
|
+
config :log_formatter, type: Proc, default: (lambda do |severity, datetime, _progname, msg|
|
142
|
+
"[#{datetime.utc}] #{severity}: #{msg}\n"
|
143
|
+
end)
|
141
144
|
config :admins
|
142
145
|
config :error_handler, default: -> (_error) {} do
|
143
146
|
validate do |value|
|
data/lib/lita/logger.rb
CHANGED
@@ -6,12 +6,10 @@ module Lita
|
|
6
6
|
# severity level and a custom format.
|
7
7
|
# @param level [Symbol, String] The name of the log level to use.
|
8
8
|
# @return [::Logger] The {::Logger} object.
|
9
|
-
def get_logger(level)
|
9
|
+
def get_logger(level, formatter = Lita.config.robot.log_formatter)
|
10
10
|
logger = ::Logger.new(STDERR)
|
11
11
|
logger.level = get_level_constant(level)
|
12
|
-
logger.formatter =
|
13
|
-
"[#{datetime.utc}] #{severity}: #{msg}\n"
|
14
|
-
end
|
12
|
+
logger.formatter = formatter
|
15
13
|
logger
|
16
14
|
end
|
17
15
|
|
data/lib/lita/response.rb
CHANGED
@@ -19,11 +19,11 @@ module Lita
|
|
19
19
|
|
20
20
|
# @!method args
|
21
21
|
# @see Lita::Message#args
|
22
|
-
# @!method reply
|
22
|
+
# @!method reply(*strings)
|
23
23
|
# @see Lita::Message#reply
|
24
|
-
# @!method reply_privately
|
24
|
+
# @!method reply_privately(*strings)
|
25
25
|
# @see Lita::Message#reply_privately
|
26
|
-
# @!method reply_with_mention
|
26
|
+
# @!method reply_with_mention(*strings)
|
27
27
|
# @see Lita::Message#reply_with_mention
|
28
28
|
# @!method user
|
29
29
|
# @see Lita::Message#user
|
data/lib/lita/robot.rb
CHANGED
@@ -36,6 +36,11 @@ module Lita
|
|
36
36
|
|
37
37
|
def_delegators :registry, :config, :adapters, :handlers, :hooks
|
38
38
|
|
39
|
+
# @!method mention_format(name)
|
40
|
+
# @see Lita::Adapter#mention_format
|
41
|
+
# @since 4.4.0
|
42
|
+
def_delegators :adapter, :mention_format
|
43
|
+
|
39
44
|
# @param registry [Lita::Registry] The registry for the robot's configuration and plugins.
|
40
45
|
def initialize(registry = Lita)
|
41
46
|
@registry = registry
|
@@ -44,7 +49,7 @@ module Lita
|
|
44
49
|
@alias = config.robot.alias
|
45
50
|
@app = RackApp.build(self)
|
46
51
|
@auth = Authorization.new(config)
|
47
|
-
trigger(:loaded)
|
52
|
+
trigger(:loaded, room_ids: persisted_rooms)
|
48
53
|
end
|
49
54
|
|
50
55
|
# The primary entry point from the adapter for an incoming message.
|
@@ -76,6 +81,7 @@ module Lita
|
|
76
81
|
# @return [void]
|
77
82
|
# @since 3.0.0
|
78
83
|
def join(room_id)
|
84
|
+
Lita.redis.sadd("persisted_rooms", room_id)
|
79
85
|
adapter.join(room_id)
|
80
86
|
end
|
81
87
|
|
@@ -84,6 +90,7 @@ module Lita
|
|
84
90
|
# @return [void]
|
85
91
|
# @since 3.0.0
|
86
92
|
def part(room_id)
|
93
|
+
Lita.redis.srem("persisted_rooms", room_id)
|
87
94
|
adapter.part(room_id)
|
88
95
|
end
|
89
96
|
|
@@ -172,6 +179,11 @@ module Lita
|
|
172
179
|
adapter_class.new(self)
|
173
180
|
end
|
174
181
|
|
182
|
+
# A list of room IDs the robot should join.
|
183
|
+
def persisted_rooms
|
184
|
+
Lita.redis.smembers("persisted_rooms").sort
|
185
|
+
end
|
186
|
+
|
175
187
|
# Starts the web server.
|
176
188
|
def run_app
|
177
189
|
http_config = config.http
|
data/lib/lita/room.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
module Lita
|
2
|
+
# A room in the chat service. Persisted in Redis.
|
3
|
+
# @since 4.4.0
|
4
|
+
class Room
|
5
|
+
class << self
|
6
|
+
# Creates a new room with the given ID, or merges and saves supplied
|
7
|
+
# metadata to a room with the given ID.
|
8
|
+
# @param id [Integer, String] A unique identifier for the room.
|
9
|
+
# @param metadata [Hash] An optional hash of metadata about the room.
|
10
|
+
# @option metadata [String] name (id) The display name of the room.
|
11
|
+
# @return [Lita::Room] The room.
|
12
|
+
def create_or_update(id, metadata = {})
|
13
|
+
existing_room = find_by_id(id)
|
14
|
+
metadata = Util.stringify_keys(metadata)
|
15
|
+
metadata = existing_room.metadata.merge(metadata) if existing_room
|
16
|
+
room = new(id, metadata)
|
17
|
+
room.save
|
18
|
+
room
|
19
|
+
end
|
20
|
+
|
21
|
+
# Finds a room by ID.
|
22
|
+
# @param id [Integer, String] The room's unique ID.
|
23
|
+
# @return [Lita::Room, nil] The room or +nil+ if no such room is known.
|
24
|
+
def find_by_id(id)
|
25
|
+
metadata = redis.hgetall("id:#{id}")
|
26
|
+
new(id, metadata) if metadata.key?("name")
|
27
|
+
end
|
28
|
+
|
29
|
+
# Finds a room by display name.
|
30
|
+
# @param name [String] The room's name.
|
31
|
+
# @return [Lita::Room, nil] The room or +nil+ if no such room is known.
|
32
|
+
def find_by_name(name)
|
33
|
+
id = redis.get("name:#{name}")
|
34
|
+
find_by_id(id) if id
|
35
|
+
end
|
36
|
+
|
37
|
+
# Finds a room by ID or name
|
38
|
+
# @param identifier [Integer, String] The room's ID or name.
|
39
|
+
# @return [Lita::Room, nil] The room or +nil+ if no room was found.
|
40
|
+
def fuzzy_find(identifier)
|
41
|
+
find_by_id(identifier) || find_by_name(identifier)
|
42
|
+
end
|
43
|
+
|
44
|
+
# The +Redis::Namespace+ for room persistence.
|
45
|
+
# @return [Redis::Namespace] The Redis connection.
|
46
|
+
def redis
|
47
|
+
@redis ||= Redis::Namespace.new("rooms", redis: Lita.redis)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# The room's unique ID.
|
52
|
+
# @return [String] The room's ID.
|
53
|
+
attr_reader :id
|
54
|
+
|
55
|
+
# A hash of arbitrary metadata about the room.
|
56
|
+
# @return [Hash] The room's metadata.
|
57
|
+
attr_reader :metadata
|
58
|
+
|
59
|
+
# The room's name as displayed in a standard user interface.
|
60
|
+
# @return [String] The room's name.
|
61
|
+
attr_reader :name
|
62
|
+
|
63
|
+
# @param id [Integer, String] The room's unique ID.
|
64
|
+
# @param metadata [Hash] Arbitrary room metadata.
|
65
|
+
# @option metadata [String] name (id) The room's display name.
|
66
|
+
def initialize(id, metadata = {})
|
67
|
+
@id = id.to_s
|
68
|
+
@metadata = Util.stringify_keys(metadata)
|
69
|
+
@name = @metadata["name"] || @id
|
70
|
+
end
|
71
|
+
|
72
|
+
# Compares the room against another room object to determine equality. Rooms
|
73
|
+
# are considered equal if they have the same ID.
|
74
|
+
# @param other (Lita::Room) The room to compare against.
|
75
|
+
# @return [Boolean] True if rooms are equal, false otherwise.
|
76
|
+
def ==(other)
|
77
|
+
other.respond_to?(:id) && id == other.id
|
78
|
+
end
|
79
|
+
alias_method :eql?, :==
|
80
|
+
|
81
|
+
# Generates a +Fixnum+ hash value for this user object. Implemented to support equality.
|
82
|
+
# @return [Fixnum] The hash value.
|
83
|
+
# @see Object#hash
|
84
|
+
def hash
|
85
|
+
id.hash
|
86
|
+
end
|
87
|
+
|
88
|
+
# Saves the room record to Redis, overwriting any previous data for the current ID.
|
89
|
+
# @return [void]
|
90
|
+
def save
|
91
|
+
ensure_name_metadata_set
|
92
|
+
|
93
|
+
redis.pipelined do
|
94
|
+
redis.hmset("id:#{id}", *metadata.to_a.flatten)
|
95
|
+
redis.set("name:#{name}", id)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
# Ensure the room's metadata contains its name, to ensure their Redis hash contains at least
|
102
|
+
# one value. It's not possible to store an empty hash key in Redis.
|
103
|
+
def ensure_name_metadata_set
|
104
|
+
room_name = metadata.delete("name")
|
105
|
+
metadata["name"] = room_name || id
|
106
|
+
end
|
107
|
+
|
108
|
+
# The Redis connection for room persistence.
|
109
|
+
def redis
|
110
|
+
self.class.redis
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
data/lib/lita/source.rb
CHANGED
@@ -12,24 +12,38 @@ module Lita
|
|
12
12
|
attr_reader :private_message
|
13
13
|
alias_method :private_message?, :private_message
|
14
14
|
|
15
|
-
# The room the message came from or should be sent to.
|
16
|
-
# @return [String] A string uniquely identifying the room.
|
15
|
+
# The room the message came from or should be sent to, as a string.
|
16
|
+
# @return [String, NilClass] A string uniquely identifying the room.
|
17
17
|
attr_reader :room
|
18
18
|
|
19
|
+
# The room the message came from or should be sent to, as a {Lita::Room} object.
|
20
|
+
# @return [Lita::Room, NilClass] The room.
|
21
|
+
# @since 4.4.0
|
22
|
+
attr_reader :room_object
|
23
|
+
|
19
24
|
# The user who sent the message or should receive the outgoing message.
|
20
|
-
# @return [Lita::User] The user.
|
25
|
+
# @return [Lita::User, NilClass] The user.
|
21
26
|
attr_reader :user
|
22
27
|
|
23
28
|
# @param user [Lita::User] The user who sent the message or should receive
|
24
29
|
# the outgoing message.
|
25
|
-
# @param room [String] A string uniquely identifying the room
|
26
|
-
# the message from, or the room where a reply should go. The format of
|
27
|
-
#
|
30
|
+
# @param room [Lita::Room, String] A string or {Lita::Room} uniquely identifying the room
|
31
|
+
# the user sent the message from, or the room where a reply should go. The format of this
|
32
|
+
# string (or the ID of the {Lita::Room} object) will differ depending on the chat service.
|
28
33
|
# @param private_message [Boolean] A flag indicating whether or not the
|
29
34
|
# message was sent privately.
|
30
35
|
def initialize(user: nil, room: nil, private_message: false)
|
31
36
|
@user = user
|
32
|
-
|
37
|
+
|
38
|
+
case room
|
39
|
+
when String
|
40
|
+
@room = room
|
41
|
+
@room_object = Room.new(room)
|
42
|
+
when Room
|
43
|
+
@room = room.id
|
44
|
+
@room_object = room
|
45
|
+
end
|
46
|
+
|
33
47
|
@private_message = private_message
|
34
48
|
|
35
49
|
raise ArgumentError, I18n.t("lita.source.user_or_room_required") if user.nil? && room.nil?
|
@@ -14,7 +14,7 @@ module Lita
|
|
14
14
|
|
15
15
|
# Returns the adapter-specific template, falling back to a generic template.
|
16
16
|
# @return [String] The path of the template to use.
|
17
|
-
# @
|
17
|
+
# @raise [MissingTemplateError] If no templates with the given name exist.
|
18
18
|
def resolve
|
19
19
|
return adapter_template if File.exist?(adapter_template)
|
20
20
|
return generic_template if File.exist?(generic_template)
|
data/lib/lita/user.rb
CHANGED
@@ -100,7 +100,7 @@ module Lita
|
|
100
100
|
metadata["mention_name"] || name
|
101
101
|
end
|
102
102
|
|
103
|
-
# Saves the user record to Redis, overwriting
|
103
|
+
# Saves the user record to Redis, overwriting any previous data for the
|
104
104
|
# current ID and user name.
|
105
105
|
# @return [void]
|
106
106
|
def save
|
@@ -122,9 +122,11 @@ module Lita
|
|
122
122
|
end
|
123
123
|
alias_method :eql?, :==
|
124
124
|
|
125
|
+
# Generates a +Fixnum+ hash value for this user object. Implemented to support equality.
|
126
|
+
# @return [Fixnum] The hash value.
|
127
|
+
# @see Object#hash
|
125
128
|
def hash
|
126
|
-
id.hash ^
|
127
|
-
name.hash
|
129
|
+
id.hash ^ name.hash
|
128
130
|
end
|
129
131
|
|
130
132
|
private
|
data/lib/lita/version.rb
CHANGED
data/spec/lita/adapter_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
describe Lita::Adapter, lita: true do
|
4
4
|
let(:robot) { Lita::Robot.new(registry) }
|
5
5
|
|
6
|
-
let(:required_methods) {
|
6
|
+
let(:required_methods) { described_class::REQUIRED_METHODS }
|
7
7
|
|
8
8
|
subject { described_class.new(robot) }
|
9
9
|
|
@@ -13,6 +13,14 @@ describe Lita::Adapters::Shell, lita: true do
|
|
13
13
|
|
14
14
|
subject { described_class.new(robot) }
|
15
15
|
|
16
|
+
describe "#roster" do
|
17
|
+
let(:room) { instance_double("Lita::Room") }
|
18
|
+
|
19
|
+
it "returns the shell user" do
|
20
|
+
expect(subject.roster(room).first.name).to eq("Shell User")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
16
24
|
describe "#run" do
|
17
25
|
let(:user) { Lita::User.create(1, name: "Shell User") }
|
18
26
|
|
data/spec/lita/robot_spec.rb
CHANGED
@@ -6,10 +6,22 @@ describe Lita::Robot, lita: true do
|
|
6
6
|
before { registry.register_adapter(:shell, Lita::Adapters::Shell) }
|
7
7
|
|
8
8
|
it "triggers a loaded event after initialization" do
|
9
|
-
expect_any_instance_of(described_class).to receive(:trigger).with(:loaded)
|
9
|
+
expect_any_instance_of(described_class).to receive(:trigger).with(:loaded, room_ids: [])
|
10
10
|
subject
|
11
11
|
end
|
12
12
|
|
13
|
+
context "when there are previously persisted rooms" do
|
14
|
+
before { %w(#foo #bar).each { |id| Lita.redis.sadd("persisted_rooms", id) } }
|
15
|
+
|
16
|
+
it "receives the room_ids in the payload" do
|
17
|
+
expect_any_instance_of(described_class).to receive(:trigger).with(
|
18
|
+
:loaded,
|
19
|
+
room_ids: %w(#foo #bar).sort,
|
20
|
+
)
|
21
|
+
subject
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
13
25
|
it "can have its name changed" do
|
14
26
|
subject.name = "Bongo"
|
15
27
|
|
@@ -22,6 +34,10 @@ describe Lita::Robot, lita: true do
|
|
22
34
|
expect(subject.mention_name).to eq("wongo")
|
23
35
|
end
|
24
36
|
|
37
|
+
it "exposes Adapter#mention_format" do
|
38
|
+
expect(subject.mention_format(subject.mention_name)).to eq("Lita:")
|
39
|
+
end
|
40
|
+
|
25
41
|
context "with registered handlers" do
|
26
42
|
let(:handler1) { Class.new(Lita::Handler) { namespace :test } }
|
27
43
|
let(:handler2) { Class.new(Lita::Handler) { namespace :test } }
|
@@ -102,17 +118,40 @@ describe Lita::Robot, lita: true do
|
|
102
118
|
end
|
103
119
|
|
104
120
|
describe "#join" do
|
121
|
+
before do
|
122
|
+
allow_any_instance_of(Lita::Adapters::Shell).to receive(:join)
|
123
|
+
end
|
124
|
+
|
105
125
|
it "delegates to the adapter" do
|
106
126
|
expect_any_instance_of(Lita::Adapters::Shell).to receive(:join).with("#lita.io")
|
107
127
|
subject.join("#lita.io")
|
108
128
|
end
|
129
|
+
|
130
|
+
it "adds the room ID to the persisted list" do
|
131
|
+
subject.join("#lita.io")
|
132
|
+
|
133
|
+
expect(Lita.redis.smembers("persisted_rooms")).to include("#lita.io")
|
134
|
+
end
|
109
135
|
end
|
110
136
|
|
111
137
|
describe "#part" do
|
138
|
+
before do
|
139
|
+
allow_any_instance_of(Lita::Adapters::Shell).to receive(:join)
|
140
|
+
allow_any_instance_of(Lita::Adapters::Shell).to receive(:part)
|
141
|
+
end
|
142
|
+
|
112
143
|
it "delegates to the adapter" do
|
113
144
|
expect_any_instance_of(Lita::Adapters::Shell).to receive(:part).with("#lita.io")
|
114
145
|
subject.part("#lita.io")
|
115
146
|
end
|
147
|
+
|
148
|
+
it "removes the room ID from the persisted list" do
|
149
|
+
subject.join("#lita.io")
|
150
|
+
|
151
|
+
subject.part("#lita.io")
|
152
|
+
|
153
|
+
expect(Lita.redis.smembers("persisted_rooms")).not_to include("#lita.io")
|
154
|
+
end
|
116
155
|
end
|
117
156
|
|
118
157
|
describe "#send_message" do
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Room, lita: true do
|
4
|
+
describe ".create_or_update" do
|
5
|
+
subject { described_class.find_by_id(1) }
|
6
|
+
|
7
|
+
context "when no room with the given ID already exists" do
|
8
|
+
it "creates the room" do
|
9
|
+
described_class.create_or_update(1, name: "foo")
|
10
|
+
|
11
|
+
expect(subject.name).to eq("foo")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when a room with the given ID already exists" do
|
16
|
+
before { described_class.create_or_update(1, name: "foo") }
|
17
|
+
|
18
|
+
it "merges in new metadata" do
|
19
|
+
described_class.create_or_update(1, foo: "bar")
|
20
|
+
|
21
|
+
expect(subject.name).to eq("foo")
|
22
|
+
expect(subject.metadata["foo"]).to eq("bar")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe ".find_by_id" do
|
28
|
+
context "when a matching room exists" do
|
29
|
+
before { described_class.new(1).save }
|
30
|
+
|
31
|
+
it "is found by ID" do
|
32
|
+
expect(described_class.find_by_id(1).id).to eq("1")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when no matching room exists" do
|
37
|
+
it "is not found" do
|
38
|
+
expect(described_class.find_by_id(1)).to be_nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe ".find_by_name" do
|
44
|
+
context "when a matching room exists" do
|
45
|
+
before { described_class.new(1, name: "foo").save }
|
46
|
+
|
47
|
+
it "is found by name" do
|
48
|
+
expect(described_class.find_by_name("foo").id).to eq("1")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when no matching room exists" do
|
53
|
+
it "is not found" do
|
54
|
+
expect(described_class.find_by_name("foo")).to be_nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe ".fuzzy_find" do
|
60
|
+
context "when a matching room exists" do
|
61
|
+
before { described_class.new(1, name: "foo").save }
|
62
|
+
|
63
|
+
it "is found by ID" do
|
64
|
+
expect(described_class.fuzzy_find(1).id).to eq("1")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "is found by name" do
|
68
|
+
expect(described_class.fuzzy_find("foo").id).to eq("1")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when no matching room exists" do
|
73
|
+
it "is not found by ID" do
|
74
|
+
expect(described_class.fuzzy_find(1)).to be_nil
|
75
|
+
end
|
76
|
+
|
77
|
+
it "is not found by name" do
|
78
|
+
expect(described_class.fuzzy_find("foo")).to be_nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context "with only an ID" do
|
84
|
+
subject { described_class.new(1) }
|
85
|
+
|
86
|
+
it "has a string ID" do
|
87
|
+
expect(subject.id).to eq("1")
|
88
|
+
end
|
89
|
+
|
90
|
+
it "is named with its ID" do
|
91
|
+
expect(subject.name).to eq("1")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "with metadata" do
|
96
|
+
subject { described_class.new(1, foo: :bar) }
|
97
|
+
|
98
|
+
it "stores the metadata with string keys" do
|
99
|
+
expect(subject.metadata["foo"]).to eq(:bar)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#==" do
|
104
|
+
subject { described_class.new(1) }
|
105
|
+
|
106
|
+
context "when the other room has the same ID" do
|
107
|
+
let(:other) { described_class.new(1) }
|
108
|
+
|
109
|
+
it "is equal" do
|
110
|
+
expect(subject).to eq(other)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "when the other room has a different ID" do
|
115
|
+
let(:other) { described_class.new(2) }
|
116
|
+
|
117
|
+
it "is not equal" do
|
118
|
+
expect(subject).not_to eq(other)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "#save" do
|
124
|
+
context "with metadata not including name" do
|
125
|
+
subject { described_class.new(1, {}) }
|
126
|
+
|
127
|
+
it "adds the name to the metadata" do
|
128
|
+
subject.save
|
129
|
+
|
130
|
+
expect(subject.metadata["name"]).to eq("1")
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
data/spec/lita/source_spec.rb
CHANGED
@@ -1,27 +1,56 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe Lita::Source do
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
subject { described_class.new(user: user, room: room, private_message: pm) }
|
5
|
+
|
6
|
+
let(:pm) { false }
|
7
|
+
let(:room) { Lita::Room.new(1) }
|
8
|
+
let(:user) { Lita::User.new(1) }
|
9
|
+
|
10
|
+
describe "#room" do
|
11
|
+
it "returns the room as a string" do
|
12
|
+
expect(subject.room).to eq("1")
|
13
|
+
end
|
7
14
|
end
|
8
15
|
|
9
|
-
|
10
|
-
|
11
|
-
|
16
|
+
describe "#room_object" do
|
17
|
+
it "returns the room as a Lita::Room" do
|
18
|
+
expect(subject.room_object).to eq(room)
|
19
|
+
end
|
12
20
|
end
|
13
21
|
|
14
|
-
|
15
|
-
|
16
|
-
|
22
|
+
describe "#user" do
|
23
|
+
it "returns the user object" do
|
24
|
+
expect(subject.user).to eq(user)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when the private_message argument is true" do
|
29
|
+
let(:pm) { true }
|
30
|
+
|
31
|
+
it "is marked as a private message" do
|
32
|
+
expect(subject).to be_a_private_message
|
33
|
+
end
|
17
34
|
end
|
18
35
|
|
19
36
|
it "can be manually marked as private" do
|
20
|
-
subject = described_class.new(user: "Carl", room: "#litabot")
|
21
37
|
subject.private_message!
|
38
|
+
|
22
39
|
expect(subject).to be_a_private_message
|
23
40
|
end
|
24
41
|
|
42
|
+
context "with a string for the room argument" do
|
43
|
+
let(:room) { "#channel" }
|
44
|
+
|
45
|
+
it "sets #room to the string" do
|
46
|
+
expect(subject.room).to eq(room)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "sets #room_object to a Lita::Room with the string as its ID" do
|
50
|
+
expect(subject.room_object).to eq(Lita::Room.new(room))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
25
54
|
it "requires either a user or a room" do
|
26
55
|
expect { described_class.new }.to raise_error(ArgumentError)
|
27
56
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jimmy Cuadra
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -315,6 +315,7 @@ files:
|
|
315
315
|
- lib/lita/registry.rb
|
316
316
|
- lib/lita/response.rb
|
317
317
|
- lib/lita/robot.rb
|
318
|
+
- lib/lita/room.rb
|
318
319
|
- lib/lita/route_validator.rb
|
319
320
|
- lib/lita/rspec.rb
|
320
321
|
- lib/lita/rspec/handler.rb
|
@@ -354,6 +355,7 @@ files:
|
|
354
355
|
- spec/lita/plugin_builder_spec.rb
|
355
356
|
- spec/lita/response_spec.rb
|
356
357
|
- spec/lita/robot_spec.rb
|
358
|
+
- spec/lita/room_spec.rb
|
357
359
|
- spec/lita/rspec/handler_spec.rb
|
358
360
|
- spec/lita/rspec_spec.rb
|
359
361
|
- spec/lita/source_spec.rb
|
@@ -431,6 +433,7 @@ test_files:
|
|
431
433
|
- spec/lita/plugin_builder_spec.rb
|
432
434
|
- spec/lita/response_spec.rb
|
433
435
|
- spec/lita/robot_spec.rb
|
436
|
+
- spec/lita/room_spec.rb
|
434
437
|
- spec/lita/rspec/handler_spec.rb
|
435
438
|
- spec/lita/rspec_spec.rb
|
436
439
|
- spec/lita/source_spec.rb
|