playapi 0.0.3 → 0.1.5

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/playapi.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'faraday'
2
2
  require 'faraday_middleware'
3
- require 'hashie'
4
3
  require 'playapi/configurable'
5
4
  require 'playapi/client'
6
5
  require 'playapi/entity'
@@ -9,6 +8,20 @@ require 'playapi/feature'
9
8
  require 'playapi/campaign'
10
9
  require 'playapi/visual'
11
10
  require 'playapi/utils'
11
+ require 'playapi/instapic'
12
+ require 'playapi/checkin'
13
+ require 'playapi/custom'
14
+ require 'playapi/tweet'
15
+ require 'playapi/twitter_scraper'
16
+ require 'playapi/instagrabber'
17
+ require 'playapi/foursquare'
18
+ require 'playapi/picking'
19
+ require 'playapi/voting'
20
+ require 'playapi/snapchatter'
21
+ require 'playapi/snap'
22
+ require 'playapi/account'
23
+ require 'playapi/vine'
24
+ require 'playapi/vine_scraper'
12
25
 
13
26
 
14
27
  module Playapi
@@ -0,0 +1,34 @@
1
+ require 'playapi/utils'
2
+ require 'playapi/identity'
3
+
4
+
5
+ module Playapi
6
+ class Account < Playapi::Identity
7
+ extend Playapi::Utils
8
+ attr_reader :service_name, :service_id
9
+
10
+ def push
11
+ self.attrs = Playapi::Account.update(id, @attrs).attrs
12
+ end
13
+
14
+ class << self
15
+
16
+ def list
17
+ url = "api/v2/accounts"
18
+ get_objects(:get, "accounts", url)
19
+ end
20
+
21
+ def get(id)
22
+ url = "api/v2/accounts/#{id}"
23
+ get_object(:get, "account", url)
24
+ end
25
+
26
+ def update(id, opts)
27
+ url = "api/v2/accounts/#{id}"
28
+ get_object(:put, "account", url, {:account => opts})
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,124 @@
1
+ module Playapi
2
+ class Base
3
+ # Define methods that retrieve the value from an initialized instance variable Hash, using the attribute as a key
4
+ #
5
+ # @param attrs [Array, Set, Symbol]
6
+ def self.attr_reader(*attrs)
7
+ mod = Module.new do
8
+ attrs.each do |attribute|
9
+ define_method attribute do
10
+ @attrs[attribute.to_sym]
11
+ end
12
+ define_method "#{attribute}?" do
13
+ !!@attrs[attribute.to_sym]
14
+ end
15
+ end
16
+ end
17
+ const_set(:Attributes, mod)
18
+ include mod
19
+ end
20
+
21
+ # return [Playapi::IdentityMap]
22
+ def self.identity_map
23
+ return unless Playapi.identity_map
24
+ @identity_map = Playapi.identity_map.new unless defined?(@identity_map) && @identity_map.class == Playapi.identity_map
25
+ @identity_map
26
+ end
27
+
28
+ # Retrieves an object from the identity map.
29
+ #
30
+ # @param attrs [Hash]
31
+ # @return [Playapi::Base]
32
+ # THIS NEEDS TO BE REIMPLEMENTED
33
+ def self.fetch(attrs)
34
+ return unless identity_map
35
+ if object = identity_map.fetch("#{self.class.to_s.downcase}:#{attrs[:id]}")
36
+ return object
37
+ end
38
+ return yield if block_given?
39
+ end
40
+
41
+ # Stores an object in the identity map.
42
+ #
43
+ # @param object [Object]
44
+ # @return [Playapi::Base]
45
+ def self.store(object)
46
+ return object unless identity_map
47
+ # should this operate on type even though not ever response returns type? (campaign/entities)
48
+ identity_map.store("#{self.class.to_s.downcase}:#{object.id}", object)
49
+ end
50
+
51
+ # Returns a new object based on the response hash
52
+ #
53
+ # @param response [Hash]
54
+ # @return [Playapi::Base]
55
+ def self.from_response(response={})
56
+ fetch_or_new(response[:body])
57
+ end
58
+
59
+ # Retrieves an object from the identity map, or stores it in the
60
+ # identity map if it doesn't already exist.
61
+ #
62
+ # @param attrs [Hash]
63
+ # @return [Playapi::Base]
64
+ def self.fetch_or_new(attrs={})
65
+ return unless attrs
66
+ return new(attrs) unless identity_map
67
+
68
+ fetch(attrs) do
69
+ object = new(attrs)
70
+ store(object)
71
+ end
72
+ end
73
+
74
+ # Initializes a new object
75
+ #
76
+ # @param attrs [Hash]
77
+ # @return [Playapi::Base]
78
+ def initialize(attrs={})
79
+ @attrs = attrs
80
+ end
81
+
82
+ # Fetches an attribute of an object using hash notation
83
+ #
84
+ # @param method [String, Symbol] Message to send to the object
85
+ def [](method)
86
+ send(method.to_sym)
87
+ rescue NoMethodError
88
+ nil
89
+ end
90
+
91
+ # Retrieve the attributes of an object
92
+ #
93
+ # @return [Hash]
94
+ def attrs
95
+ @attrs
96
+ end
97
+ alias to_hash attrs
98
+
99
+ # Update the attributes of an object
100
+ #
101
+ # @param attrs [Hash]
102
+ # @return [Playapi::Base]
103
+ def update(attrs)
104
+ @attrs.update(attrs)
105
+ self
106
+ end
107
+
108
+ protected
109
+
110
+ # @param attr [Symbol]
111
+ # @param other [Playapi::Base]
112
+ # @return [Boolean]
113
+ def attr_equal(attr, other)
114
+ self.class == other.class && !other.send(attr).nil? && send(attr) == other.send(attr)
115
+ end
116
+
117
+ # @param other [Playapi::Base]
118
+ # @return [Boolean]
119
+ def attrs_equal(other)
120
+ self.class == other.class && !other.attrs.empty? && attrs == other.attrs
121
+ end
122
+
123
+ end
124
+ end
@@ -1,7 +1,9 @@
1
1
  require 'playapi/utils'
