the86-client 1.1.0 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,10 +10,12 @@
10
10
  can_be_hidden
11
11
  access_token
12
12
  user
13
- site
13
+ group
14
14
  post
15
15
  conversation
16
16
  like
17
+ metadatum
18
+ metadatum/conversation_metadatum
17
19
  }.each { |r| require "the86-client/#{r}" }
18
20
 
19
21
  module The86
@@ -21,17 +23,17 @@ module The86
21
23
 
22
24
  # API entry points.
23
25
 
24
- def self.sites
26
+ def self.groups
25
27
  ResourceCollection.new(
26
28
  Connection.new,
27
- "sites",
28
- Site,
29
+ "groups",
30
+ Group,
29
31
  nil
30
32
  )
31
33
  end
32
34
 
33
- def self.site(slug)
34
- Site.new(slug: slug)
35
+ def self.group(slug)
36
+ Group.new(slug: slug)
35
37
  end
36
38
 
37
39
  def self.users
@@ -13,7 +13,7 @@ module The86::Client
13
13
 
14
14
  def set_hidden(hidden, attributes)
15
15
  self.oauth_token = attributes[:oauth_token]
16
- key = oauth_token ? :hidden_by_user : :hidden_by_site
16
+ key = oauth_token ? :hidden_by_user : :hidden_by_group
17
17
  patch(key => hidden)
18
18
  end
19
19
 
@@ -13,9 +13,16 @@ module The86
13
13
  def faraday_adapter
14
14
  @faraday_adapter || Faraday.default_adapter
15
15
  end
16
+
16
17
  end
17
18
 
19
+ attr_accessor :timeout, :open_timeout
20
+
18
21
  def initialize
22
+ # Default some basic connection options
23
+ @timeout = 15 #seconds
24
+ @open_timeout = 3 #seconds
25
+
19
26
  @faraday = Faraday.new(url) do |conn|
20
27
  conn.request :json
21
28
  conn.response :json
@@ -43,6 +50,10 @@ module The86
43
50
  def post(options)
44
51
  dispatch(:post, options)
45
52
  end
53
+
54
+ def delete(options)
55
+ dispatch(:delete, options)
56
+ end
46
57
 
47
58
  private
48
59
 
@@ -61,7 +72,10 @@ module The86
61
72
  end
62
73
 
63
74
  headers = @faraday.headers.merge(options[:headers] || {})
64
- response = @faraday.run_request(method, path, data, headers)
75
+ response = @faraday.run_request(method, path, data, headers) do |req|
76
+ req.options[:timeout] = @timeout
77
+ req.options[:open_timeout] = @open_timeout
78
+ end
65
79
 
66
80
  assert_http_status(response, options[:status])
67
81
 
@@ -5,13 +5,36 @@ module The86::Client
5
5
  attribute :content, String # For creating new Conversation.
6
6
  attribute :bumped_at, DateTime
7
7
  attribute :created_at, DateTime
8
+ attribute :original_created_at, DateTime
8
9
  attribute :updated_at, DateTime
9
10
 
10
11
  path "conversations"
11
- belongs_to :site
12
+ belongs_to :group
12
13
  has_many :posts, ->{ Post }
14
+ has_many :metadata, ->{ ConversationMetadatum }
15
+
16
+ accepts_nested_attributes_for :metadata
13
17
 
14
18
  include CanBeHidden
15
19
 
20
+ def mute(attributes={})
21
+ unless attributes[:oauth_token]
22
+ raise Error, "Conversations must be hidden by a user"
23
+ end
24
+ self.oauth_token = attributes[:oauth_token]
25
+ connection.post(
26
+ path: resource_path << "/mute",
27
+ data: sendable_attributes,
28
+ status: 200
29
+ ).data
30
+ end
31
+
32
+ def set_metadata(attributes={})
33
+ connection.patch(
34
+ path: resource_path << "/metadata",
35
+ data: attributes,
36
+ status: 204
37
+ )
38
+ end
16
39
  end
