mashery 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +13 -0
- data/README.textile +27 -0
- data/Rakefile +12 -0
- data/VERSION +1 -0
- data/lib/mashery.rb +18 -0
- data/lib/mashery/api_object_base.rb +26 -0
- data/lib/mashery/client.rb +37 -0
- data/lib/mashery/exceptions.rb +24 -0
- data/lib/mashery/key.rb +22 -0
- data/lib/mashery/member.rb +24 -0
- data/lib/mashery/role.rb +20 -0
- data/mashery.gemspec +51 -0
- data/tasks/mashery.thor +197 -0
- metadata +77 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright 2010 Outside.in
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.textile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
A Ruby library for the "Mashery API":http://support.mashery.com/docs/mashery_api.
|
2
|
+
|
3
|
+
h2. Prerequisites
|
4
|
+
|
5
|
+
Install the gem dependencies (see "gembundler.com":http://gembundler.com/ if you aren't familiar with Bundler):
|
6
|
+
|
7
|
+
@$ bundle install@
|
8
|
+
|
9
|
+
h2. Calling methods from the command line
|
10
|
+
|
11
|
+
A set of Thor tasks are provided so that you can call API methods from the command line (read more about Thor at
|
12
|
+
"http://github.com/wycats/thor":http://github.com/wycats/thor).
|
13
|
+
|
14
|
+
The following examples assume you have Thor installed system-wide. If it's local to your bundle, then replace
|
15
|
+
@thor@ with @bundle exec thor@.
|
16
|
+
|
17
|
+
You can see all available Mashery tasks with this command:
|
18
|
+
|
19
|
+
@$ thor list mashery@
|
20
|
+
|
21
|
+
h3. Environment
|
22
|
+
|
23
|
+
Before you can successfully call an API method, you must set these environment variables:
|
24
|
+
|
25
|
+
bc. $ export MASHERY_SITE_ID=666
|
26
|
+
$ export MASHERY_API_KEY=cafebebedeadbeefcafebebedeadbeef
|
27
|
+
$ export MASHERY_SHARED_SECRET=blahblahblah
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |gemspec|
|
4
|
+
gemspec.name = "mashery"
|
5
|
+
gemspec.summary = "A Ruby library for the Mashery API"
|
6
|
+
gemspec.email = "brian@outside.in"
|
7
|
+
gemspec.homepage = "http://github.com/outsidein/mashery-rb"
|
8
|
+
gemspec.authors = ["Brian Moseley"]
|
9
|
+
end
|
10
|
+
rescue LoadError
|
11
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
12
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.9
|
data/lib/mashery.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'mashery/exceptions'
|
2
|
+
require 'mashery/client'
|
3
|
+
require 'mashery/api_object_base'
|
4
|
+
require 'mashery/member'
|
5
|
+
require 'mashery/key'
|
6
|
+
require 'mashery/role'
|
7
|
+
|
8
|
+
module Mashery
|
9
|
+
mattr_accessor :client
|
10
|
+
@@client = nil
|
11
|
+
|
12
|
+
mattr_accessor :logger, :instance_writer => false
|
13
|
+
@@logger = Logger.new(STDOUT)
|
14
|
+
@@logger.level = Logger::WARN
|
15
|
+
|
16
|
+
mattr_accessor :test_mode, :instance_writer => false
|
17
|
+
@@test_mode = true
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Mashery
|
2
|
+
class ApiObjectBase
|
3
|
+
def self.create(fields = {})
|
4
|
+
# XXX: only send fields that aren't read-only
|
5
|
+
new(Mashery.client.call_remote(method('create'), fields))
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.fetch(id)
|
9
|
+
data = Mashery.client.call_remote(method('fetch'), id)
|
10
|
+
data.nil?? nil : new(data)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.delete(id)
|
14
|
+
Mashery.client.call_remote(method('delete'), id)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.method(basename)
|
18
|
+
"#{name.split(/\:\:/).last.downcase}.#{basename}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(data)
|
22
|
+
# XXX: use setter methods
|
23
|
+
data.each_pair {|k, v| instance_variable_set("@#{k}".to_sym, v)}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'json'
|
3
|
+
require 'httparty'
|
4
|
+
require 'md5'
|
5
|
+
|
6
|
+
module Mashery
|
7
|
+
class Client
|
8
|
+
TEST_HOST = 'api.sandbox.mashery.com'
|
9
|
+
PRODUCTION_HOST= 'api.mashery.com'
|
10
|
+
|
11
|
+
def initialize(site_id, key, secret)
|
12
|
+
host = Mashery.test_mode ? TEST_HOST : PRODUCTION_HOST
|
13
|
+
@uri = "http://#{host}/v2/json-rpc/#{site_id}"
|
14
|
+
@key = key
|
15
|
+
@secret = secret
|
16
|
+
end
|
17
|
+
|
18
|
+
def echo(value)
|
19
|
+
call_remote('test.echo', value)
|
20
|
+
end
|
21
|
+
|
22
|
+
def call_remote(method, *params)
|
23
|
+
# all calls are synchronous, so id in request and response will always be 1
|
24
|
+
Mashery.logger.debug("Calling method #{method} with params #{params.inspect}") if Mashery.logger
|
25
|
+
req = ::JSON[{:version => '1.1', :method => method, :params => params, :id => 1}]
|
26
|
+
response = HTTParty.post(signed_uri, :body => req)
|
27
|
+
res = ::JSON[response.body]
|
28
|
+
raise Exception.create(res['error']) if res.include?('error')
|
29
|
+
res['result']
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
def signed_uri
|
34
|
+
"#{@uri}?apikey=#{@key}&sig=#{MD5.new(@key + @secret + Time.now.to_i.to_s).hexdigest}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Mashery
|
2
|
+
class Exception < ::Exception
|
3
|
+
def self.create(options = {})
|
4
|
+
case options['code']
|
5
|
+
when 1000 then ValidationException.new(options['data'])
|
6
|
+
when 1001 then DuplicateObjectException.new("#{options['message']} (JSON-RPC error #{options['code']})")
|
7
|
+
else JsonRpcException.new("#{options['message']} (JSON-RPC error #{options['code']})")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class JsonRpcException < Exception
|
13
|
+
end
|
14
|
+
|
15
|
+
class DuplicateObjectException < Exception
|
16
|
+
end
|
17
|
+
|
18
|
+
class ValidationException < Exception
|
19
|
+
attr_reader :errors
|
20
|
+
def initialize(errs= {})
|
21
|
+
@errors = errs
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/mashery/key.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Mashery
|
2
|
+
class Key < ApiObjectBase
|
3
|
+
attr_reader :id, :created, :updated, :service_key, :username, :limits
|
4
|
+
attr_accessor :apikey, :status, :rate_limit_ceiling, :qps_limit_ceiling, :rate_limit_exempt, :qps_limit_exempt,
|
5
|
+
:required_referer, :secret
|
6
|
+
|
7
|
+
def self.create(service_key, username, fields = {})
|
8
|
+
fields ||= {}
|
9
|
+
our_fields = fields.merge('service' => {'service_key' => service_key}, 'member' => {'username' => username})
|
10
|
+
super(our_fields)
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(data)
|
14
|
+
limits = data.delete('limits')
|
15
|
+
@limits = limits.map {|l| Limit.new(l['period'], l['source'], l['ceiling'])} if limits
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class Limit < Struct.new(:period, :source, :ceiling)
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Mashery
|
2
|
+
class Member < ApiObjectBase
|
3
|
+
attr_reader :created, :updated
|
4
|
+
attr_accessor :username, :email, :display_name, :uri, :blog, :im, :imsvc, :phone,
|
5
|
+
:company, :address1, :address2, :locality, :region, :postal_code, :country_code, :first_name, :last_name,
|
6
|
+
:registration_ipaddr, :area_status, :external_id, :passwd_new
|
7
|
+
|
8
|
+
def self.create(username, display_name, email, fields = {})
|
9
|
+
fields ||= {}
|
10
|
+
our_fields = fields.merge('username' => username, 'display_name' => display_name, 'email' => email)
|
11
|
+
super(our_fields)
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_role(role_or_id)
|
15
|
+
role_id = role_or_id.respond_to?(:id) ? role_or_id.id : role_or_id
|
16
|
+
Mashery.client.call_remote('member.addRole', {'username' => username}, {'id' => role_id})
|
17
|
+
end
|
18
|
+
|
19
|
+
def remove_role(role_or_id)
|
20
|
+
role_id = role_or_id.respond_to?(:id) ? role_or_id.id : role_or_id
|
21
|
+
Mashery.client.call_remote('member.removeRole', {'username' => username}, {'id' => role_id})
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/mashery/role.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Mashery
|
2
|
+
class Role < ApiObjectBase
|
3
|
+
attr_reader :id, :created, :updated, :is_assignable, :is_predefined
|
4
|
+
attr_accessor :name, :description
|
5
|
+
|
6
|
+
def assignable?
|
7
|
+
is_assignable == true
|
8
|
+
end
|
9
|
+
|
10
|
+
def predefined?
|
11
|
+
is_predefined == true
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.create(name, fields = {})
|
15
|
+
fields ||= {}
|
16
|
+
our_fields = fields.merge('name' => name)
|
17
|
+
super(our_fields)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/mashery.gemspec
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{mashery}
|
8
|
+
s.version = "0.0.9"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Brian Moseley"]
|
12
|
+
s.date = %q{2010-08-11}
|
13
|
+
s.email = %q{brian@outside.in}
|
14
|
+
s.extra_rdoc_files = [
|
15
|
+
"LICENSE.txt",
|
16
|
+
"README.textile"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"Gemfile",
|
21
|
+
"LICENSE.txt",
|
22
|
+
"README.textile",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION",
|
25
|
+
"lib/mashery.rb",
|
26
|
+
"lib/mashery/api_object_base.rb",
|
27
|
+
"lib/mashery/client.rb",
|
28
|
+
"lib/mashery/exceptions.rb",
|
29
|
+
"lib/mashery/key.rb",
|
30
|
+
"lib/mashery/member.rb",
|
31
|
+
"lib/mashery/role.rb",
|
32
|
+
"mashery.gemspec",
|
33
|
+
"tasks/mashery.thor"
|
34
|
+
]
|
35
|
+
s.homepage = %q{http://github.com/outsidein/mashery-rb}
|
36
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
s.rubygems_version = %q{1.3.6}
|
39
|
+
s.summary = %q{A Ruby library for the Mashery API}
|
40
|
+
|
41
|
+
if s.respond_to? :specification_version then
|
42
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
43
|
+
s.specification_version = 3
|
44
|
+
|
45
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
46
|
+
else
|
47
|
+
end
|
48
|
+
else
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
data/tasks/mashery.thor
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
Bundler.setup
|
4
|
+
|
5
|
+
# XXX: only do this when the task has not been installed
|
6
|
+
$: << 'lib'
|
7
|
+
|
8
|
+
require 'mashery'
|
9
|
+
|
10
|
+
module Mashery
|
11
|
+
class CLI < Thor
|
12
|
+
namespace :mashery
|
13
|
+
|
14
|
+
desc "echo VALUE", "Echo the provided value (tests connectivity and authentication)"
|
15
|
+
def echo(value)
|
16
|
+
run { ok(::Mashery.client.echo(value)) }
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
def run(&block)
|
21
|
+
site_id = ENV['MASHERY_SITE_ID'] or
|
22
|
+
raise Exception, "Please set the MASHERY_SITE_ID environment variable."
|
23
|
+
key = ENV['MASHERY_API_KEY'] or
|
24
|
+
raise Exception, "Please set the MASHERY_API_KEY environment variable."
|
25
|
+
secret = ENV['MASHERY_SHARED_SECRET'] or
|
26
|
+
raise Exception, "Please set the MASHERY_SHARED_SECRET environment variable."
|
27
|
+
::Mashery.client = ::Mashery::Client.new(site_id, key, secret)
|
28
|
+
::Mashery.logger.level = Logger::DEBUG
|
29
|
+
begin
|
30
|
+
yield
|
31
|
+
rescue ::Mashery::JsonRpcException => e
|
32
|
+
error(e.message)
|
33
|
+
rescue ::Mashery::ValidationException => e
|
34
|
+
e.errors.each {|err| warn("#{err['field']}: #{err['message']}")}
|
35
|
+
error("Unable to execute method due to validation errors")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def warn(msg)
|
40
|
+
say_status :WARN, msg, :yellow
|
41
|
+
end
|
42
|
+
|
43
|
+
def ok(msg)
|
44
|
+
say_status :OK, msg
|
45
|
+
end
|
46
|
+
|
47
|
+
def error(msg)
|
48
|
+
say_status :ERROR, msg, :red
|
49
|
+
end
|
50
|
+
|
51
|
+
def debug(msg)
|
52
|
+
say_status :DEBUG, msg, :cyan
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class MemberCLI < CLI
|
57
|
+
namespace 'mashery:member'
|
58
|
+
|
59
|
+
desc "create USERNAME DISPLAY_NAME EMAIL [--fields ...]", "Create a member"
|
60
|
+
method_option :fields, :type => :hash
|
61
|
+
def create(username, display_name, email)
|
62
|
+
run do
|
63
|
+
begin
|
64
|
+
member = ::Mashery::Member.create(username, display_name, email, options[:fields])
|
65
|
+
ok("Member #{member.username} created")
|
66
|
+
rescue ::Mashery::DuplicateObjectException
|
67
|
+
error("The username #{username} has already been claimed")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
desc "fetch USERNAME", "Fetch a member"
|
73
|
+
def fetch(username)
|
74
|
+
run do
|
75
|
+
member = ::Mashery::Member.fetch(username)
|
76
|
+
if member
|
77
|
+
ok("Member #{username} found")
|
78
|
+
say(member.to_yaml)
|
79
|
+
else
|
80
|
+
warn("Member #{username} not found")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
desc "addrole USERNAME ROLE_ID", "Assign a role to a member"
|
86
|
+
def addrole(username, role_id)
|
87
|
+
run do
|
88
|
+
member = ::Mashery::Member.fetch(username)
|
89
|
+
if member
|
90
|
+
role = ::Mashery::Role.fetch(role_id.to_i)
|
91
|
+
if role
|
92
|
+
member.add_role(role)
|
93
|
+
ok("Role #{role.name} assigned to member #{username}")
|
94
|
+
else
|
95
|
+
warn("Role #{role_id} not found")
|
96
|
+
end
|
97
|
+
else
|
98
|
+
warn("Member #{username} not found")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
desc "rmrole USERNAME ROLE_ID", "Revoke a role from a member"
|
104
|
+
def rmrole(username, role_id)
|
105
|
+
run do
|
106
|
+
member = ::Mashery::Member.fetch(username)
|
107
|
+
if member
|
108
|
+
role = ::Mashery::Role.fetch(role_id.to_i)
|
109
|
+
if role
|
110
|
+
member.remove_role(role)
|
111
|
+
ok("Role #{role.name} revoked from member #{username}")
|
112
|
+
else
|
113
|
+
warn("Role #{role_id} not found")
|
114
|
+
end
|
115
|
+
else
|
116
|
+
warn("Member #{username} not found")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
desc "delete USERNAME", "Delete a member"
|
122
|
+
def delete(username)
|
123
|
+
run do
|
124
|
+
::Mashery::Member.delete(username)
|
125
|
+
ok("Member #{username} deleted")
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
class KeyCLI < CLI
|
131
|
+
namespace 'mashery:key'
|
132
|
+
|
133
|
+
desc "create SERVICE_KEY USERNAME [--fields ...]", "Create a key"
|
134
|
+
method_option :fields, :type => :hash
|
135
|
+
def create(service_key, username)
|
136
|
+
run do
|
137
|
+
key = ::Mashery::Key.create(service_key, username, options[:fields])
|
138
|
+
ok("Key #{key.id} created for member #{username} and service #{service_key}")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
desc "fetch ID", "Fetch a key"
|
143
|
+
def fetch(id)
|
144
|
+
run do
|
145
|
+
key = ::Mashery::Key.fetch(id.to_i)
|
146
|
+
if key
|
147
|
+
ok("Key #{id} found")
|
148
|
+
say(key.to_yaml)
|
149
|
+
else
|
150
|
+
warn("Key #{id} not found")
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
desc "delete ID", "Delete a key"
|
156
|
+
def delete(id)
|
157
|
+
run do
|
158
|
+
::Mashery::Key.delete(id.to_i)
|
159
|
+
ok("Key #{id} deleted")
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
class RoleCLI < CLI
|
165
|
+
namespace 'mashery:role'
|
166
|
+
|
167
|
+
desc "create NAME [--fields ...]", "Create a role"
|
168
|
+
method_option :fields, :type => :hash
|
169
|
+
def create(name)
|
170
|
+
run do
|
171
|
+
role = ::Mashery::Role.create(name, options[:fields])
|
172
|
+
ok("Role #{role.id} created with name #{name}")
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
desc "fetch ID", "Fetch a role"
|
177
|
+
def fetch(id)
|
178
|
+
run do
|
179
|
+
role = ::Mashery::Role.fetch(id.to_i)
|
180
|
+
if role
|
181
|
+
ok("Role #{id} found")
|
182
|
+
say(role.to_yaml)
|
183
|
+
else
|
184
|
+
warn("Role #{id} not found")
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
desc "delete ID", "Delete a role"
|
190
|
+
def delete(id)
|
191
|
+
run do
|
192
|
+
::Mashery::Role.delete(id.to_i)
|
193
|
+
ok("Role #{id} deleted")
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mashery
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 9
|
9
|
+
version: 0.0.9
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Brian Moseley
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-08-11 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description:
|
22
|
+
email: brian@outside.in
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- LICENSE.txt
|
29
|
+
- README.textile
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- Gemfile
|
33
|
+
- LICENSE.txt
|
34
|
+
- README.textile
|
35
|
+
- Rakefile
|
36
|
+
- VERSION
|
37
|
+
- lib/mashery.rb
|
38
|
+
- lib/mashery/api_object_base.rb
|
39
|
+
- lib/mashery/client.rb
|
40
|
+
- lib/mashery/exceptions.rb
|
41
|
+
- lib/mashery/key.rb
|
42
|
+
- lib/mashery/member.rb
|
43
|
+
- lib/mashery/role.rb
|
44
|
+
- mashery.gemspec
|
45
|
+
- tasks/mashery.thor
|
46
|
+
has_rdoc: true
|
47
|
+
homepage: http://github.com/outsidein/mashery-rb
|
48
|
+
licenses: []
|
49
|
+
|
50
|
+
post_install_message:
|
51
|
+
rdoc_options:
|
52
|
+
- --charset=UTF-8
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
segments:
|
60
|
+
- 0
|
61
|
+
version: "0"
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 1.3.6
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: A Ruby library for the Mashery API
|
76
|
+
test_files: []
|
77
|
+
|