2
+ require 'playapi/identity'
3
+
2
4
 
3
5
  module Playapi
4
- class Campaign
6
+ class Campaign < Playapi::Identity
5
7
  extend Playapi::Utils
6
8
 
7
9
  # stub this out for now, it will probably do crazy stuff when we integrate campaign controls.
@@ -42,6 +44,10 @@ module Playapi
42
44
  get_object(:get, "results", url, opts)
43
45
  end
44
46
 
47
+ def features
48
+ Playapi::Feature.list
49
+ end
50
+
45
51
  def create(opts)
46
52
  #raise "WE DON'T MAKE CAMPAIGNS YET"
47
53
  #url = "api/v2/campaigns"
@@ -0,0 +1,6 @@
1
+ module Playapi
2
+ class Checkin < Playapi::Interaction
3
+ attr_reader :location, :source
4
+
5
+ end
6
+ end
@@ -1,8 +1,10 @@
1
+ require 'playapi/configurable'
2
+ require 'simple_oauth'
1
3
  require 'faraday'
2
4
 
3
5
  module Playapi
4
6
  class Client
5
- include Playapi::Configurable # i don't think this is needed
7
+ include Playapi::Configurable
6
8
 
7
9
  def initialize(options={})
8
10
  Playapi::Configurable.keys.each do |key|
@@ -10,33 +12,44 @@ module Playapi
10
12
  end
11
13
  end
12
14
 
13
- def connection
14
- params = {}
15
- params[:client_id] = @client_id
16
- params[:client_secret] = @client_secret
17
- params[:token] = @oauth_token
18
-
15
+ private
19
16
 
20
- @connection ||= Faraday::Connection.new(:url => @endpoint,
21
- :ssl => @ssl,
22
- :params => params,
23
- :headers => default_headers
24
- ) do |builder|
25
- @connection_middleware.each do |mw|
26
- builder.use *mw
17
+ def connection
18
+ params = {}
19
+ #params[:client_id] = @client_id
20
+ #params[:client_secret] = @client_secret
21
+ #params[:token] = @oauth_token
22
+
23
+
24
+ @connection ||= Faraday::Connection.new(:url => @endpoint,
25
+ :ssl => @ssl,
26
+ :params => params
27
+ ) do |builder|
28
+ @connection_middleware.each do |mw|
29
+ builder.use *mw
30
+ end
31
+ builder.adapter Faraday.default_adapter
27
32
  end
