arena 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/arena.rb +7 -0
- data/lib/arena/api.rb +80 -0
- data/lib/arena/base.rb +52 -0
- data/lib/arena/block.rb +51 -0
- data/lib/arena/channel.rb +35 -0
- data/lib/arena/client.rb +22 -18
- data/lib/arena/configurable.rb +10 -9
- data/lib/arena/core_ext/string.rb +7 -0
- data/lib/arena/creatable.rb +31 -0
- data/lib/arena/default.rb +14 -2
- data/lib/arena/entities/attachment.rb +11 -0
- data/lib/arena/entities/image.rb +20 -0
- data/lib/arena/entities/provider.rb +9 -0
- data/lib/arena/entities/source.rb +14 -0
- data/lib/arena/entities/version.rb +9 -0
- data/lib/arena/entity.rb +6 -0
- data/lib/arena/error.rb +4 -0
- data/lib/arena/results.rb +14 -0
- data/lib/arena/search_results.rb +22 -0
- data/lib/arena/user.rb +16 -0
- data/lib/arena/version.rb +5 -1
- metadata +18 -2
data/lib/arena.rb
CHANGED
data/lib/arena/api.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'arena/user'
|
2
|
+
require 'arena/block'
|
3
|
+
require 'arena/channel'
|
4
|
+
require 'arena/results'
|
5
|
+
require 'arena/search_results'
|
6
|
+
|
7
|
+
module Arena
|
8
|
+
module API
|
9
|
+
# Returns paginated global list of Channels
|
10
|
+
def channels(options={})
|
11
|
+
object_from_response(Arena::ChannelResults, :get, "/channels", options)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns a full Channel representation
|
15
|
+
def channel(id, options={})
|
16
|
+
object_from_response(Arena::Channel, :get, "/channels/#{id}", options)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Posts a block to a channel
|
20
|
+
def channel_add_block(id, options={})
|
21
|
+
object_from_response(Arena::Block, :post, "/channels/#{id}/blocks", options)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Remove a block from channel (destroy connection)
|
25
|
+
def channel_remove_block(channel_id, id, options={})
|
26
|
+
send(:delete, "/channels/#{channel_id}/blocks/#{id}", options)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Select a block within the context of a channel
|
30
|
+
def channel_toggle_block_selection(id, options={})
|
31
|
+
send(:put, "/connections/#{id}/selection", options)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns thumbnail representation (first 9 Blocks) for the given Channel
|
35
|
+
def channel_thumb(id, options={})
|
36
|
+
object_from_response(Arena::Channel, :get, "/channels/#{id}/thumb", options)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Returns a paginated list of all Channels connected to the given Channel
|
40
|
+
def channel_channels(id, options={})
|
41
|
+
object_from_response(Arena::ChannelResults, :get, "/channels/#{id}/channels", options)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns a full Block representation
|
45
|
+
def block(id, options={})
|
46
|
+
object_from_response(Arena::Block, :get, "/blocks/#{id}", options)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns a User representation
|
50
|
+
def user(id, options={})
|
51
|
+
object_from_response(Arena::User, :get, "/users/#{id}", options)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns a paginated list of all Channels a User has access to
|
55
|
+
def user_channels(id, options={})
|
56
|
+
object_from_response(Arena::ChannelResults, :get, "/users/#{id}/channels", options)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns a Search object with an Array for Channels, Blocks and Users
|
60
|
+
def search(query, option={})
|
61
|
+
object_from_response(Arena::SearchResults, :get, "/search?q=#{query}", options)
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def object_from_response(klass, request_method, url, options={})
|
67
|
+
response = send(request_method.to_sym, url, options)
|
68
|
+
klass.new(response)
|
69
|
+
end
|
70
|
+
|
71
|
+
def collection_from_array(klass, array)
|
72
|
+
array.collect { |element| klass.new(element) }
|
73
|
+
end
|
74
|
+
|
75
|
+
def collection_from_response(klass, request_method, url, options={}, selector)
|
76
|
+
collection_from_array(klass, send(request_method.to_sym, url, options)[selector])
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
data/lib/arena/base.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
module Arena
|
2
|
+
class Base
|
3
|
+
attr_reader :attrs
|
4
|
+
alias to_hash attrs
|
5
|
+
|
6
|
+
# Define methods that retrieve the value from an initialized instance variable Hash, using the attribute as a key
|
7
|
+
#
|
8
|
+
# @param attrs [Array, Set, Symbol]
|
9
|
+
def self.attr_reader(*attrs)
|
10
|
+
attrs.each do |attribute|
|
11
|
+
class_eval do
|
12
|
+
define_method attribute do
|
13
|
+
@attrs[attribute.to_s]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Initializes a new object
|
20
|
+
#
|
21
|
+
# @param attrs [Hash]
|
22
|
+
# @return [Arena::Base]
|
23
|
+
def initialize(attrs={})
|
24
|
+
@attrs = attrs
|
25
|
+
end
|
26
|
+
|
27
|
+
# Update the attributes of an object
|
28
|
+
#
|
29
|
+
# @param attrs [Hash]
|
30
|
+
# @return [Arena::Base]
|
31
|
+
# def update(attrs)
|
32
|
+
# @attrs.update(attrs)
|
33
|
+
# self
|
34
|
+
# end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
# @param attr [Symbol]
|
39
|
+
# @param other [Arena::Base]
|
40
|
+
# @return [Boolean]
|
41
|
+
def attr_equal(attr, other)
|
42
|
+
self.class == other.class && !other.send(attr).nil? && send(attr) == other.send(attr)
|
43
|
+
end
|
44
|
+
|
45
|
+
# @param other [Arena::Base]
|
46
|
+
# @return [Boolean]
|
47
|
+
def attrs_equal(other)
|
48
|
+
self.class == other.class && !other.attrs.empty? && attrs == other.attrs
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/lib/arena/block.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'arena/base'
|
2
|
+
require 'arena/entity'
|
3
|
+
require 'arena/entities/source'
|
4
|
+
require 'arena/entities/image'
|
5
|
+
require 'arena/entities/attachment'
|
6
|
+
require 'arena/creatable'
|
7
|
+
|
8
|
+
module Arena
|
9
|
+
class Block < Arena::Base
|
10
|
+
include Arena::Creatable
|
11
|
+
|
12
|
+
attr_reader :id, :title, :generated_title, :state, :comment_count, :content,
|
13
|
+
:content_html, :description, :description_html, :position, :selected,
|
14
|
+
:connection_id, :connected_at, :connected_by_user_id, :connected_by_username
|
15
|
+
|
16
|
+
def user
|
17
|
+
@user ||= Arena::User.new(@attrs.dup['user'])
|
18
|
+
end
|
19
|
+
|
20
|
+
def _class
|
21
|
+
@_class ||= @attrs.dup['class']
|
22
|
+
end
|
23
|
+
|
24
|
+
def _base_class
|
25
|
+
@_base_class ||= @attrs.dup['base_class']
|
26
|
+
end
|
27
|
+
|
28
|
+
def source
|
29
|
+
@source ||= Arena::Entity::Source.new(@attrs.dup['source'])
|
30
|
+
end
|
31
|
+
|
32
|
+
def image
|
33
|
+
@image ||= Arena::Entity::Image.new(@attrs.dup['image'])
|
34
|
+
end
|
35
|
+
|
36
|
+
def attachment
|
37
|
+
@attachment ||= Arena::Entity::Attachment.new(@attrs.dup['attachment'])
|
38
|
+
end
|
39
|
+
|
40
|
+
def connections
|
41
|
+
@connections ||= @attrs['connections'].collect { |channel| Arena::Channel.new(channel) }
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
class Text < Block; end
|
47
|
+
class Image < Block; end
|
48
|
+
class Link < Block; end
|
49
|
+
class Media < Block; end
|
50
|
+
class Attachment < Block; end
|
51
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'arena/base'
|
2
|
+
require 'arena/creatable'
|
3
|
+
require 'arena/user'
|
4
|
+
require 'arena/block'
|
5
|
+
|
6
|
+
module Arena
|
7
|
+
class Channel < Arena::Base
|
8
|
+
include Arena::Creatable
|
9
|
+
|
10
|
+
attr_reader :id, :title, :published, :open, :collaboration,
|
11
|
+
:slug, :length, :kind, :status, :user_id, :total_pages,
|
12
|
+
:current_page, :per, :follower_count
|
13
|
+
|
14
|
+
def user
|
15
|
+
@user ||= Arena::User.new(@attrs['user'])
|
16
|
+
end
|
17
|
+
|
18
|
+
def _class
|
19
|
+
@attrs['class']
|
20
|
+
end
|
21
|
+
|
22
|
+
def _base_class
|
23
|
+
@attrs['base_class']
|
24
|
+
end
|
25
|
+
|
26
|
+
def contents
|
27
|
+
@contents ||= @attrs['contents'].collect { |object| "Arena::#{object['class']}".constantize.new(object) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def collaborators
|
31
|
+
@collaborators ||= @attrs['collaborators'].collect { |user| Arena::User.new(user) }
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
data/lib/arena/client.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'arena/configurable'
|
2
|
+
require 'arena/error'
|
3
|
+
require 'arena/api'
|
2
4
|
require 'httparty'
|
3
5
|
require 'json'
|
4
6
|
|
@@ -7,6 +9,7 @@ module Arena
|
|
7
9
|
class Client
|
8
10
|
include HTTParty
|
9
11
|
include Arena::Configurable
|
12
|
+
include Arena::API
|
10
13
|
|
11
14
|
def initialize(options={})
|
12
15
|
Arena::Configurable.keys.each do |key|
|
@@ -14,30 +17,31 @@ module Arena
|
|
14
17
|
end
|
15
18
|
end
|
16
19
|
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
+
# Performs HTTP GET POST PUT and DELETE requests
|
21
|
+
%w(get post put delete).each do |method|
|
22
|
+
define_method method do |path, options={}|
|
23
|
+
options = { query: options,
|
24
|
+
headers: { 'Authorization' => "Bearer #{@access_token}" } }
|
25
|
+
|
26
|
+
request(__method__, path, options)
|
27
|
+
end
|
20
28
|
end
|
21
29
|
|
22
|
-
|
23
|
-
get_json "/channels?user=#{id}", options
|
24
|
-
end
|
30
|
+
private
|
25
31
|
|
26
|
-
def
|
27
|
-
|
28
|
-
end
|
32
|
+
def request(method, path, options)
|
33
|
+
JSON.parse self.class.send(method, "http://#{@base_domain}/#{@api_version}#{path}", options).body
|
29
34
|
|
30
|
-
|
31
|
-
|
32
|
-
end
|
35
|
+
rescue JSON::ParserError, TypeError
|
36
|
+
nil
|
33
37
|
|
34
|
-
|
38
|
+
rescue Exception => exception
|
39
|
+
puts exception.inspect
|
40
|
+
puts exception.backtrace
|
35
41
|
|
36
|
-
|
37
|
-
JSON.parse(
|
38
|
-
(self.class.get "http://#{@base_domain}/api/#{@api_version}#{path}", options).body
|
39
|
-
)
|
42
|
+
raise Arena::Error
|
40
43
|
end
|
44
|
+
|
41
45
|
end
|
42
46
|
|
43
|
-
end
|
47
|
+
end
|
data/lib/arena/configurable.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
module Arena
|
2
2
|
module Configurable
|
3
|
-
|
4
|
-
|
5
|
-
:base_domain,
|
6
|
-
:api_version,
|
7
|
-
] unless defined? CONFIG_KEYS
|
8
|
-
|
9
|
-
attr_accessor *CONFIG_KEYS
|
3
|
+
attr_writer :application_id, :application_secret, :access_token
|
4
|
+
attr_accessor :base_domain, :api_version
|
10
5
|
|
11
6
|
class << self
|
12
7
|
def keys
|
13
|
-
@keys ||=
|
8
|
+
@keys ||= [
|
9
|
+
:base_domain,
|
10
|
+
:api_version,
|
11
|
+
:application_id,
|
12
|
+
:application_secret,
|
13
|
+
:access_token
|
14
|
+
]
|
14
15
|
end
|
15
16
|
end
|
16
17
|
|
@@ -38,4 +39,4 @@ module Arena
|
|
38
39
|
end
|
39
40
|
|
40
41
|
end
|
41
|
-
end
|
42
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'time'
|
2
|
+
|
3
|
+
module Arena
|
4
|
+
module Creatable
|
5
|
+
|
6
|
+
# Time when the object was created on Arena
|
7
|
+
#
|
8
|
+
# @return [Time]
|
9
|
+
def created_at
|
10
|
+
@created_at ||= Time.parse(@attrs['created_at']) if created?
|
11
|
+
end
|
12
|
+
|
13
|
+
# Time when the object was last updated on Arena
|
14
|
+
#
|
15
|
+
# @return [Time]
|
16
|
+
def updated_at
|
17
|
+
@updated_at ||= Time.parse(@attrs['updated_at']) if updated?
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def created?
|
23
|
+
!@attrs['created_at'].nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
def updated?
|
27
|
+
!@attrs['updated_at'].nil?
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
data/lib/arena/default.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Arena
|
2
2
|
module Default
|
3
|
-
BASE_DOMAIN = "are.na" unless defined? BASE_DOMAIN
|
4
|
-
API_VERSION = "
|
3
|
+
BASE_DOMAIN = "api.are.na" unless defined? BASE_DOMAIN
|
4
|
+
API_VERSION = "v2" unless defined? API_VERSION
|
5
5
|
|
6
6
|
class << self
|
7
7
|
# @return [Hash]
|
@@ -16,6 +16,18 @@ module Arena
|
|
16
16
|
def base_domain
|
17
17
|
BASE_DOMAIN
|
18
18
|
end
|
19
|
+
|
20
|
+
def application_id
|
21
|
+
ENV['APPLICATION_ID']
|
22
|
+
end
|
23
|
+
|
24
|
+
def application_secret
|
25
|
+
ENV['APPLICATION_SECRET']
|
26
|
+
end
|
27
|
+
|
28
|
+
def access_token
|
29
|
+
ENV['APPLICATION_SECRET']
|
30
|
+
end
|
19
31
|
end
|
20
32
|
end
|
21
33
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'arena/creatable'
|
2
|
+
require 'arena/entity'
|
3
|
+
require 'arena/entities/version'
|
4
|
+
|
5
|
+
module Arena
|
6
|
+
class Entity
|
7
|
+
class Image < Arena::Entity
|
8
|
+
include Arena::Creatable
|
9
|
+
|
10
|
+
attr_reader :filename, :content_type
|
11
|
+
|
12
|
+
%w(thumb display original).each do |method|
|
13
|
+
define_method method do
|
14
|
+
instance_variable_set("@#{method}", Arena::Entity::Version.new(@attrs.dup[method])) unless instance_variable_get "@#{method}"
|
15
|
+
instance_variable_get "@#{method}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'arena/entity'
|
2
|
+
require 'arena/entities/provider'
|
3
|
+
|
4
|
+
module Arena
|
5
|
+
class Entity
|
6
|
+
class Source < Arena::Entity
|
7
|
+
attr_reader :url
|
8
|
+
|
9
|
+
def provider
|
10
|
+
@provider ||= Arena::Entity::Provider.new(@attrs.dup['provider'])
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/arena/entity.rb
ADDED
data/lib/arena/error.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'arena/base'
|
2
|
+
require 'arena/channel'
|
3
|
+
|
4
|
+
module Arena
|
5
|
+
class Results < Arena::Base
|
6
|
+
attr_reader :length, :total_pages, :current_page, :per
|
7
|
+
end
|
8
|
+
|
9
|
+
class ChannelResults < Results
|
10
|
+
def channels
|
11
|
+
@channels ||= @attrs.dup['channels'].collect { |channel| Arena::Channel.new(channel) }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'arena/core_ext/string'
|
2
|
+
require 'arena/base'
|
3
|
+
require 'arena/channel'
|
4
|
+
require 'arena/user'
|
5
|
+
require 'arena/block'
|
6
|
+
|
7
|
+
module Arena
|
8
|
+
class SearchResults < Arena::Base
|
9
|
+
def term
|
10
|
+
@attrs['term'] unless @attrs['term'].nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
%w(user channel block).each do |method|
|
14
|
+
define_method "#{method}s" do
|
15
|
+
instance_variable_set("@#{method}s",
|
16
|
+
@attrs.dup["#{method}s"].collect { |element| "Arena::#{method.capitalize}".constantize.new(element) }
|
17
|
+
) unless instance_variable_get "@#{method}s"
|
18
|
+
instance_variable_get "@#{method}s"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/arena/user.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'arena/base'
|
2
|
+
require 'arena/creatable'
|
3
|
+
|
4
|
+
module Arena
|
5
|
+
class User < Arena::Base
|
6
|
+
include Arena::Creatable
|
7
|
+
|
8
|
+
attr_reader :id, :slug, :username, :first_name, :last_name,
|
9
|
+
:full_name, :avatar, :email, :channel_count, :following_count,
|
10
|
+
:profile_id, :follower_count, :initials
|
11
|
+
|
12
|
+
def _class
|
13
|
+
@attrs.dup['class']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/arena/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arena
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -73,9 +73,25 @@ files:
|
|
73
73
|
- Rakefile
|
74
74
|
- arena.gemspec
|
75
75
|
- lib/arena.rb
|
76
|
+
- lib/arena/api.rb
|
77
|
+
- lib/arena/base.rb
|
78
|
+
- lib/arena/block.rb
|
79
|
+
- lib/arena/channel.rb
|
76
80
|
- lib/arena/client.rb
|
77
81
|
- lib/arena/configurable.rb
|
82
|
+
- lib/arena/core_ext/string.rb
|
83
|
+
- lib/arena/creatable.rb
|
78
84
|
- lib/arena/default.rb
|
85
|
+
- lib/arena/entities/attachment.rb
|
86
|
+
- lib/arena/entities/image.rb
|
87
|
+
- lib/arena/entities/provider.rb
|
88
|
+
- lib/arena/entities/source.rb
|
89
|
+
- lib/arena/entities/version.rb
|
90
|
+
- lib/arena/entity.rb
|
91
|
+
- lib/arena/error.rb
|
92
|
+
- lib/arena/results.rb
|
93
|
+
- lib/arena/search_results.rb
|
94
|
+
- lib/arena/user.rb
|
79
95
|
- lib/arena/version.rb
|
80
96
|
- test/lib/arena/version_test.rb
|
81
97
|
- test/test_helper.rb
|