17
40
  end
@@ -1,5 +1,5 @@
1
1
  module The86::Client
2
- class Site < Resource
2
+ class Group < Resource
3
3
 
4
4
  attribute :id, Integer
5
5
  attribute :name, String
@@ -7,7 +7,7 @@ module The86::Client
7
7
  attribute :created_at, DateTime
8
8
  attribute :updated_at, DateTime
9
9
 
10
- path "sites"
10
+ path "groups"
11
11
  has_many :conversations, ->{ Conversation }
12
12
 
13
13
  def url_id
@@ -0,0 +1,11 @@
1
+ module The86::Client
2
+ class Metadatum < Resource
3
+
4
+ attribute :id, Integer
5
+ attribute :key, String
6
+ attribute :value, String
7
+ attribute :created_at, DateTime
8
+ attribute :updated_at, DateTime
9
+
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ module The86::Client
2
+ class ConversationMetadatum < Metadatum
3
+
4
+ belongs_to :conversation
5
+ path "metadata"
6
+
7
+ end
8
+ end
@@ -5,7 +5,9 @@ module The86::Client
5
5
  attribute :content, String
6
6
  attribute :content_html, String
7
7
  attribute :in_reply_to_id, Integer
8
+ attribute :is_original, Boolean
8
9
  attribute :created_at, DateTime
10
+ attribute :original_created_at, DateTime
9
11
  attribute :updated_at, DateTime
10
12
 
11
13
  path "posts"
@@ -23,7 +23,7 @@ module The86
23
23
  end
24
24
 
25
25
  # The name of the parent resource attribute.
26
- # e.g: belongs_to :site
26
+ # e.g: belongs_to :group
27
27
  def belongs_to(name)
28
28
  alias_method "#{name}=", :parent=
29
29
  alias_method name, :parent
@@ -48,6 +48,11 @@ module The86
48
48
  end
49
49
  end
50
50
 
51
+ # Allow nested attribute creation
52
+ def accepts_nested_attributes_for(name)
53
+ attribute name, Array
54
+ end
55
+
51
56
  end
52
57
 
53
58
  ##
@@ -70,6 +75,14 @@ module The86
70
75
  "%s/%s" % [ self.class.collection_path(@parent), url_id ]
71
76
  end
72
77
 
78
+ # TODO: The parent resource should be appropriately updated that the resource no longer exists
79
+ def delete!
80
+ connection.delete(
81
+ path: resource_path,
82
+ status: 204
83
+ ).data
84
+ end
85
+
73
86
  def save
74
87
  id ? save_existing : save_new
75
88
  end
@@ -130,13 +143,18 @@ module The86
130
143
  end
131
144
 
132
145
  def has_many_reader(name, class_proc)