28
- builder.adapter Faraday.default_adapter
29
33
  end
30
- end
31
34
 
32
- private
35
+ def request(method, path, params={}, signature_params=params)
36
+ connection.send(method.to_sym, path, params) do |request|
37
+ request.headers["x-authorization"] = auth_header(method.to_sym, path, signature_params).to_s
38
+ request.headers.merge!(default_headers)
39
+ end.env
40
+ end
33
41
 
34
42
  def default_headers
35
43
  headers = {
36
44
  :accept => "application/json",
37
- :user_agent => "PlayAPI Gem 0.0.1"
45
+ :user_agent => "PlayAPI Gem 0.1.5"
38
46
  }
39
47
  end
40
48
 
49
+ def auth_header(method, path, params)
50
+ uri = URI(@endpoint + path)
51
+ SimpleOAuth::Header.new(method, uri, params, credentials)
52
+ end
53
+
41
54
  end
42
55
  end
@@ -9,7 +9,6 @@ module Playapi
9
9
  DEFAULT_CONNECTION_MIDDLEWARE = [
10
10
  Faraday::Request::Multipart,
11
11
  Faraday::Request::UrlEncoded,
12
- FaradayMiddleware::Mashify,
13
12
  FaradayMiddleware::ParseJson
14
13
  ]
15
14
 
@@ -21,6 +20,7 @@ module Playapi
21
20
  :client_secret,
22
21
  :oauth_token,
23
22
  :endpoint,
23
+ :token_secret,
24
24
  :connection_options,
25
25
  :identity_map,
26
26
  :connection_middleware,
@@ -45,10 +45,10 @@ module Playapi
45
45
  end
46
46
 
47
47
  def reset!
48
- defaultz = {client_id: "foo", client_secret: "foo", oauth_token: "foo", endpoint: "http://198.199.69.11"}
48
+ defaultz = {client_id: "F1Ox4PEhf1eiNGRge7kscIRgay1mh8cbi2zruIC1OI", client_secret: "xLeR0lXVdEtfjwP04w4FJKZm8KxS97Qg5o8Xbyw3JeE", oauth_token: "KqoCXCoyhrJTyGFtCYmiUcWModkTYBILiMHyKGQCBYg", token_secret: "b63V8SyY9ip8yigE5o6bsf3HFyza1wRfLnl3HyhhPz4", endpoint: "http://api.papi.io/"}
49
49
  # we can probably chuck conn_ops
