ribose 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +539 -970
- data/.sample.pryrc +4 -0
- data/CHANGELOG.md +5 -0
- data/README.md +539 -3
- data/bin/console +2 -5
- data/lib/ribose.rb +31 -1
- data/lib/ribose/actions.rb +10 -0
- data/lib/ribose/actions/all.rb +43 -0
- data/lib/ribose/actions/base.rb +11 -0
- data/lib/ribose/actions/create.rb +44 -0
- data/lib/ribose/actions/delete.rb +32 -0
- data/lib/ribose/actions/fetch.rb +44 -0
- data/lib/ribose/actions/update.rb +35 -0
- data/lib/ribose/app_data.rb +15 -0
- data/lib/ribose/app_relation.rb +12 -0
- data/lib/ribose/base.rb +48 -0
- data/lib/ribose/calendar.rb +22 -0
- data/lib/ribose/client.rb +31 -0
- data/lib/ribose/config.rb +21 -0
- data/lib/ribose/configuration.rb +25 -0
- data/lib/ribose/connection.rb +39 -0
- data/lib/ribose/connection_invitation.rb +51 -0
- data/lib/ribose/conversation.rb +87 -0
- data/lib/ribose/error.rb +30 -0
- data/lib/ribose/feed.rb +11 -0
- data/lib/ribose/file_uploader.rb +93 -0
- data/lib/ribose/join_space_request.rb +41 -0
- data/lib/ribose/leaderboard.rb +19 -0
- data/lib/ribose/member.rb +34 -0
- data/lib/ribose/message.rb +94 -0
- data/lib/ribose/profile.rb +56 -0
- data/lib/ribose/request.rb +122 -0
- data/lib/ribose/resource_helper.rb +81 -0
- data/lib/ribose/response/raise_error.rb +15 -0
- data/lib/ribose/rspec.rb +19 -0
- data/lib/ribose/session.rb +48 -0
- data/lib/ribose/setting.rb +16 -0
- data/lib/ribose/space.rb +30 -0
- data/lib/ribose/space_file.rb +49 -0
- data/lib/ribose/space_invitation.rb +70 -0
- data/lib/ribose/stream.rb +15 -0
- data/lib/ribose/user.rb +42 -0
- data/lib/ribose/version.rb +1 -1
- data/lib/ribose/widget.rb +11 -0
- data/lib/ribose/wiki.rb +80 -0
- data/ribose.gemspec +6 -0
- data/spec/fixtures/app_data.json +188 -0
- data/spec/fixtures/app_relation.json +19 -0
- data/spec/fixtures/app_relations.json +89 -0
- data/spec/fixtures/calendar.json +12 -0
- data/spec/fixtures/calendars.json +34 -0
- data/spec/fixtures/connection_invitation.json +26 -0
- data/spec/fixtures/connection_invitation_accepted.json +26 -0
- data/spec/fixtures/connection_invitations.json +28 -0
- data/spec/fixtures/connection_invitations_created.json +37 -0
- data/spec/fixtures/connection_suggestion.json +22 -0
- data/spec/fixtures/connections.json +28 -0
- data/spec/fixtures/conversation.json +26 -0
- data/spec/fixtures/conversation_created.json +31 -0
- data/spec/fixtures/conversations.json +34 -0
- data/spec/fixtures/empty.json +1 -0
- data/spec/fixtures/feeds.json +84 -0
- data/spec/fixtures/file_upload_prepared.json +17 -0
- data/spec/fixtures/file_uploaded.json +38 -0
- data/spec/fixtures/general_information.json +16 -0
- data/spec/fixtures/join_space_request_created.json +26 -0
- data/spec/fixtures/join_space_request_updated.json +25 -0
- data/spec/fixtures/join_space_requests.json +34 -0
- data/spec/fixtures/leaderboard.json +21 -0
- data/spec/fixtures/login.html +323 -0
- data/spec/fixtures/members.json +20 -0
- data/spec/fixtures/message.json +22 -0
- data/spec/fixtures/messages.json +24 -0
- data/spec/fixtures/ping.json +3 -0
- data/spec/fixtures/profile.json +10 -0
- data/spec/fixtures/sample.png +0 -0
- data/spec/fixtures/setting.json +16 -0
- data/spec/fixtures/settings.json +18 -0
- data/spec/fixtures/space.json +59 -0
- data/spec/fixtures/space_created.json +59 -0
- data/spec/fixtures/space_file.json +58 -0
- data/spec/fixtures/space_invitation.json +32 -0
- data/spec/fixtures/space_invitation_updated.json +35 -0
- data/spec/fixtures/space_invitations.json +34 -0
- data/spec/fixtures/space_mass_invitations.json +46 -0
- data/spec/fixtures/spaces.json +61 -0
- data/spec/fixtures/stream.json +176 -0
- data/spec/fixtures/user_activated.json +6 -0
- data/spec/fixtures/widgets.json +50 -0
- data/spec/fixtures/wiki.json +79 -0
- data/spec/fixtures/wikis.json +197 -0
- data/spec/ribose/actions/create_spec.rb +40 -0
- data/spec/ribose/actions/delete_spec.rb +24 -0
- data/spec/ribose/actions/fetch_spec.rb +32 -0
- data/spec/ribose/actions/update_spec.rb +36 -0
- data/spec/ribose/app_data_spec.rb +15 -0
- data/spec/ribose/app_relation_spec.rb +27 -0
- data/spec/ribose/calendar_spec.rb +50 -0
- data/spec/ribose/client_spec.rb +48 -0
- data/spec/ribose/config_spec.rb +41 -0
- data/spec/ribose/connection_invitation_spec.rb +79 -0
- data/spec/ribose/connection_spec.rb +26 -0
- data/spec/ribose/conversation_spec.rb +84 -0
- data/spec/ribose/error_spec.rb +67 -0
- data/spec/ribose/feed_spec.rb +14 -0
- data/spec/ribose/file_uploader_spec.rb +30 -0
- data/spec/ribose/join_space_request_spec.rb +70 -0
- data/spec/ribose/leaderboard_spec.rb +13 -0
- data/spec/ribose/member_spec.rb +16 -0
- data/spec/ribose/message_spec.rb +69 -0
- data/spec/ribose/profile_spec.rb +40 -0
- data/spec/ribose/request_spec.rb +66 -0
- data/spec/ribose/resource_helper_spec.rb +58 -0
- data/spec/ribose/session_spec.rb +46 -0
- data/spec/ribose/setting_spec.rb +40 -0
- data/spec/ribose/space_file_spec.rb +41 -0
- data/spec/ribose/space_invitation_spec.rb +117 -0
- data/spec/ribose/space_spec.rb +70 -0
- data/spec/ribose/stream_spec.rb +14 -0
- data/spec/ribose/user_spec.rb +48 -0
- data/spec/ribose/widget_spec.rb +14 -0
- data/spec/ribose/wiki_spec.rb +67 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/fake_ribose_api.rb +431 -0
- data/spec/support/file_upload_stub.rb +76 -0
- metadata +190 -3
- data/spec/ribose_spec.rb +0 -4
@@ -0,0 +1,56 @@
|
|
1
|
+
module Ribose
|
2
|
+
class Profile < Ribose::Base
|
3
|
+
include Ribose::Actions::Fetch
|
4
|
+
include Ribose::Actions::Update
|
5
|
+
|
6
|
+
def set_login
|
7
|
+
update_login_name[resource_key]
|
8
|
+
end
|
9
|
+
|
10
|
+
# Fetch user profile
|
11
|
+
#
|
12
|
+
# @param options [Hash] The query parameters
|
13
|
+
# @return [Sawyer::Resource] The user profile
|
14
|
+
#
|
15
|
+
def self.fetch(options = {})
|
16
|
+
new(resource_id: nil, **options).fetch
|
17
|
+
end
|
18
|
+
|
19
|
+
# Update user profile
|
20
|
+
#
|
21
|
+
# @param attributes [Hash] The new attributes
|
22
|
+
# @return [Sawyer::Resource] The user profile
|
23
|
+
#
|
24
|
+
def self.update(attributes)
|
25
|
+
new(resource_id: nil, **attributes).update
|
26
|
+
end
|
27
|
+
|
28
|
+
# Set login name
|
29
|
+
#
|
30
|
+
# @param login [String] The user login name
|
31
|
+
# @return [Sawyer::Resource] The user profile
|
32
|
+
#
|
33
|
+
def self.set_login(name, options = {})
|
34
|
+
new(login: name, **options).set_login
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def resource
|
40
|
+
"user"
|
41
|
+
end
|
42
|
+
|
43
|
+
def resources_path
|
44
|
+
"people/profile"
|
45
|
+
end
|
46
|
+
|
47
|
+
def update_login_name
|
48
|
+
Ribose::Request.put(
|
49
|
+
"people/users/#{fetch.user_id}",
|
50
|
+
custom_option.merge(
|
51
|
+
resource_key.to_sym => { login: attributes[:login] }
|
52
|
+
),
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module Ribose
|
2
|
+
class Request
|
3
|
+
# Initialize a Request
|
4
|
+
#
|
5
|
+
# @param http_method [Symbol] HTTP verb as sysmbol
|
6
|
+
# @param endpoint [String] The relative API endpoint
|
7
|
+
# @param data [Hash] Attributes / Options as a Hash
|
8
|
+
# @return [Ribose::Request]
|
9
|
+
#
|
10
|
+
def initialize(http_method, endpoint, **data)
|
11
|
+
@data = data
|
12
|
+
@endpoint = endpoint
|
13
|
+
@http_method = http_method
|
14
|
+
@client = find_suitable_client
|
15
|
+
end
|
16
|
+
|
17
|
+
# Make a HTTP Request
|
18
|
+
#
|
19
|
+
# @param options [Hash] Additonal options hash
|
20
|
+
# @return [Sawyer::Resource]
|
21
|
+
#
|
22
|
+
def request(options = {})
|
23
|
+
options[:query] = extract_config_option(:query) || {}
|
24
|
+
agent.call(http_method, api_endpoint, data, options).data
|
25
|
+
end
|
26
|
+
|
27
|
+
# Make a HTTP GET Request
|
28
|
+
#
|
29
|
+
# @param endpoint [String] The relative API endpoint
|
30
|
+
# @param options [Hash] The additional query params
|
31
|
+
# @return [Sawyer::Resource]
|
32
|
+
#
|
33
|
+
def self.get(endpoint, options = {})
|
34
|
+
new(:get, endpoint, options).request
|
35
|
+
end
|
36
|
+
|
37
|
+
# Make a HTTP POST Request
|
38
|
+
#
|
39
|
+
# @param endpoint [String] The relative API endpoint
|
40
|
+
# @param data [Hash] The request data as a Hash
|
41
|
+
# @return [Sawyer::Resource]
|
42
|
+
#
|
43
|
+
def self.post(endpoint, data)
|
44
|
+
new(:post, endpoint, data).request
|
45
|
+
end
|
46
|
+
|
47
|
+
# Make a HTTP PUT Request
|
48
|
+
#
|
49
|
+
# @param endpoint [String] The relative API endpoint
|
50
|
+
# @param data [Hash] The request data as a Hash
|
51
|
+
# @return [Sawyer::Resource]
|
52
|
+
#
|
53
|
+
def self.put(endpoint, data)
|
54
|
+
new(:put, endpoint, data).request
|
55
|
+
end
|
56
|
+
|
57
|
+
# Make a HTTP DELETE Request
|
58
|
+
#
|
59
|
+
# @param endpoint [String] The relative API endpoint
|
60
|
+
# @return [Sawyer::Resource]
|
61
|
+
#
|
62
|
+
def self.delete(endpoint, options = {})
|
63
|
+
new(:delete, endpoint, options).request
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
attr_reader :client, :data, :http_method
|
69
|
+
|
70
|
+
def ribose_host
|
71
|
+
Ribose.configuration.api_host
|
72
|
+
end
|
73
|
+
|
74
|
+
def extract_config_option(key)
|
75
|
+
if data.is_a?(Hash)
|
76
|
+
data.delete(key.to_sym)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def find_suitable_client
|
81
|
+
client = extract_config_option(:client) || Ribose::Client.new
|
82
|
+
client.is_a?(Ribose::Client) ? client: raise(Ribose::Unauthorized)
|
83
|
+
end
|
84
|
+
|
85
|
+
def require_auth_headers?
|
86
|
+
auth_header = extract_config_option(:auth_header)
|
87
|
+
auth_header == false ? false : true
|
88
|
+
end
|
89
|
+
|
90
|
+
def api_endpoint
|
91
|
+
URI::HTTPS.build(
|
92
|
+
host: ribose_host,
|
93
|
+
path: ["", @endpoint].join("/").squeeze("/"),
|
94
|
+
)
|
95
|
+
end
|
96
|
+
|
97
|
+
def sawyer_options
|
98
|
+
{
|
99
|
+
links_parser: Sawyer::LinkParsers::Simple.new,
|
100
|
+
faraday: Faraday.new(builder: custom_rack_builder),
|
101
|
+
}
|
102
|
+
end
|
103
|
+
|
104
|
+
def custom_rack_builder
|
105
|
+
Faraday::RackBuilder.new do |builder|
|
106
|
+
Ribose.configuration.add_default_middleware(builder)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def agent
|
111
|
+
@agent ||= Sawyer::Agent.new(ribose_host, sawyer_options) do |http|
|
112
|
+
http.headers[:accept] = "application/json"
|
113
|
+
http.headers[:content_type] = "application/json"
|
114
|
+
|
115
|
+
if require_auth_headers?
|
116
|
+
http.headers["X-Indigo-Token"] = client.api_token
|
117
|
+
http.headers["X-Indigo-Email"] = client.user_email
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Ribose
|
2
|
+
module ResourceHelper
|
3
|
+
# Resource
|
4
|
+
#
|
5
|
+
# This is the key interface for any resource and every single
|
6
|
+
# resource should implement this method.Ideally this should
|
7
|
+
# reflect resource name in singular form, eg: +space+.
|
8
|
+
#
|
9
|
+
# Once we've this method implemented then this module will try
|
10
|
+
# to auto-generate all of the related helper methods, but if
|
11
|
+
# we need something different that the standard format then we
|
12
|
+
# can always overirde that in those classes.
|
13
|
+
#
|
14
|
+
# @return resrouce [String] The singular form of the Resource
|
15
|
+
def resource
|
16
|
+
raise NotImplementedError
|
17
|
+
end
|
18
|
+
|
19
|
+
# Resource Id
|
20
|
+
#
|
21
|
+
# The id for the key component of any of the classes in
|
22
|
+
# Ribose module, ideally we will have that one as default
|
23
|
+
# attribtue to the base class, but we can override it if
|
24
|
+
# necessary.
|
25
|
+
#
|
26
|
+
# @return resource_id [String] The id/uuid for a Resource
|
27
|
+
def resource_id
|
28
|
+
raise NotImplementedError
|
29
|
+
end
|
30
|
+
|
31
|
+
# Resources
|
32
|
+
#
|
33
|
+
# The plural version of the resoruce name, ideally we will
|
34
|
+
# use this one to to identify an array or resources.
|
35
|
+
#
|
36
|
+
# @return resources [String] The plural form of the Resource
|
37
|
+
def resources
|
38
|
+
[resource, "s"].join
|
39
|
+
end
|
40
|
+
|
41
|
+
# Resource Key
|
42
|
+
#
|
43
|
+
# The resource key is the key that we use to build any of
|
44
|
+
# the post/put request body, and ideally it's the resoruce
|
45
|
+
# value, but occassionally it might be diffrent for any of
|
46
|
+
# the reason, so this method will keep that on portable.
|
47
|
+
#
|
48
|
+
# @return resource_key [String] The key to build a request
|
49
|
+
def resource_key
|
50
|
+
resource
|
51
|
+
end
|
52
|
+
|
53
|
+
# Resources Path
|
54
|
+
#
|
55
|
+
# This represent a restfull resoruce path, and internally
|
56
|
+
# this will be used to build the the api endpoint path for
|
57
|
+
# any specifies resources.
|
58
|
+
#
|
59
|
+
# Based on the Ribose API structure it's pretty similiar
|
60
|
+
# to the resources value with some minor exception of the
|
61
|
+
# nested resoruces, so we are keeping the +resources+ as
|
62
|
+
# default but we can override this when necessary.
|
63
|
+
#
|
64
|
+
# @return resource_path [String] The endpoit for Resources
|
65
|
+
def resources_path
|
66
|
+
resources
|
67
|
+
end
|
68
|
+
|
69
|
+
# Resource Path
|
70
|
+
#
|
71
|
+
# This represent a single resource in a Restfull API. In
|
72
|
+
# Ribose API structure, it's `resources/:id`, so we will
|
73
|
+
# use that one as default. If we need something different
|
74
|
+
# then please override this method.
|
75
|
+
#
|
76
|
+
# @return resoruce_path [String] The Single Resource path
|
77
|
+
def resource_path
|
78
|
+
[resources_path, resource_id].join("/")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
data/lib/ribose/rspec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# RSpec Test Helpers
|
2
|
+
#
|
3
|
+
# Actual API requests are slow and expensive and we try not to make
|
4
|
+
# actual request when possible. For most of our tests we mock those
|
5
|
+
# API call which verifies the endpoint, http verb and headers and
|
6
|
+
# based on those it responses with an identical fixture file
|
7
|
+
#
|
8
|
+
# The main purpose of this file is to allow the user to use our test
|
9
|
+
# helpers by simplify adding this file to their application and then
|
10
|
+
# use the available helper method when necessary.
|
11
|
+
#
|
12
|
+
# We do not require this module with the gem by default, but you can
|
13
|
+
# do so by adding `require "ribose/rspec"` on top of `spec_helper`
|
14
|
+
#
|
15
|
+
require File.join(Ribose.root, "spec/support/fake_ribose_api.rb")
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
config.include Ribose::FakeRiboseApi
|
19
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require "json"
|
2
|
+
require "mechanize"
|
3
|
+
require "ribose/config"
|
4
|
+
|
5
|
+
module Ribose
|
6
|
+
class Session
|
7
|
+
def initialize(username, password)
|
8
|
+
@username = username
|
9
|
+
@password = password
|
10
|
+
end
|
11
|
+
|
12
|
+
def create
|
13
|
+
JSON.parse(authenticate_user)
|
14
|
+
rescue NoMethodError, JSON::ParserError
|
15
|
+
raise Ribose::Unauthorized
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.create(username:, password:)
|
19
|
+
new(username, password).create
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :username, :password
|
25
|
+
|
26
|
+
def authenticate_user
|
27
|
+
page = agent.get(ribose_url_for("login"))
|
28
|
+
find_and_submit_the_user_login_form(page)
|
29
|
+
agent.get(ribose_url_for(["settings", "general", "info"])).body
|
30
|
+
end
|
31
|
+
|
32
|
+
def find_and_submit_the_user_login_form(page)
|
33
|
+
login_form = page.form_with(id: "new_user")
|
34
|
+
login_form.field_with(id: "loginEmail").value = username
|
35
|
+
login_form.field_with(id: "loginPassword").value = password
|
36
|
+
|
37
|
+
login_form.submit
|
38
|
+
end
|
39
|
+
|
40
|
+
def agent
|
41
|
+
@agent ||= Mechanize.new
|
42
|
+
end
|
43
|
+
|
44
|
+
def ribose_url_for(*endpoint)
|
45
|
+
[Ribose.configuration.web_url, *endpoint].join("/")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "ribose/actions"
|
2
|
+
|
3
|
+
module Ribose
|
4
|
+
class Setting < Ribose::Base
|
5
|
+
include Ribose::Actions::All
|
6
|
+
include Ribose::Actions::Fetch
|
7
|
+
include Ribose::Actions::Update
|
8
|
+
include Ribose::Actions::Create
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def resource
|
13
|
+
"setting"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/ribose/space.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require "ribose/actions"
|
2
|
+
|
3
|
+
module Ribose
|
4
|
+
class Space < Ribose::Base
|
5
|
+
include Ribose::Actions::All
|
6
|
+
include Ribose::Actions::Fetch
|
7
|
+
include Ribose::Actions::Create
|
8
|
+
include Ribose::Actions::Update
|
9
|
+
|
10
|
+
def self.create(name:, **attributes)
|
11
|
+
new(attributes.merge(name: name)).create
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.remove(space_uuid, options = {})
|
15
|
+
Ribose::Request.post("spaces/#{space_uuid}/freeze", options)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :space
|
21
|
+
|
22
|
+
def resource
|
23
|
+
"space"
|
24
|
+
end
|
25
|
+
|
26
|
+
def extract_local_attributes
|
27
|
+
@space = attributes.delete(:space)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require "ribose/file_uploader"
|
2
|
+
|
3
|
+
module Ribose
|
4
|
+
class SpaceFile < Ribose::Base
|
5
|
+
include Ribose::Actions::All
|
6
|
+
|
7
|
+
# List Files for Space
|
8
|
+
#
|
9
|
+
# This interface retrieves the files for any specific space, and
|
10
|
+
# the usages is pretty simple all we need to do, provide the space
|
11
|
+
# id and it will return the files as `Sawyer::Resource`
|
12
|
+
#
|
13
|
+
# @param space_id [String] The spcific space Id
|
14
|
+
# @param options [Hash] Query parameters as a Hash
|
15
|
+
# @return [Array<Sawyer::Resource>]
|
16
|
+
#
|
17
|
+
def self.all(space_id, options = {})
|
18
|
+
new(space_id: space_id, **options).all
|
19
|
+
end
|
20
|
+
|
21
|
+
# Create a new file upload
|
22
|
+
#
|
23
|
+
# @param space_id [String] The Space UUID
|
24
|
+
# @param file [String] The complete path for the file
|
25
|
+
# @param attributes [Hash] The file attributes as Hash
|
26
|
+
# @return [Sawyer::Resource] The file upload response.
|
27
|
+
#
|
28
|
+
def self.create(space_id, file:, **attributes)
|
29
|
+
upload = FileUploader.upload(space_id, attributes.merge(file: file))
|
30
|
+
upload[:attachment]
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_reader :space_id
|
36
|
+
|
37
|
+
def resource
|
38
|
+
"file"
|
39
|
+
end
|
40
|
+
|
41
|
+
def resources_path
|
42
|
+
["spaces", space_id, "file", "files"].join("/")
|
43
|
+
end
|
44
|
+
|
45
|
+
def extract_local_attributes
|
46
|
+
@space_id = attributes.delete(:space_id)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|