133
- klass = class_proc.call
134
- ResourceCollection.new(
135
- connection,
136
- klass.collection_path(self),
137
- class_proc.call,
138
- self,
139
- (@_has_many || {})[name] || nil
146
+ variable_name = "@_has_many_reader_#{name}"
147
+ instance_variable_get(variable_name) ||
148
+ instance_variable_set(variable_name, (
149
+ klass = class_proc.call
150
+ ResourceCollection.new(
151
+ connection,
152
+ klass.collection_path(self),
153
+ class_proc.call,
154
+ self,
155
+ (@_has_many || {})[name] || nil
156
+ )
157
+ )
140
158
  )
141
159
  rescue KeyError
142
160
  raise Error, "No reference to children :#{name}"
@@ -60,7 +60,7 @@ module The86::Client
60
60
  end
61
61
 
62
62
  # Load the next page of records, based on the pagination header, e.g.
63
- # Link: <http://example.org/api/v1/sites/a/conversations?bumped_before=time>; rel="next"
63
+ # Link: <http://example.org/api/v1/groups/a/conversations?bumped_before=time>; rel="next"
64
64
  def more
65
65
  if more?
66
66
  url = Addressable::URI.parse(http_response.links[:next])
@@ -93,6 +93,10 @@ module The86::Client
93
93
  to_a[index]
94
94
  end
95
95
 
96
+ def << record
97
+ (@records || []) << record
98
+ end
99
+
96
100
  private
97
101
 
98
102
  def http_response
@@ -1,5 +1,5 @@
1
1
  module The86
2
2
  module Client
3
- VERSION = "1.1.0"
3
+ VERSION = "1.3.2"
4
4
  end
5
5
  end
@@ -4,24 +4,24 @@ module The86::Client
4
4
 
5
5
  describe "Conversations" do
6
6
 
7
- let(:site) { The86::Client.site("test") }
8
- let(:site_url) { "https://example.org/api/v1/sites/test" }
9
- let(:conversations_url) { "#{site_url}/conversations" }
7
+ let(:group) { The86::Client.group("test") }
8
+ let(:group_url) { "https://example.org/api/v1/groups/test" }
9
+ let(:conversations_url) { "#{group_url}/conversations" }
10
10
 
11
11
  describe "listing conversations" do
12
- it "returns empty array for site without conversations" do
12
+ it "returns empty array for group without conversations" do
13
13
  expect_get_conversations(response_body: [])
14
- site.conversations.to_a.size.must_equal 0
14
+ group.conversations.to_a.size.must_equal 0
15
15
  end
16
16
 
17
17
  it "returns collection of conversations" do
18
18
  expect_get_conversations(response_body: [{id: 10}, {id: 12}])
19
- conversations = site.conversations
19
+ conversations = group.conversations
20
20
  conversations.to_a.size.must_equal 2
21
21
  c = conversations.first
22
22
  c.must_be_instance_of Conversation
23
23
  c.id.must_equal 10
24
- c.site.must_equal site
24
+ c.group.must_equal group
25
25
  end
26
26
 
27
27
  it "sends posts_since parameter" do
@@ -29,12 +29,12 @@ module The86::Client
29
29
  response_body: [{id: 10}, {id: 12}],
30
30
  parameters: {posts_since: "time"}
31
31
  )
32
- conversations = site.conversations.with_parameters(posts_since: "time")
32
+ conversations = group.conversations.with_parameters(posts_since: "time")
33
33
  conversations.to_a.size.must_equal 2
34
34
  c = conversations.first
35
35
  c.must_be_instance_of Conversation
36
36
  c.id.must_equal 10
37
- c.site.must_equal site
37
+ c.group.must_equal group
38
38
  end
39
39
 
40
40
  it "handles pagination headers" do
@@ -49,7 +49,7 @@ module The86::Client
49
49
  url: basic_auth_url(next_url),
50
50
  response_body: [{id: 3}, {id: 4}],
51
51
  )
52
- page1 = site.conversations.with_parameters(limit: 2)
52
+ page1 = group.conversations.with_parameters(limit: 2)
53
53
  page1.more?.must_equal true
54
54
 
55
55
  page2 = page1.more
@@ -74,9 +74,9 @@ module The86::Client
74
74
  )
75
75
 
76
76
  # Emulate parameters being serialized & stored for a later request.
77
- page1 = site.conversations.with_parameters(limit: 2)
77
+ page1 = group.conversations.with_parameters(limit: 2)
78
78
  parameters = JSON.parse(JSON.generate(page1.more.parameters))
79
- page2 = site.conversations.with_parameters(parameters)
79
+ page2 = group.conversations.with_parameters(parameters)
80
80
 
81
81
  parameters.must_equal("limit" => "2", "bumped_before" => "timestamp")
82
82
 
@@ -90,19 +90,22 @@ module The86::Client
90
90
 
91
91
  describe "creating conversations" do
92
92
  it "posts and returns a conversation with the first post content" do
93
+
94
+ c = group.conversations.build(
95
+ content: "A new conversation.",
96
+ oauth_token: "secrettoken",
97
+ )
98
+
93
99
  expect_request(
94
100
  url: conversations_url,
95
101
  method: :post,
96
102
  status: 201,
97
- request_body: {content: "A new conversation."},
103
+ request_body: {content: "A new conversation.", metadata: c.metadata.to_s},
98
104
  response_body: {id: 2, posts: [{id: 5, content: "A new conversation."}]},
99
105
  request_headers: {"Authorization" => "Bearer secrettoken"},
100
106
  )
101
107
 
102
- c = site.conversations.create(
103
- content: "A new conversation.",
104
- oauth_token: "secrettoken",
105
- )
108
+ c.save
106
109
 
107
110
  c.id.must_equal 2
108
111
  posts = c.posts
@@ -114,22 +117,22 @@ module The86::Client
114
117
  describe "finding a conversation" do
115
118
  it "gets the conversation, loads data into the resource" do
116
119
  expect_request(
117
- url: basic_auth_url("https://example.org/api/v1/sites/test/conversations/4"),
120
+ url: basic_auth_url("https://example.org/api/v1/groups/test/conversations/4"),
118
121
  method: :get,
119
122
  status: 200,
120
123
  response_body: {id: 4, posts: [{id: 8, content: "A post."}]},
121
124
  )
122
- c = site.conversations.find(4)
125
+ c = group.conversations.find(4)
123
126
  c.id.must_equal 4
124
127
  c.posts.first.content.must_equal "A post."
125
128
  end
126
129
  end
127
130
 
128
131
  describe "hiding and unhiding a conversation" do
129
- let(:conversation) { site.conversations.build(id: 2) }
132
+ let(:conversation) { group.conversations.build(id: 2) }
130
133
  let(:user_auth_url) { "#{conversations_url}/2" }
131
- let(:site_auth_url) { user_auth_url.sub("//", "//user:pass@") }
132
- let(:site_auth_url) { basic_auth_url(user_auth_url) }
134
+ let(:group_auth_url) { user_auth_url.sub("//", "//user:pass@") }
135
+ let(:group_auth_url) { basic_auth_url(user_auth_url) }
133
136
  let(:headers) { Hash.new }
134
137
  def expectation(url, hidden_param)
135
138
  {
@@ -142,11 +145,11 @@ module The86::Client
142
145
  }
143
146
  end
144
147
  describe "without oauth" do
145
- it "patches the conversation as hidden_by_site when no oauth_token" do
146
- expect_request(expectation(site_auth_url, hidden_by_site: true))
148
+ it "patches the conversation as hidden_by_group when no oauth_token" do
149
+ expect_request(expectation(group_auth_url, hidden_by_group: true))
147
150
  conversation.hide
148
151
 
149
- expect_request(expectation(site_auth_url, hidden_by_site: false))
152
+ expect_request(expectation(group_auth_url, hidden_by_group: false))
150
153
  conversation.unhide
151
154
  end
152
155
  end
@@ -162,6 +165,33 @@ module The86::Client
162
165
  end
163
166
  end
164
167
 
168
+ describe "muting a conversation" do
169
+ let(:conversation) { group.conversations.build(id: 2) }
170
+ describe "without oauth" do
171
+ it "raises an error" do
172
+ ->{ conversation.mute }.must_raise Error
173
+ end
174
+ end
175
+ describe "with oauth" do
176
+ def expectation(url, hidden_param={})
177
+ {
178
+ url: url,
179
+ method: :post,
180
+ status: 200,
181
+ request_body: hidden_param,
182
+ request_headers: headers,
183
+ response_body: {id: 2}.merge(hidden_param),
184
+ }
185
+ end
186
+ let(:mute_url) { "#{conversations_url}/2/mute" }
187
+ let(:headers) { {"Authorization" => "Bearer secret"} }
188
+ it "mutes the conversation" do
189
+ expect_request(expectation(mute_url))
190
+ conversation.mute(oauth_token: "secret")
191
+ end
192
+ end
193
+ end
194
+
165
195
  def expect_get_conversations(options)
