thecity 0.0.2
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/LICENSE.md +45 -0
- data/README.md +170 -0
- data/Rakefile +11 -0
- data/lib/the_city/account.rb +32 -0
- data/lib/the_city/api/accounts.rb +34 -0
- data/lib/the_city/api/client.rb +136 -0
- data/lib/the_city/api/events.rb +55 -0
- data/lib/the_city/api/groups.rb +41 -0
- data/lib/the_city/api/needs.rb +51 -0
- data/lib/the_city/api/oauth.rb +50 -0
- data/lib/the_city/api/prayers.rb +51 -0
- data/lib/the_city/api/request/multipart_with_file.rb +36 -0
- data/lib/the_city/api/response/parse_json.rb +27 -0
- data/lib/the_city/api/response/raise_error.rb +28 -0
- data/lib/the_city/api/topics.rb +51 -0
- data/lib/the_city/api/users.rb +78 -0
- data/lib/the_city/api/utils.rb +58 -0
- data/lib/the_city/arguments.rb +11 -0
- data/lib/the_city/base.rb +133 -0
- data/lib/the_city/client.rb +94 -0
- data/lib/the_city/collection.rb +130 -0
- data/lib/the_city/content.rb +29 -0
- data/lib/the_city/error/argument_arror.rb +8 -0
- data/lib/the_city/error/bad_gateway.rb +10 -0
- data/lib/the_city/error/bad_request.rb +10 -0
- data/lib/the_city/error/configuration_error.rb +8 -0
- data/lib/the_city/error/forbidden.rb +10 -0
- data/lib/the_city/error/gateway_timeout.rb +10 -0
- data/lib/the_city/error/internal_server_error.rb +10 -0
- data/lib/the_city/error/not_acceptable.rb +10 -0
- data/lib/the_city/error/not_found.rb +10 -0
- data/lib/the_city/error/service_unavailable.rb +10 -0
- data/lib/the_city/error/too_many_requests.rb +12 -0
- data/lib/the_city/error/unauthorized.rb +10 -0
- data/lib/the_city/error/unprocessable_entity.rb +10 -0
- data/lib/the_city/error.rb +66 -0
- data/lib/the_city/event.rb +11 -0
- data/lib/the_city/group.rb +6 -0
- data/lib/the_city/need.rb +10 -0
- data/lib/the_city/permissions.rb +21 -0
- data/lib/the_city/prayer.rb +10 -0
- data/lib/the_city/rate_limit.rb +17 -0
- data/lib/the_city/terminology.rb +39 -0
- data/lib/the_city/time.rb +67 -0
- data/lib/the_city/token.rb +16 -0
- data/lib/the_city/topic.rb +10 -0
- data/lib/the_city/user.rb +41 -0
- data/lib/the_city/version.rb +18 -0
- data/lib/the_city.rb +15 -0
- data/thecity.gemspec +28 -0
- metadata +172 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'the_city/time'
|
2
|
+
|
3
|
+
module TheCity
|
4
|
+
# Base class for The City content types: Topics, Events, Prayers, Needs, and Albums
|
5
|
+
#
|
6
|
+
# @!attribute [r] title
|
7
|
+
# @return [String] The title of the post.
|
8
|
+
# @!attribute [r] body
|
9
|
+
# @return [String] The body text of the post.
|
10
|
+
# @!attribute [r] id
|
11
|
+
# @return [Integer] The id associated with the church account.
|
12
|
+
# @!attribute [r] group
|
13
|
+
# @return [TheCity::Group] The group where the content originated.
|
14
|
+
# @!attribute [r] author
|
15
|
+
# @return [TheCity::User] The user who posted the content.
|
16
|
+
|
17
|
+
class Content < TheCity::Base
|
18
|
+
include TheCity::Time
|
19
|
+
attr_reader :id, :title, :body
|
20
|
+
object_attr_reader :User, :user
|
21
|
+
object_attr_reader :Group, :group
|
22
|
+
|
23
|
+
# def user
|
24
|
+
# @user
|
25
|
+
# end
|
26
|
+
alias author user
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'the_city/error'
|
2
|
+
|
3
|
+
module TheCity
|
4
|
+
class Error
|
5
|
+
# Raised when The City returns the HTTP status code 429
|
6
|
+
class TooManyRequests < TheCity::Error
|
7
|
+
HTTP_STATUS_CODE = 429
|
8
|
+
end
|
9
|
+
EnhanceYourCalm = TooManyRequests
|
10
|
+
RateLimited = TooManyRequests
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'the_city/rate_limit'
|
2
|
+
|
3
|
+
module TheCity
|
4
|
+
# Custom error class for rescuing from all The City API errors
|
5
|
+
class Error < StandardError
|
6
|
+
attr_reader :rate_limit, :wrapped_exception, :code
|
7
|
+
|
8
|
+
# Create a new error from an HTTP response
|
9
|
+
#
|
10
|
+
# @param response [Hash]
|
11
|
+
# @return [TheCity::Error]
|
12
|
+
def self.from_response(response={})
|
13
|
+
error, code = parse_error(response[:body])
|
14
|
+
new(error, response[:response_headers], code)
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Hash]
|
18
|
+
def self.errors
|
19
|
+
@errors ||= descendants.inject({}) do |hash, klass|
|
20
|
+
hash[klass::HTTP_STATUS_CODE] = klass
|
21
|
+
hash
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Array]
|
26
|
+
def self.descendants
|
27
|
+
@descendants ||= []
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Array]
|
31
|
+
def self.inherited(descendant)
|
32
|
+
descendants << descendant
|
33
|
+
end
|
34
|
+
|
35
|
+
# Initializes a new Error object
|
36
|
+
#
|
37
|
+
# @param exception [Exception, String]
|
38
|
+
# @param response_headers [Hash]
|
39
|
+
# @param code [Integer]
|
40
|
+
# @return [TheCity::Error]
|
41
|
+
def initialize(exception=$!, response_headers={}, code=nil)
|
42
|
+
@rate_limit = TheCity::RateLimit.new(response_headers)
|
43
|
+
@wrapped_exception = exception
|
44
|
+
@code = code
|
45
|
+
exception.respond_to?(:message) ? super(exception.message) : super(exception.to_s)
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def self.parse_error(body)
|
51
|
+
if body.nil?
|
52
|
+
['', nil]
|
53
|
+
elsif body[:error]
|
54
|
+
[body[:error], nil]
|
55
|
+
elsif body[:errors]
|
56
|
+
first = Array(body[:errors]).first
|
57
|
+
if first.is_a?(Hash)
|
58
|
+
[first[:message].chomp, first[:code]]
|
59
|
+
else
|
60
|
+
[first.chomp, nil]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module TheCity
|
2
|
+
# The permissions associated with the current user
|
3
|
+
#
|
4
|
+
# @!attribute [r] can_list_in_plaza
|
5
|
+
# @return [Boolean] The name of the church, 'Grace Church'.
|
6
|
+
# @!attribute [r] member
|
7
|
+
# @return [Boolean] The subdomain used to access this account, subdomain.onthecity.org
|
8
|
+
# @!attribute [r] staff
|
9
|
+
# @return [Boolean] The id associated with the church account
|
10
|
+
# @!attribute [r] admin
|
11
|
+
# @return [Boolean] The id associated with the church account
|
12
|
+
# @!attribute [r] can_create_in_group_ids
|
13
|
+
# @return [Hash] The id associated with the church account
|
14
|
+
# @!attribute [r] admin_privileges
|
15
|
+
# @return [Array] An array of admin privileges the user has on the current account
|
16
|
+
|
17
|
+
class Permissions < TheCity::Base
|
18
|
+
attr_reader :can_list_in_plaza, :member, :staff, :admin, :can_create_in_group_ids, :admin_privileges
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TheCity
|
2
|
+
class RateLimit < TheCity::Base
|
3
|
+
|
4
|
+
# @return [Integer]
|
5
|
+
def limit
|
6
|
+
limit = @attrs['x-rate-limit-limit']
|
7
|
+
limit.to_i if limit
|
8
|
+
end
|
9
|
+
|
10
|
+
# @return [Integer]
|
11
|
+
def remaining
|
12
|
+
remaining = @attrs['x-rate-limit-remaining']
|
13
|
+
remaining.to_i if remaining
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module TheCity
|
2
|
+
# The terminology overrides for a City account
|
3
|
+
#
|
4
|
+
# @!attribute [r] connect
|
5
|
+
# @return [String] The name this account uses for Connect groups.
|
6
|
+
# @!attribute [r] campus
|
7
|
+
# @return [String] The name this account uses for Campus groups.
|
8
|
+
# @!attribute [r] redemption
|
9
|
+
# @return [String] The name this account uses for Redemption groups.
|
10
|
+
# @!attribute [r] seed
|
11
|
+
# @return [String] The name this account uses for Seed groups.
|
12
|
+
# @!attribute [r] band
|
13
|
+
# @return [String] The name this account uses for Band groups.
|
14
|
+
# @!attribute [r] other
|
15
|
+
# @return [String] The name this account uses for Other groups.
|
16
|
+
# @!attribute [r] neighborhood
|
17
|
+
# @return [String] The name this account uses for Neighborhood groups.
|
18
|
+
# @!attribute [r] network
|
19
|
+
# @return [String] The name this account uses for Network groups.
|
20
|
+
# @!attribute [r] leader
|
21
|
+
# @return [String] The name this account uses for Leader groups.
|
22
|
+
# @!attribute [r] community
|
23
|
+
# @return [String] The name this account uses for Community groups.
|
24
|
+
# @!attribute [r] service
|
25
|
+
# @return [String] The name this account uses for Service groups.
|
26
|
+
# @!attribute [r] church
|
27
|
+
# @return [String] The name this account uses for the Church group.
|
28
|
+
# @!attribute [r] staff
|
29
|
+
# @return [String] The label this account uses for 'Staff'.
|
30
|
+
# @!attribute [r] member
|
31
|
+
# @return [String] The label this account uses for 'Member'.
|
32
|
+
# @!attribute [r] pledge
|
33
|
+
# @return [String] The label this account uses for 'Pledge'.
|
34
|
+
class Terminology < TheCity::Base
|
35
|
+
attr_reader :connect, :campus, :redemption, :member, :seed,
|
36
|
+
:church, :service, :community, :staff, :pledge, :leader,
|
37
|
+
:neighborhood, :other, :network, :band
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'time'
|
2
|
+
#require 'tzinfo'
|
3
|
+
#require 'tzinfo-data'
|
4
|
+
|
5
|
+
module TheCity
|
6
|
+
module Time
|
7
|
+
|
8
|
+
# Time when the object was created
|
9
|
+
#
|
10
|
+
# @return [Time]
|
11
|
+
def created_at
|
12
|
+
@created_at ||= parse_or_at(@attrs[:created_at]) if @attrs[:created_at]
|
13
|
+
end
|
14
|
+
|
15
|
+
def created?
|
16
|
+
!!@attrs[:created_at]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Time when the object was updated
|
20
|
+
#
|
21
|
+
# @return [Time]
|
22
|
+
def updated_at
|
23
|
+
@updated_at ||= parse_or_at(@attrs[:updated_at]) if @attrs[:updated_at]
|
24
|
+
end
|
25
|
+
|
26
|
+
def updated?
|
27
|
+
!!@attrs[:updated_at]
|
28
|
+
end
|
29
|
+
|
30
|
+
# Time when the object starts
|
31
|
+
#
|
32
|
+
# @return [Time]
|
33
|
+
def starting_at
|
34
|
+
@starting_at ||= parse_or_at(@attrs[:starting_at]) if @attrs[:starting_at]
|
35
|
+
end
|
36
|
+
|
37
|
+
def started?
|
38
|
+
!!@attrs[:starting_at] and starting_at <= Time.now
|
39
|
+
end
|
40
|
+
|
41
|
+
# Time when the object ends
|
42
|
+
#
|
43
|
+
# @return [Time]
|
44
|
+
def ending_at
|
45
|
+
@ending_at ||= parse_or_at(@attrs[:ending_at]) if @attrs[:ending_at]
|
46
|
+
end
|
47
|
+
|
48
|
+
def ended?
|
49
|
+
!!@attrs[:ending_at] and ending_at <= Time.now
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def parse_or_at(time)
|
55
|
+
begin
|
56
|
+
if time.is_a? Integer
|
57
|
+
return Time.at(time).utc
|
58
|
+
else
|
59
|
+
return Time.parse(time).utc
|
60
|
+
end
|
61
|
+
rescue
|
62
|
+
return nil
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'the_city/base'
|
2
|
+
|
3
|
+
module TheCity
|
4
|
+
class Token < TheCity::Base
|
5
|
+
attr_reader :access_token, :token_type
|
6
|
+
alias to_s access_token
|
7
|
+
|
8
|
+
BEARER_TYPE = "bearer"
|
9
|
+
|
10
|
+
# @return [Boolean]
|
11
|
+
def bearer?
|
12
|
+
@attrs[:token_type] == BEARER_TYPE
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module TheCity
|
2
|
+
class User < TheCity::Base
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
attr_reader :id, :name, :profile_picture, :gender
|
6
|
+
attr_writer :permissions
|
7
|
+
|
8
|
+
def_delegators :@permissions, :member?, :staff?, :admin?
|
9
|
+
|
10
|
+
# Returns the groups that the user belongs to
|
11
|
+
#
|
12
|
+
# @return [Array<TheCity::Group>]
|
13
|
+
def groups
|
14
|
+
memoize(:groups) do
|
15
|
+
Array(@attrs[:groups]).map do |g|
|
16
|
+
TheCity::Group.new(g)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns the permissions for the current user
|
22
|
+
#
|
23
|
+
# @return [TheCity::Permissions]
|
24
|
+
def permissions
|
25
|
+
@permissions ||= @client.permissions if (@client and @client.current_user.id == id)
|
26
|
+
end
|
27
|
+
|
28
|
+
# def member?
|
29
|
+
# permissions.member? rescue false
|
30
|
+
# end
|
31
|
+
|
32
|
+
# def staff?
|
33
|
+
# permissions.staff? rescue false
|
34
|
+
# end
|
35
|
+
|
36
|
+
# def admin?
|
37
|
+
# permissions.admin? rescue false
|
38
|
+
# end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
data/lib/the_city.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'uri'
|
2
|
+
|
3
|
+
require 'the_city/base'
|
4
|
+
require 'the_city/api/client'
|
5
|
+
|
6
|
+
require 'the_city/collection'
|
7
|
+
require 'the_city/rate_limit'
|
8
|
+
require 'the_city/terminology'
|
9
|
+
require 'the_city/permissions'
|
10
|
+
|
11
|
+
require 'the_city/account'
|
12
|
+
require 'the_city/user'
|
13
|
+
require 'the_city/group'
|
14
|
+
require 'the_city/topic'
|
15
|
+
|
data/thecity.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'the_city/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.add_dependency 'faraday', ['>= 0.8', '< 0.10']
|
7
|
+
spec.add_dependency 'http', '~> 0.5.0'
|
8
|
+
spec.add_dependency 'http_parser.rb', '~> 0.5.3'
|
9
|
+
spec.add_dependency 'json', '~> 1.8'
|
10
|
+
#spec.add_dependency 'simple_oauth', '~> 0.2.0'
|
11
|
+
#spec.add_dependency 'tzinfo', '~> 1.0.1'
|
12
|
+
#spec.add_dependency 'tzinfo-data', "~> 1.2013.4"
|
13
|
+
spec.add_development_dependency 'bundler', '~> 1.0'
|
14
|
+
spec.authors = ["robertleib"]
|
15
|
+
spec.description = %q{A Ruby interface to The City API.}
|
16
|
+
spec.email = ["robert.leib@gmail.com"]
|
17
|
+
spec.files = %w(CHANGELOG.md LICENSE.md README.md Rakefile thecity.gemspec)
|
18
|
+
spec.files += Dir.glob("lib/**/*.rb")
|
19
|
+
spec.files += Dir.glob("spec/**/*")
|
20
|
+
spec.homepage = 'http://github.com/robertleib/thecity-ruby/'
|
21
|
+
spec.licenses = ['MIT']
|
22
|
+
spec.name = 'thecity'
|
23
|
+
spec.require_paths = ['lib']
|
24
|
+
spec.required_rubygems_version = '>= 1.3.5'
|
25
|
+
spec.summary = spec.description
|
26
|
+
spec.test_files = Dir.glob("spec/**/*")
|
27
|
+
spec.version = TheCity::Version
|
28
|
+
end
|