dimelo_ccp_api 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +15 -0
  5. data/CHANGELOG.md +29 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +59 -0
  9. data/Rakefile +23 -0
  10. data/VERSION +1 -0
  11. data/dimelo_ccp_api.gemspec +26 -0
  12. data/examples/dimelo_api_test +34 -0
  13. data/gemfiles/Gemfile.activesupport-3.2.x +5 -0
  14. data/gemfiles/Gemfile.activesupport-4.0.x +5 -0
  15. data/gemfiles/Gemfile.activesupport-4.1.x +5 -0
  16. data/gemfiles/Gemfile.activesupport-head +5 -0
  17. data/lib/dimelo/ccp/api/basic_object.rb +17 -0
  18. data/lib/dimelo/ccp/api/client.rb +46 -0
  19. data/lib/dimelo/ccp/api/common/openable.rb +23 -0
  20. data/lib/dimelo/ccp/api/common/publishable.rb +23 -0
  21. data/lib/dimelo/ccp/api/common/starrable.rb +23 -0
  22. data/lib/dimelo/ccp/api/connection.rb +86 -0
  23. data/lib/dimelo/ccp/api/error.rb +71 -0
  24. data/lib/dimelo/ccp/api/lazzy_collection.rb +114 -0
  25. data/lib/dimelo/ccp/api/model/answer.rb +39 -0
  26. data/lib/dimelo/ccp/api/model/attachment.rb +44 -0
  27. data/lib/dimelo/ccp/api/model/category.rb +12 -0
  28. data/lib/dimelo/ccp/api/model/category_group.rb +12 -0
  29. data/lib/dimelo/ccp/api/model/feedback.rb +20 -0
  30. data/lib/dimelo/ccp/api/model/feedback_comment.rb +31 -0
  31. data/lib/dimelo/ccp/api/model/membership.rb +12 -0
  32. data/lib/dimelo/ccp/api/model/private_message.rb +8 -0
  33. data/lib/dimelo/ccp/api/model/question.rb +20 -0
  34. data/lib/dimelo/ccp/api/model/role.rb +8 -0
  35. data/lib/dimelo/ccp/api/model/user.rb +37 -0
  36. data/lib/dimelo/ccp/api/model/webhook.rb +9 -0
  37. data/lib/dimelo/ccp/api/model.rb +209 -0
  38. data/lib/dimelo/ccp/api/version.rb +7 -0
  39. data/lib/dimelo/ccp/api.rb +62 -0
  40. data/lib/dimelo_ccp_api.rb +1 -0
  41. data/spec/examples/openable_examples.rb +37 -0
  42. data/spec/examples/starrable_example.rb +57 -0
  43. data/spec/fixtures/files/logo.jpg +0 -0
  44. data/spec/lib/dimelo/ccp/api/client_spec.rb +111 -0
  45. data/spec/lib/dimelo/ccp/api/connection_spec.rb +129 -0
  46. data/spec/lib/dimelo/ccp/api/model/attachment_spec.rb +26 -0
  47. data/spec/lib/dimelo/ccp/api/model/feedback_spec.rb +10 -0
  48. data/spec/lib/dimelo/ccp/api/model/question_spec.rb +10 -0
  49. data/spec/lib/dimelo/ccp/api/model_spec.rb +162 -0
  50. data/spec/spec_helper.rb +7 -0
  51. metadata +174 -0
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dimelo::CCP::API::Client do
4
+
5
+ subject do
6
+ Dimelo::CCP::API::Client.new('https://domain-test.api.users.dimelo.info:4433/1.0', 'access_token' => ENV['DIMELO_API_KEY'], :http_options => {:timeout => 80})
7
+ end
8
+
9
+ def response_error(status, error, message='')
10
+ double success?: false,
11
+ body: %Q{{
12
+ "error": "#{error}",
13
+ "message": "#{message}",
14
+ "status": #{status}
15
+ }},
16
+ status: status
17
+ end
18
+
19
+ describe '#transport' do
20
+
21
+ it 'return an the response body' do
22
+ pending('no api key') unless ENV['DIMELO_API_KEY'].present?
23
+ json = JSON.parse(subject.transport(:get, 'check'))
24
+ expect(json).to eq({"success" => true})
25
+ end
26
+
27
+ it 'raise InvalidAccessTokenError if token is invalid' do
28
+ expect{
29
+ subject.transport(:get, 'check', {'access_token' => 'invalid'})
30
+ }.to raise_error(Dimelo::CCP::API::InvalidAccessTokenError)
31
+ end
32
+
33
+ it 'raise NotFoundError if path is invalid' do
34
+ expect{
35
+ subject.transport(:get, 'invalid_path', {'access_token' => 'invalid'})
36
+ }.to raise_error(Dimelo::CCP::API::NotFoundError)
37
+ end
38
+
39
+ it 'raise NotEnabledError if api is not enabled' do
40
+ allow(subject).to receive_message_chain('connection.perform') { response_error 403, 'api_not_enabled' }
41
+ expect{
42
+ subject.transport(:get, 'check', {'access_token' => 'my-token'})
43
+ }.to raise_error(Dimelo::CCP::API::NotEnabledError)
44
+ end
45
+
46
+ it 'raise SSLError if request should be https' do
47
+ allow(subject).to receive_message_chain('connection.perform') { response_error 412, 'routing_error' }
48
+ expect{
49
+ subject.transport(:get, 'check', {'access_token' => 'my-token'})
50
+ }.to raise_error(Dimelo::CCP::API::SslError)
51
+ end
52
+
53
+ it 'raise InvalidUserTypeError if create user is invalid' do
54
+ allow(subject).to receive_message_chain('connection.perform') { response_error 400, 'invalid_user_type' }
55
+ expect{
56
+ subject.transport(:post, 'users', {'access_token' => 'my-token'})
57
+ }.to raise_error(Dimelo::CCP::API::InvalidUserTypeError)
58
+ end
59
+
60
+ it 'raise DomainNotFoundError if request on invalid domain' do
61
+ client = Dimelo::CCP::API::Client.new('https://no-domain.api.users.dimelo.info:4433/1.0', :http_options => {:timeout => 80})
62
+ expect{
63
+ client.transport(:get, 'check', {'access_token' => 'my-token'})
64
+ }.to raise_error(Dimelo::CCP::API::DomainNotFoundError)
65
+ end
66
+
67
+ it 'raise an API::Error if body is not json' do
68
+ allow(subject).to receive_message_chain('connection.perform') { double success?: false, body: 'MemCache Error', status: 500 }
69
+ expect{
70
+ subject.transport(:post, 'users', {'access_token' => 'my-token'})
71
+ }.to raise_error(Dimelo::CCP::API::Error, 'POST users - 500 MemCache Error')
72
+ end
73
+
74
+ it 'raise an API::BaseError if error does not match defined errors' do
75
+ allow(subject).to receive_message_chain('connection.perform') { response_error 123, 'unable_action', 'cannot perform action' }
76
+ expect{
77
+ subject.transport(:post, 'users', {'access_token' => 'my-token'})
78
+ }.to raise_error(Dimelo::CCP::API::BaseError, 'error_type:unable_action - status:123 - body:cannot perform action')
79
+ end
80
+
81
+ it 'return an the response body in case of validation error' do
82
+ pending('no api key') unless ENV['DIMELO_API_KEY'].present?
83
+ json = JSON.parse(subject.transport(:post, 'roles', {}))
84
+ expect(json).to include "error" => 'validation_error'
85
+ expect(json).to include "errors" => [{"attribute"=>"label", "type"=>"invalid", "message"=>"Label is invalid"}]
86
+ expect(json).to include "message" => "Role can't be saved"
87
+ expect(json).to include "status" => 422
88
+ end
89
+
90
+ end
91
+
92
+ describe '#default_parameters' do
93
+ it 'is not polluted by http_options' do
94
+ expect(subject.default_parameters).not_to include('http_options')
95
+ expect(subject.default_parameters).not_to include(:http_options)
96
+ end
97
+ end
98
+
99
+ describe '#connection' do
100
+
101
+ it 'returns a Connection' do
102
+ expect(subject.send(:connection)).to be_kind_of(Dimelo::CCP::API::Connection)
103
+ end
104
+
105
+ it 'supports http_options' do
106
+ expect(Dimelo::CCP::API::Connection).to receive(:from_uri).with(anything,hash_including(:timeout => 80))
107
+ subject.send(:connection)
108
+ end
109
+ end
110
+
111
+ end
@@ -0,0 +1,129 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dimelo::CCP::API::Connection do
4
+
5
+ describe '.from_uri' do
6
+
7
+ let(:http_uri) { URI.parse('http://example.com:8080/foo/bar?egg=spam')}
8
+ let(:https_uri) { URI.parse('https://example.com:8080/foo/bar?egg=spam')}
9
+
10
+ it 'should infer :use_ssl => true from the scheme' do
11
+ expect(Dimelo::CCP::API::Connection).to receive(:new).with('https://example.com:8080/foo/bar?egg=spam', :use_ssl => true)
12
+ Dimelo::CCP::API::Connection.from_uri(https_uri)
13
+ end
14
+
15
+ it 'should infer :use_ssl => false from the scheme' do
16
+ expect(Dimelo::CCP::API::Connection).to receive(:new).with('http://example.com:8080/foo/bar?egg=spam', :use_ssl => false)
17
+ Dimelo::CCP::API::Connection.from_uri(http_uri)
18
+ end
19
+
20
+ it 'should support http options' do
21
+ expect(Dimelo::CCP::API::Connection).to receive(:new).with('http://example.com:8080/foo/bar?egg=spam', :use_ssl => false, :timeout => 80)
22
+ Dimelo::CCP::API::Connection.from_uri(http_uri, :timeout => 80)
23
+ end
24
+
25
+ it 'should reuse connections for same scheme/hosts/port' do
26
+ first = Dimelo::CCP::API::Connection.from_uri(http_uri)
27
+ second = Dimelo::CCP::API::Connection.from_uri(http_uri)
28
+ expect(first.object_id).to eq(second.object_id)
29
+ end
30
+
31
+ end
32
+
33
+ describe '#perform' do
34
+
35
+ context 'HTTP' do
36
+
37
+ subject do
38
+ Dimelo::CCP::API::Connection.new('www.google.fr')
39
+ end
40
+
41
+ let(:request) { [:get, 'http://www.google.fr/'] }
42
+
43
+ it 'works' do
44
+ response = subject.perform(*request)
45
+ expect(response.body).to_not be_empty
46
+ expect(response).to be_success
47
+ end
48
+
49
+ end
50
+
51
+ context 'HTTPS' do
52
+
53
+ subject do
54
+ Dimelo::CCP::API::Connection.new('www.google.fr:443', :use_ssl => true)
55
+ end
56
+
57
+ let(:request) { [:get, 'https://www.google.fr/'] }
58
+
59
+ it 'works' do
60
+ response = subject.perform(*request)
61
+ expect(response.body).to_not be_empty
62
+ expect(response).to be_success
63
+ end
64
+
65
+ end
66
+
67
+ subject do
68
+ Dimelo::CCP::API::Connection.new('github.com:443')
69
+ end
70
+
71
+ let(:file) { Faraday::UploadIO.new(File.expand_path('../../../../../fixtures/files/logo.jpg', __FILE__), 'image/jpeg') }
72
+
73
+ it 'sends multipart request with attachment' do
74
+ response = subject.perform(:put, 'http://www.google.com', {:file => file})
75
+ expect(response.env[:request_headers]["Content-Type"]).to include('multipart/form-data')
76
+ end
77
+
78
+ it 'sends multipart when containing attachment param' do
79
+ response = subject.perform(:put, 'http://www.google.com', {:file => file, :q => 'hello'})
80
+ expect(response.env[:request_headers]["Content-Type"]).to include('multipart/form-data')
81
+ end
82
+
83
+ it 'should sends form urlencoded without attachment' do
84
+ response = subject.perform(:put, 'http://www.google.com', {:q => 'hello'})
85
+ expect(response.env[:request_headers]["Content-Type"]).to eq('application/x-www-form-urlencoded')
86
+ end
87
+
88
+ it 'sends accept json request' do
89
+ response = subject.perform(:get, 'http://www.google.com', {:q => 'hello'})
90
+ expect(response.env[:request_headers][:accept]).to eq('application/json')
91
+ expect(response).to be_success
92
+ end
93
+
94
+ it 'sends user_agent request' do
95
+ response = subject.perform(:get, 'http://www.google.com', {:q => 'hello'})
96
+ expect(response.env[:request_headers][:user_agent]).to eq("DimeloAPI/#{Dimelo::CCP::API::VERSION} Faraday/#{Faraday::VERSION} Ruby/#{RUBY_VERSION}")
97
+ expect(response).to be_success
98
+ end
99
+
100
+ context 'Custom user_agent with valid ASCII characters' do
101
+ let!(:custom_user_agent) { "SMCC; I asked and failed" }
102
+
103
+ subject do
104
+ Dimelo::CCP::API::Connection.new('github.com:443', :user_agent => custom_user_agent)
105
+ end
106
+
107
+ it 'sends custom user_agent request' do
108
+ response = subject.perform(:get, 'http://www.google.com', {:q => 'hello'})
109
+ expect(response.env[:request_headers][:user_agent]).to eq("DimeloAPI/#{Dimelo::CCP::API::VERSION} (#{custom_user_agent}) Faraday/#{Faraday::VERSION} Ruby/#{RUBY_VERSION}")
110
+ expect(response).to be_success
111
+ end
112
+ end
113
+
114
+ context 'Custom user_agent with invalid UTF-8 characters' do
115
+ let!(:custom_user_agent) { "SMCC; J'ai demandé & j'ai échoué" }
116
+
117
+ subject do
118
+ Dimelo::CCP::API::Connection.new('github.com:443', :user_agent => custom_user_agent)
119
+ end
120
+
121
+ it 'sends custom user_agent request' do
122
+ response = subject.perform(:get, 'http://www.google.com', {:q => 'hello'})
123
+ expect(response.env[:request_headers][:user_agent]).to eq("DimeloAPI/#{Dimelo::CCP::API::VERSION} (SMCC; J'ai demand & j'ai chou) Faraday/#{Faraday::VERSION} Ruby/#{RUBY_VERSION}")
124
+ expect(response).to be_success
125
+ end
126
+ end
127
+ end
128
+
129
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Dimelo::CCP::Attachment do
6
+ let(:client) { Dimelo::CCP::API::Client.new('https://domain-test.api.answers.dimelo.info/1.0', 'access_token' => 'foo') }
7
+
8
+ describe Dimelo::CCP::QuestionAttachment do
9
+
10
+ it 'use question path' do
11
+ expect(client).to receive(:transport).with(:get, 'questions/1/attachments', {:offset=>0, :limit=>30}).and_return('[]')
12
+ Dimelo::CCP::QuestionAttachment.find({:question_id => 1}, client)
13
+ end
14
+
15
+ end
16
+
17
+ describe Dimelo::CCP::AnswerAttachment do
18
+
19
+ it 'use answer path' do
20
+ expect(client).to receive(:transport).with(:get, 'questions/2/answers/1/attachments', {:offset=>0, :limit=>30}).and_return('[]')
21
+ Dimelo::CCP::AnswerAttachment.find({question_id: 2, answer_id: 1}, client)
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Dimelo::CCP::Feedback do
6
+
7
+ it_behaves_like 'common model actions'
8
+ it_behaves_like 'starrable object'
9
+
10
+ end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Dimelo::CCP::Question do
6
+
7
+ it_behaves_like 'common model actions'
8
+ it_behaves_like 'starrable object'
9
+
10
+ end
@@ -0,0 +1,162 @@
1
+ require 'spec_helper'
2
+
3
+ describe Dimelo::CCP::API::Model do
4
+
5
+ class User < Dimelo::CCP::API::Model
6
+ path 'groups/%{group_id}/users/%{id}'
7
+ attributes :id, :firstname, :lastname
8
+ end
9
+
10
+ class BaseUser < Dimelo::CCP::API::Model
11
+ attributes :id, :firstname, :lastname
12
+ end
13
+
14
+ describe '.new' do
15
+
16
+ it "creates user with given attributes" do
17
+ user = User.new(:id => 1, :firstname => 'Homer Jay', :lastname => 'Simpson')
18
+ expect(user.id).to eq(1)
19
+ expect(user.firstname).to eq('Homer Jay')
20
+ expect(user.lastname).to eq('Simpson')
21
+ end
22
+
23
+ end
24
+
25
+ describe '.parse' do
26
+
27
+ it 'parses one json record' do
28
+ user = User.parse(%[
29
+ {
30
+ "id": 1,
31
+ "firstname": "Homer Jay",
32
+ "lastname": "Simpson"
33
+ }
34
+ ])
35
+
36
+ expect(user).to be_a(User)
37
+ expect(user.id).to eq(1)
38
+ expect(user.firstname).to eq('Homer Jay')
39
+ expect(user.lastname).to eq('Simpson')
40
+ end
41
+
42
+ it 'parses many json records' do
43
+ user = User.parse(%[
44
+ [
45
+ {
46
+ "id": 1,
47
+ "firstname": "Homer Jay",
48
+ "lastname": "Simpson"
49
+ },
50
+ {
51
+ "id": 2,
52
+ "firstname": "Marjorie 'Marge'",
53
+ "lastname": "Simpson"
54
+ }
55
+ ]
56
+ ])
57
+
58
+ expect(user.size).to eq(2)
59
+ user.each do |u|
60
+ expect(u).to be_a(User)
61
+ end
62
+
63
+ end
64
+
65
+ end
66
+
67
+ describe '.path' do
68
+ let(:user) { BaseUser.new }
69
+
70
+ it 'should not have leading and trailling "/" to not override path_prefix' do
71
+ expect(user.compute_path).to eq('base_users')
72
+ end
73
+
74
+ it 'should work when computed with criteria' do
75
+ expect(user.compute_path(:id => 1)).to eq('base_users/1')
76
+ end
77
+
78
+ end
79
+
80
+ describe '.find' do
81
+
82
+ let(:client) { Dimelo::CCP::API::Client.new('https://domain-test.api.users.dimelo.com/1.0', 'access_token' => 'foo') }
83
+
84
+ it 'compute index path' do
85
+ expect(client).to receive(:transport).with(:get, 'groups/42/users', {:offset=>0, :limit=>30}).and_return('[]')
86
+ User.find({:group_id => 42}, client)
87
+ end
88
+
89
+ it 'compute show path' do
90
+ expect(client).to receive(:transport).with(:get, 'groups/42/users/1', {:offset=>0, :limit=>30}).and_return('{}')
91
+ User.find({:group_id => 42, :id => 1}, client)
92
+ end
93
+
94
+ it 'send extra criterias as payload' do
95
+ expect(client).to receive(:transport).with(:get, 'groups/42/users', {:order => 'foo', :egg => 'spam', :offset=>0, :limit=>30}).and_return('[]')
96
+ User.find({:group_id => 42, :order => 'foo', :egg => 'spam'}, client)
97
+ end
98
+
99
+ it 'send the result to .parse' do
100
+ expect(client).to receive(:transport).at_least(1).times.and_return('JSON')
101
+ expect(User).to receive(:parse).at_least(1).times.with('JSON', client)
102
+ User.find({:group_id => 42}, client)
103
+ end
104
+
105
+ end
106
+
107
+ describe '#tracked_attributes' do
108
+
109
+ before :each do
110
+ class Article < Dimelo::CCP::API::Model
111
+ attributes :id, :category_ids
112
+ end
113
+ end
114
+
115
+ after :each do
116
+ Object.send(:remove_const, 'Article')
117
+ end
118
+
119
+ it 'should returns only mass-assigned attributes' do
120
+ expect(Article.new(:category_ids => nil).tracked_attributes).to eq([:category_ids])
121
+ end
122
+
123
+ it 'should works on single assigning' do
124
+ article = Article.new
125
+ article.category_ids = nil
126
+ expect(article.tracked_attributes).to eq([:category_ids])
127
+ end
128
+
129
+ it 'should returns nothing if not set' do
130
+ expect(Article.new.tracked_attributes).to eq([])
131
+ end
132
+
133
+ end
134
+
135
+ describe '.submit_attributes' do
136
+
137
+ before :each do
138
+ class Article < Dimelo::CCP::API::Model
139
+ attributes :id, :category_ids
140
+ submit_attributes :id, :category_ids
141
+ end
142
+ end
143
+
144
+ after :each do
145
+ Object.send(:remove_const, 'Article')
146
+ end
147
+
148
+ it 'does not send param when not sent' do
149
+ expect(Article.new.submit_attributes).to eq({})
150
+ end
151
+
152
+ it 'sends only param specified' do
153
+ expect(Article.new(:id => 1).submit_attributes).to eq({:id => 1})
154
+ end
155
+
156
+ it 'sends empty string is precised' do
157
+ expect(Article.new(:id => 1, :category_ids => nil).submit_attributes).to eq({:id => 1, :category_ids => nil})
158
+ end
159
+
160
+ end
161
+
162
+ end
@@ -0,0 +1,7 @@
1
+ begin
2
+ require 'spec/autorun'
3
+ rescue LoadError
4
+ require 'rspec'
5
+ end
6
+ require File.expand_path(File.dirname(__FILE__) + '/../lib/dimelo_ccp_api')
7
+ Dir[File.dirname(__FILE__) + "/examples/**/*.rb"].sort.each { |f| require f }
metadata ADDED
@@ -0,0 +1,174 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dimelo_ccp_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.1
5
+ platform: ruby
6
+ authors:
7
+ - Jean Boussier
8
+ - Renaud Morvan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-10-28 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: 3.0.0
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: 3.0.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: activemodel
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 3.0.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: 3.0.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: faraday
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '3.0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '3.0'
84
+ description: Rest API client for Dimelo CCP v2 plateform
85
+ email:
86
+ - jean.boussier@dimelo.com
87
+ - nel@w3fu.com
88
+ executables: []
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".gitignore"
93
+ - ".ruby-version"
94
+ - ".travis.yml"
95
+ - CHANGELOG.md
96
+ - Gemfile
97
+ - LICENSE.txt
98
+ - README.md
99
+ - Rakefile
100
+ - VERSION
101
+ - dimelo_ccp_api.gemspec
102
+ - examples/dimelo_api_test
103
+ - gemfiles/Gemfile.activesupport-3.2.x
104
+ - gemfiles/Gemfile.activesupport-4.0.x
105
+ - gemfiles/Gemfile.activesupport-4.1.x
106
+ - gemfiles/Gemfile.activesupport-head
107
+ - lib/dimelo/ccp/api.rb
108
+ - lib/dimelo/ccp/api/basic_object.rb
109
+ - lib/dimelo/ccp/api/client.rb
110
+ - lib/dimelo/ccp/api/common/openable.rb
111
+ - lib/dimelo/ccp/api/common/publishable.rb
112
+ - lib/dimelo/ccp/api/common/starrable.rb
113
+ - lib/dimelo/ccp/api/connection.rb
114
+ - lib/dimelo/ccp/api/error.rb
115
+ - lib/dimelo/ccp/api/lazzy_collection.rb
116
+ - lib/dimelo/ccp/api/model.rb
117
+ - lib/dimelo/ccp/api/model/answer.rb
118
+ - lib/dimelo/ccp/api/model/attachment.rb
119
+ - lib/dimelo/ccp/api/model/category.rb
120
+ - lib/dimelo/ccp/api/model/category_group.rb
121
+ - lib/dimelo/ccp/api/model/feedback.rb
122
+ - lib/dimelo/ccp/api/model/feedback_comment.rb
123
+ - lib/dimelo/ccp/api/model/membership.rb
124
+ - lib/dimelo/ccp/api/model/private_message.rb
125
+ - lib/dimelo/ccp/api/model/question.rb
126
+ - lib/dimelo/ccp/api/model/role.rb
127
+ - lib/dimelo/ccp/api/model/user.rb
128
+ - lib/dimelo/ccp/api/model/webhook.rb
129
+ - lib/dimelo/ccp/api/version.rb
130
+ - lib/dimelo_ccp_api.rb
131
+ - spec/examples/openable_examples.rb
132
+ - spec/examples/starrable_example.rb
133
+ - spec/fixtures/files/logo.jpg
134
+ - spec/lib/dimelo/ccp/api/client_spec.rb
135
+ - spec/lib/dimelo/ccp/api/connection_spec.rb
136
+ - spec/lib/dimelo/ccp/api/model/attachment_spec.rb
137
+ - spec/lib/dimelo/ccp/api/model/feedback_spec.rb
138
+ - spec/lib/dimelo/ccp/api/model/question_spec.rb
139
+ - spec/lib/dimelo/ccp/api/model_spec.rb
140
+ - spec/spec_helper.rb
141
+ homepage: ''
142
+ licenses: []
143
+ metadata: {}
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ requirements: []
159
+ rubyforge_project: dimelo_ccp_api
160
+ rubygems_version: 2.2.2
161
+ signing_key:
162
+ specification_version: 4
163
+ summary: Dimelo CCP v2 API client
164
+ test_files:
165
+ - spec/examples/openable_examples.rb
166
+ - spec/examples/starrable_example.rb
167
+ - spec/fixtures/files/logo.jpg
168
+ - spec/lib/dimelo/ccp/api/client_spec.rb
169
+ - spec/lib/dimelo/ccp/api/connection_spec.rb
170
+ - spec/lib/dimelo/ccp/api/model/attachment_spec.rb
171
+ - spec/lib/dimelo/ccp/api/model/feedback_spec.rb
172
+ - spec/lib/dimelo/ccp/api/model/question_spec.rb
173
+ - spec/lib/dimelo/ccp/api/model_spec.rb
174
+ - spec/spec_helper.rb