166
196
  expect_request({
167
197
  url: basic_auth_url(conversations_url),
@@ -4,10 +4,10 @@ module The86::Client
4
4
 
5
5
  describe Like do
6
6
 
7
- let(:site) { The86::Client.site("test") }
8
- let(:site_url) { "https://example.org/api/v1/sites/test" }
9
- let(:post) { site.conversations.build(id: 1).posts.build(id: 2) }
10
- let(:likes_url) { "#{site_url}/conversations/1/posts/2/likes" }
7
+ let(:group) { The86::Client.group("test") }
8
+ let(:group_url) { "https://example.org/api/v1/groups/test" }
9
+ let(:post) { group.conversations.build(id: 1).posts.build(id: 2) }
10
+ let(:likes_url) { "#{group_url}/conversations/1/posts/2/likes" }
11
11
 
12
12
  it "POSTs a new Like" do
13
13
  expect_request(
@@ -0,0 +1,99 @@
1
+ require_relative "spec_helper"
2
+
3
+ module The86::Client
4
+
5
+ describe ConversationMetadatum do
6
+
7
+ let(:group) { The86::Client.group("test") }
8
+ let(:group_url) { "https://example.org/api/v1/groups/test" }
9
+ let(:conversation) { group.conversations.build(id: 1) }
10
+ let(:metadata_url) { "#{group_url}/conversations/1/metadata" }
11
+
12
+ it "POSTs a new metadatum" do
13
+ expect_request(
14
+ url: metadata_url,
15
+ method: :post,
16
+ status: 201,
17
+ request_body: { key: "foo", value: "bar" },
18
+ response_body: { key: "foo", value: "bar" },
19
+ request_headers: {"Authorization" => "Bearer secret"},
20
+ )
21
+
22
+ m = conversation.metadata.create(key: "foo", value: "bar", oauth_token: "secret")
23
+
24
+ m.must_be_instance_of ConversationMetadatum
25
+ m.key.must_equal "foo"
26
+ m.value.must_equal "bar"
27
+ end
28
+
29
+ it "GETs metadata" do
30
+ expect_request(
31
+ url: metadata_url.sub("//", "//user:pass@"),
32
+ method: :get,
33
+ status: 200,
34
+ response_body: [
35
+ { key: "tag", value: "foo" },
36
+ { key: "tag", value: "bar" },
37
+ ],
38
+ )
39
+
40
+ conversation.metadata.map(&:value).must_equal %w{ foo bar }
41
+ end
42
+
43
+ it "DELETEs a metadatum" do
44
+ metadata_auth_url = metadata_url.sub("//", "//user:pass@")
45
+
46
+ expect_request(
47
+ url: metadata_auth_url,
48
+ method: :get,
49
+ status: 200,
50
+ response_body: [
51
+ { id: "1", key: "tag", value: "foo" },
52
+ { id: "2", key: "tag", value: "bar" },
53
+ ],
54
+ )
55
+
56
+ m = conversation.metadata
57
+
58
+ expect_request(
59
+ url: "#{metadata_auth_url}/#{m.first.id}",
60
+ method: :delete,
61
+ status: 204)
62
+
63
+ m.first.delete!
64
+ end
65
+ end
66
+
67
+ describe Conversation do
68
+ let(:group) { The86::Client.group("test") }
69
+ let(:group_url) { "https://example.org/api/v1/groups/test" }
70
+ let(:conversation) { group.conversations.build(id: 1) }
71
+ let(:metadata_url) { "#{group_url}/conversations/1/metadata" }
72
+
73
+ it "PATCHes metadata for a given key" do
74
+ metadata_auth_url = metadata_url.sub("//", "//user:pass@")
75
+
76
+ expect_request(
77
+ url: metadata_auth_url,
78
+ method: :patch,
79
+ status: 204,
80
+ request_body: { key: ["a", "b", "c"] },
81
+ )
82
+
83
+ conversation.set_metadata({ key: ["a", "b", "c"]})
84
+ end
85
+
86
+ it "clears a key by sending an empty array" do
87
+ metadata_auth_url = metadata_url.sub("//", "//user:pass@")
88
+
89
+ expect_request(
90
+ url: metadata_auth_url,
91
+ method: :patch,
92
+ status: 204,
93
+ request_body: { key: [] },
94
+ )
95
+
96
+ conversation.set_metadata({key: []})
97
+ end
98
+ end
99
+ end
@@ -12,6 +12,15 @@ module The86::Client
12
12
  end
13
13
  end
14
14
 
15
+ describe "is_original?" do
16
+ it "is true when is_original is true" do
17
+ Post.new(is_original: true).is_original?.must_equal true
18
+ end
19
+ it "is false when is_original is false" do
20
+ Post.new(is_original: false).is_original?.must_equal false
21
+ end
22
+ end
23
+
15
24
  describe "#user" do
16
25
  let(:post) { Post.new(id: 1, user: {id: 2, name: "John Citizen"}) }
17
26
  it "returns instance of The86::Client::User" do
@@ -4,13 +4,13 @@ module The86::Client
4
4
 
5
5
  describe Post do
6
6
 
7
- let(:site) { The86::Client.site("test") }
8
- let(:conversation) { Conversation.new(id: 32, site: site) }
7
+ let(:group) { The86::Client.group("test") }
8
+ let(:conversation) { Conversation.new(id: 32, group: group) }
9
9
  let(:original_post) do
10
10
  Post.new(id: 64, conversation: conversation, content: "Hello!")
11
11
  end
12
- let(:site_url) { "https://example.org/api/v1/sites/test" }
13
- let(:conversation_url) { "#{site_url}/conversations/32" }
12
+ let(:group_url) { "https://example.org/api/v1/groups/test" }
13
+ let(:conversation_url) { "#{group_url}/conversations/32" }
14
14
  let(:posts_url) { "#{conversation_url}/posts" }
15
15
 
16
16
  describe "replying to a post" do
@@ -79,11 +79,11 @@ module The86::Client
79
79
  }
80
80
  end
81
81
  describe "without oauth" do
82
- it "patches the post as hidden_by_site when no oauth_token" do
83
- expect_request(expectation(basic_auth_url, hidden_by_site: true))
82
+ it "patches the post as hidden_by_group when no oauth_token" do
83
+ expect_request(expectation(basic_auth_url, hidden_by_group: true))
84
84
  post.hide
85
85
 
86
- expect_request(expectation(basic_auth_url, hidden_by_site: false))
86
+ expect_request(expectation(basic_auth_url, hidden_by_group: false))
87
87
  post.unhide
88
88
  end
89
89
  end
@@ -32,5 +32,42 @@ module The86::Client
32
32
  resource.new(id: 1, code: "A").wont_equal false
33
33
  end
34
34
  end
35
+
36
+ describe "#has_many" do
37
+ it "returns the same instance of ResourceCollection" do
38
+ class Widget < Resource
39
+ attribute :name, String
40
+ end
41
+ resource = Class.new(Resource) do
42
+ attribute :id, Integer
43
+ has_many :widgets, ->{ Widget }
44
+ end
45
+ i = resource.new widgets: [{ name: "Knob" }]
46
+ widgets = i.widgets
47
+ widgets.send(:records).size.must_equal 1
48
+ i.widgets << Widget.new(name: "Flange")
49
+ widgets.send(:records).size.must_equal 2
50
+ end
51
+ end
52
+
53
+ describe "#accepts_nested_attributes_for" do
54
+ class Widget < Resource
55
+ attribute :name, String
56
+ end
57
+
58
+ resource = Class.new(Resource) do
59
+ attribute :id, Integer
60
+ has_many :widgets, -> { Widget }
61
+ accepts_nested_attributes_for :widgets
62
+ end
63
+
64
+ it "includes nested items" do
65
+ resource.
66
+ new(id: 123, widgets: [{ name: "Knob" }, { name: "Flange" }]).
67
+ sendable_attributes[:widgets].
68
+ map{|widget| widget.attributes }.
69
+ must_equal([{ name: "Knob" }, { name: "Flange" }])
70
+ end
71
+ end
35
72
  end
36
73
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: the86-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.3.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,200 +9,200 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-03 00:00:00.000000000 Z
12
+ date: 2013-02-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
16
+ prerelease: false
16
17
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
21
  version: '0'
22
+ none: false
22
23
  type: :runtime
23
- prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
25
  requirements:
27
26
  - - ! '>='
28
27
  - !ruby/object:Gem::Version
29
28
  version: '0'
29
+ none: false
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: faraday_middleware
32
+ prerelease: false
32
33
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
37
  version: '0'
38
+ none: false
38
39
  type: :runtime
39
- prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
41
  requirements:
43
42
  - - ! '>='
44
43
  - !ruby/object:Gem::Version
45
44
  version: '0'
45
+ none: false
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: hashie
48
+ prerelease: false
48
49
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
50
  requirements:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
+ none: false
54
55
  type: :runtime
55
- prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
57
  requirements:
59
58
  - - ! '>='
60
59
  - !ruby/object:Gem::Version
61
60
  version: '0'
61
+ none: false
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: addressable
64
+ prerelease: false
64
65
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
66
  requirements:
67
67
  - - ! '>='
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
+ none: false
70
71
  type: :runtime
71
- prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
73
  requirements:
75
74
  - - ! '>='
76
75
  - !ruby/object:Gem::Version
77
76
  version: '0'
77
+ none: false
78
78
  - !ruby/object:Gem::Dependency
79
79
  name: virtus
80
+ prerelease: false
80
81
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
82
  requirements:
83
83
  - - ! '>='
84
84
  - !ruby/object:Gem::Version
85
85
  version: '0'
86
+ none: false
86
87
  type: :runtime
87
- prerelease: false
88
88
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
89
  requirements:
91
90
  - - ! '>='
92
91
  - !ruby/object:Gem::Version
93
92
  version: '0'
93
+ none: false
94
94
  - !ruby/object:Gem::Dependency
95
95
  name: guard
96
+ prerelease: false
96
97
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
98
  requirements:
99
99
  - - ! '>='
100
100
  - !ruby/object:Gem::Version
101
101
  version: '0'
102
+ none: false
102
103
  type: :development
103
- prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
105
  requirements:
107
106
  - - ! '>='
108
107
  - !ruby/object:Gem::Version
109
108
  version: '0'
109
+ none: false
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: guard-minitest
112
+ prerelease: false
112
113
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
114
  requirements:
115
115
  - - ! '>='
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
+ none: false
118
119
  type: :development
119
- prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
121
  requirements:
123
122
  - - ! '>='
124
123
  - !ruby/object:Gem::Version
125
124
  version: '0'
125
+ none: false
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: minitest
128
+ prerelease: false
128
129
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
130
  requirements:
131
131
  - - ! '>='
132
132
  - !ruby/object:Gem::Version
133
133
  version: '0'
134
+ none: false
134
135
  type: :development
135
- prerelease: false
136
136
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
137
  requirements:
139
138
  - - ! '>='
140
139
  - !ruby/object:Gem::Version
141
140
  version: '0'
141
+ none: false
142
142
  - !ruby/object:Gem::Dependency
143
143
  name: ansi
144
+ prerelease: false
144
145
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
146
  requirements:
147
147
  - - ! '>='
148
148
  - !ruby/object:Gem::Version
149
149
  version: '0'
150
+ none: false
150
151
  type: :development
151
- prerelease: false
152
152
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
153
  requirements:
155
154
  - - ! '>='
156
155
  - !ruby/object:Gem::Version
157
156
  version: '0'
157
+ none: false
158
158
  - !ruby/object:Gem::Dependency
159
159
  name: turn
160
+ prerelease: false
160
161
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
162
  requirements:
163
163
  - - ! '>='
164
164
  - !ruby/object:Gem::Version
165
165
  version: '0'
166
+ none: false
166
167
  type: :development
167
- prerelease: false
168
168
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
169
  requirements:
171
170
  - - ! '>='
172
171
  - !ruby/object:Gem::Version
173
172
  version: '0'
173
+ none: false
174
174
  - !ruby/object:Gem::Dependency
175
175
  name: rake
176
+ prerelease: false
176
177
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
178
  requirements:
179
179
  - - ! '>='
180
180
  - !ruby/object:Gem::Version
181
181
  version: '0'
182
+ none: false
182
183
  type: :development
183
- prerelease: false
184
184
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
185
  requirements:
187
186
  - - ! '>='
188
187
  - !ruby/object:Gem::Version
189
188
  version: '0'
189
+ none: false
190
190
  - !ruby/object:Gem::Dependency
191
191
  name: webmock
192
+ prerelease: false
192
193
  requirement: !ruby/object:Gem::Requirement
193
- none: false
194
194
  requirements:
195
195
  - - ! '>='
196
196
  - !ruby/object:Gem::Version
197
197
  version: '0'
198
+ none: false
198
199
  type: :development
199
- prerelease: false
200
200
  version_requirements: !ruby/object:Gem::Requirement
201
- none: false
202
201
  requirements:
203
202
  - - ! '>='
204
203
  - !ruby/object:Gem::Version
205
204
  version: '0'
205
+ none: false
206
206
  description: Client for The 86 conversation API server
207
207
  email:
208
208
  - paul@sitepoint.com
@@ -223,17 +223,20 @@ files:
223
223
  - lib/the86-client/connection.rb
224
224
  - lib/the86-client/conversation.rb
225
225
  - lib/the86-client/errors.rb
226
+ - lib/the86-client/group.rb
226
227
  - lib/the86-client/like.rb
228
+ - lib/the86-client/metadatum.rb
229
+ - lib/the86-client/metadatum/conversation_metadatum.rb
227
230
  - lib/the86-client/oauth_bearer_authorization.rb
228
231
  - lib/the86-client/post.rb
229
232
  - lib/the86-client/resource.rb
230
233
  - lib/the86-client/resource_collection.rb
231
234
  - lib/the86-client/response.rb
232
- - lib/the86-client/site.rb
233
235
  - lib/the86-client/user.rb
234
236
  - lib/the86-client/version.rb
235
237
  - spec/conversations_spec.rb
236
238
  - spec/likes_spec.rb
239
+ - spec/metadata_spec.rb
237
240
  - spec/oauth_bearer_authorization_spec.rb
238
241
  - spec/post_spec.rb
239
242
  - spec/posts_spec.rb
@@ -251,17 +254,17 @@ rdoc_options: []
251
254
  require_paths:
252
255
  - lib
253
256
  required_ruby_version: !ruby/object:Gem::Requirement
254
- none: false
255
257
  requirements:
256
258
  - - ! '>='
257
259
  - !ruby/object:Gem::Version
258
260
  version: '0'
259
- required_rubygems_version: !ruby/object:Gem::Requirement
260
261
  none: false
262
+ required_rubygems_version: !ruby/object:Gem::Requirement
261
263
  requirements:
262
264
  - - ! '>='
263
265
  - !ruby/object:Gem::Version
264
266
  version: '0'
267
+ none: false
265
268
  requirements: []
266
269
  rubyforge_project:
267
270
  rubygems_version: 1.8.23
@@ -271,6 +274,7 @@ summary: Exposes The 86 conversation API server as an object model.
271
274
  test_files:
272
275
  - spec/conversations_spec.rb
273
276
  - spec/likes_spec.rb
277
+ - spec/metadata_spec.rb
274
278
  - spec/oauth_bearer_authorization_spec.rb
275
279
  - spec/post_spec.rb
276
280
  - spec/posts_spec.rb