50
50
  conn_ops = {
51
- :connection_options => {:headers => {:accept => "application/json", :user_agent => "PlayAPI Gem 0.0.1"},
51
+ :connection_options => {:headers => {:accept => "application/json", :user_agent => "PlayAPI Gem 0.1.1"},
52
52
  :ssl => {:verify => false}}
53
53
  }
54
54
  #defaultz.merge!(conn_ops)
@@ -67,9 +67,10 @@ module Playapi
67
67
  # @return [Hash]
68
68
  def credentials
69
69
  {
70
- :client_id => @client_id,
71
- :client_secret => @client_secret,
70
+ :consumer_key => @client_id,
71
+ :consumer_secret => @client_secret,
72
72
  :token => @oauth_token,
73
+ :token_secret => @token_secret
73
74
  }
74
75
  end
75
76
 
@@ -0,0 +1,7 @@
1
+ module Playapi
2
+ class Custom < Playapi::Interaction
3
+ def foobar
4
+ puts "foobar"
5
+ end
6
+ end
7
+ end
@@ -1,7 +1,8 @@
1
1
  require 'playapi/utils'
2
+ require 'playapi/identity'
2
3
 
3
4
  module Playapi
4
- class Entity
5
+ class Entity < Playapi::Identity
5
6
  extend Playapi::Utils
6
7
 
7
8
  class << self
@@ -1,16 +1,30 @@
1
1
  require 'playapi/utils'
2
2
  require 'playapi/validation/feature'
3
3
  require 'playapi/validation/instagrabber'
4
- require 'playapi/validation/twitterscraper'
4
+ require 'playapi/validation/twitter_scraper'
5
5
  require 'playapi/validation/picking'
6
+ require 'playapi/identity'
6
7
 
7
8
 
8
9
  module Playapi
9
- class Feature
10
+ class Feature < Playapi::Identity
10
11
  extend Playapi::Utils
12
+ attr_reader :id, :campaign_id, :name, :live, :default_points, :attrs
11
13
 
12
- def initialize
14
+ def interactions
15
+ Playapi::Interaction.by_feature(id)
16
+ end
17
+
18
+ def push
19
+ Playapi::Feature.update(id, @attrs)
20
+ end
13
21
 
22
+ def destroy
23
+ Playapi::Feature.destroy(id)
24
+ end
25
+
26
+ def campaign
27
+ Playapi::Campaign.get(@attrs["campaign_id"])
14
28
  end
15
29
 
16
30
  class << self
@@ -18,7 +32,7 @@ module Playapi
18
32
  # TODO: add filters and options
19
33
  def list
20
34
  url = "api/v2/features"
21
- get_object(:get, "features", url)
35
+ get_objects(:get, "features", url)
22
36
  end
23
37
 
24
38
  # Fetch a feature by id
@@ -64,6 +78,14 @@ module Playapi
64
78
  url = "api/v2/features/#{id}"
65
79
  get_object(:delete, "feature", url)
66
80
  end
81
+ # pass in a hash of options to find things, options include: type and name
82
+ # returns an array
83
+ # name=String
84
+ # type=String
85
+ def find_by_facet(opts)
86
+ url = "api/v2/features/facet"
87
+ get_objects(:get, :features, url, opts)
88
+ end
67
89
 
68
90
  end
69
91
 
@@ -0,0 +1,10 @@
1
+ module Playapi
2
+ class Foursquare < Playapi::Feature
3
+ attr_accessor :authenticated_venues, :client_id, :client_secret, :oauth_token, :push_secret
4
+
5
+ def near(coords)
6
+ #This would be a nice function, no? Shall I add an endpoint just for location items?
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,49 @@
1
+ require 'playapi/base'
2
+
3
+ module Playapi
4
+ class Identity < Playapi::Base
5
+
6
+ def self.fetch(attrs)
7
+ return unless identity_map
8
+
9
+ id = attrs[:id]
10
+ if id && object = identity_map.fetch(id)
11
+ return object.update(attrs)
12
+ end
13
+
14
+ return yield if block_given?
15
+ raise "Not Found!"
16
+ end
17
+
18
+ # Stores an object in the identity map.
19
+ #
20
+ # @param object [Object]
21
+ # @return [Twitter::Identity]
22
+ def self.store(object)
23
+ return object unless identity_map
24
+ identity_map.store(object.id, object)
25
+ end
26
+
27
+ # Initializes a new object
28
+ #
29
+ # @param attrs [Hash]
30
+ # @raise [ArgumentError] Error raised when supplied argument is missing an :id key.
31
+ # @return [Twitter::Identity]
32
+ def initialize(attrs={})
33
+ super
34
+ raise ArgumentError, "argument must have an :id key" unless id
35
+ end
36
+
37
+ # @param other [Twitter::Identity]
38
+ # @return [Boolean]
39
+ def ==(other)
40
+ super || attr_equal(:id, other) || attrs_equal(other)
41
+ end
42
+
43
+ # @return [Integer]
44
+ def id
45
+ @attrs[:id]
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,6 @@
1
+ module Playapi
2
+ class Instagrabber < Playapi::Feature
3
+ attr_reader :hashtags, :user_ids, :client_id, :client_secret, :oauth_token
4
+
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Playapi
2
+ class Instapic < Playapi::Interaction
3
+
4
+ end
5
+ end
@@ -2,13 +2,36 @@ require 'playapi/utils'
2
2
  require 'playapi/validation/instapic'
3
3
  require 'playapi/validation/tweet'
4
4
  require 'playapi/validation/custom'
5
+ require 'playapi/identity'
5
6
 
6
7
 
7
8
 
8
9
  module Playapi
9
- class Interaction
10
+ class Interaction < Playapi::Identity
10
11
  extend Playapi::Utils
11
12
 
13
+ attr_reader :id, :text, :campaign_id, :entity_id, :feature_id
14
+
15
+ def feature
16
+ Playapi::Feature.get(@attrs["feature_id"])
17
+ end
18
+
19
+ def entity
20
+ Playapi::Entity.get(@attrs["entity_id"])
21
+ end
22
+
23
+ def push
24
+ self.attrs = Playapi::Interaction.update(id, @attrs).attrs
25
+ end
26
+
27
+ def destroy
28
+ Playapi::Interaction.destroy(id)
29
+ end
30
+
31
+ def campaign
32
+ Playapi::Campaign.get(@attrs["campaign_id"])
33
+ end
34
+
12
35
  class << self
13
36
 
14
37
  # Get interactions for a campaign, optional paramaters include
@@ -21,7 +44,7 @@ module Playapi
21
44
  # :type=STRING (Valid options are Instapic, Tweet, Checkin)
22
45
  def list
23
46
  url = "api/v2/interactions"
24
- get_object(:get, "interactions", url)
47
+ get_objects(:get, "interactions", url)
25
48
  end
26
49
 
27
50
  # Get an interaction with the given id
@@ -52,10 +75,11 @@ module Playapi
52
75
  end
53
76
 
54
77
  # pass in a hash of options to find things, currently the only one that is applicable is content_id
78
+ # returns an array
55
79
  # content_id=String
56
80
  def find_by_facet(opts)
57
81
  url = "api/v2/interactions/facet"
58
- get_object(:get, :interactions, url, opts)
82
+ get_objects(:get, :interactions, url, opts)
59
83
  end
60
84
 
61
85
  # Create a classed interaction for authed campaign
@@ -0,0 +1,17 @@
1
+ require 'playapi/utils'
2
+ require 'playapi/feature'
3
+
4
+ module Playapi
5
+ class Picking < Playapi::Feature
6
+ extend Playapi::Utils
7
+ attr_reader :target_features, :target_class
8
+
9
+ # gets a set of interactions from a picking feature on playapi
10
+ def get_set(set_size=2, opts={})
11
+ url = "api/v2/picks/#{id}"
12
+ # public and private don't matter since you can use send... :/
13
+ self.class.send(:get_objects, :get, "results", url, opts.merge!(set_size: set_size))
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ module Playapi
2
+ class Snap < Playapi::Interaction
3
+
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ module Playapi
2
+ class Snapchatter < Playapi::Feature
3
+ attr_reader :username, :password
4
+
5
+ def send_snapchat(names=[], url='', opts={})
6
+ # awaiting finalization of end point
7
+ url = "/api/v2/snapchatter/#{id}/send_snapchat"
8
+ self.class.send(:get_objects, :post, "results", opts.merge!(usernames: names, source: url))
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module Playapi
2
+ class Tweet < Playapi::Interaction
3
+
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Playapi
2
+ class TwitterScraper < Playapi::Feature
3
+ attr_accessor :hashtags, :user_ids, :consumer_key, :consumer_secret, :oauth_token, :oauth_token_secret
4
+
5
+ end
6
+ end
data/lib/playapi/utils.rb CHANGED
@@ -8,24 +8,41 @@ module Playapi
8
8
 
9
9
  private
10
10
 
11
- def get_object(method, key, path, options={})
12
- res = Playapi.client.connection.send(method.to_sym, path, options)
13
- if res.status == 200
14
- res.body[key]
11
+ def get_objects(method, key, path, options={})
12
+ res = Playapi.client.send(:request, method.to_sym, path, options)
13
+ puts "\n\n#{res.inspect}\n\n"
14
+ if res[:status] == 200
15
+ res[:body][key].collect{|y| sym_hash = convert_string_hash_to_sym(y); eval "#{sym_hash[:type]}.new(#{sym_hash})"}
15
16
  else
16
- errors = res.body["errors"]
17
- raise "Error returned: #{res.status} #{errors}"
17
+ #errors = res[:body][:errors]
18
+ raise "Error returned: #{res[:status]} #{res[:body][:errors]}"
18
19
  end
19
20
  end
20
21
 
21
- def get_objects(method, path, options={})
22
- res = Playapi.client.connection.send(method.to_sym, path, options)
22
+ def get_object(method, key, path, options={})
23
+ res = Playapi.client.send(:request, method.to_sym, path, options)
23
24
  if res.status == 200
24
- res.body
25
+ sym_hash = convert_string_hash_to_sym(res.body[key])
26
+ eval "#{sym_hash[:type]}.new(#{sym_hash})"
25
27
  else
26
- raise "Error returned: #{res.status}"
28
+ errors = res.body["errors"]
29
+ raise "Error returned: #{res.status} #{errors}"
27
30
  end
28
31
  end
29
32
 
33
+ def get_raw
34
+ res = Playapi.client.send(:request, method.to_sym, path, options)
35
+ if res.status == 200
36
+ res.body[key]
37
+ else
38
+ errors = res.body["errors"]
39
+ raise "Error returned: #{res.status} #{errors}"
40
+ end
41
+ end
42
+
43
+ def convert_string_hash_to_sym(string_hash)
44
+ q = string_hash.inject({}){|q,(k,v)| q[k.to_sym] = v; q}
45
+ end
46
+
30
47
  end
31
48
  end
@@ -31,4 +31,4 @@ module Playapi
31
31
 
32
32
  end
33
33
  end
34
- end
34
+ end
@@ -1,6 +1,6 @@
1
1
  module Playapi
2
2
  module Validation
3
- module Twitterscraper
3
+ module TwitterScraper
4
4
 
5
5
  class << self
6
6
 
@@ -0,0 +1,5 @@
1
+ module Playapi
2
+ class Vine < Playapi::Interaction
3
+
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ module Playapi
2
+ class VineScraper < Playapi::Feature
3
+ #attr_accessor :hashtags, :user_ids, :consumer_key, :consumer_secret, :oauth_token, :oauth_token_secret
4
+
5
+ end
6
+ end
@@ -3,6 +3,7 @@ require 'playapi/utils'
3
3
  module Playapi
4
4
  class Visual
5
5
  extend Playapi::Utils
6
+ attr_reader :media, :description
6
7
 
7
8
  class << self
8
9
 
@@ -0,0 +1,6 @@
1
+ module Playapi
2
+ class Voting < Playapi::Feature
3
+ attr_reader :target_class
4
+
5
+ end
6
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: playapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.5
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: 2013-05-06 00:00:00.000000000 Z
12
+ date: 2013-07-31 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Interact with PlayAPI
15
15
  email: france@playapi.com
@@ -29,10 +29,26 @@ files:
29
29
  - lib/playapi/validation/instapic.rb
30
30
  - lib/playapi/validation/tweet.rb
31
31
  - lib/playapi/validation/instagrabber.rb
32
- - lib/playapi/validation/twitterscraper.rb
32
+ - lib/playapi/validation/twitter_scraper.rb
33
33
  - lib/playapi/validation/picking.rb
34
34
  - lib/playapi/validation/feature.rb
35
35
  - lib/playapi/validation/custom.rb
36
+ - lib/playapi/base.rb
37
+ - lib/playapi/identity.rb
38
+ - lib/playapi/instapic.rb
39
+ - lib/playapi/checkin.rb
40
+ - lib/playapi/custom.rb
41
+ - lib/playapi/tweet.rb
42
+ - lib/playapi/twitter_scraper.rb
43
+ - lib/playapi/picking.rb
44
+ - lib/playapi/instagrabber.rb
45
+ - lib/playapi/foursquare.rb
46
+ - lib/playapi/voting.rb
47
+ - lib/playapi/snapchatter.rb
48
+ - lib/playapi/snap.rb
49
+ - lib/playapi/account.rb
50
+ - lib/playapi/vine.rb
51
+ - lib/playapi/vine_scraper.rb
36
52
  homepage: http://rubygems.org/gems/playapi
37
53
  licenses: []
38
54
  post_install_message: