masheri 0.3.1 → 0.3.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/README.md +56 -1
- data/lib/masheri.rb +51 -15
- data/lib/masheri/api_object_base.rb +3 -1
- data/lib/masheri/config.rb +71 -0
- data/lib/masheri/exceptions.rb +32 -14
- data/lib/masheri/init.rb +6 -1
- data/lib/masheri/local.rb +3 -0
- data/lib/masheri/member.rb +2 -9
- data/lib/masheri/query.rb +5 -0
- data/lib/masheri/query_builder.rb +170 -0
- data/lib/masheri/query_methods.rb +39 -0
- data/lib/masheri/rails.rb +1 -2
- data/lib/masheri/rest_client.rb +30 -0
- data/lib/masheri/rest_client/query.rb +74 -0
- data/lib/masheri/rpc_client.rb +130 -0
- data/lib/masheri/service.rb +22 -0
- metadata +15 -30
- data/Gemfile +0 -6
- data/Gemfile.lock +0 -31
- data/Rakefile +0 -15
- data/VERSION +0 -1
- data/lib/masheri/client.rb +0 -61
- data/masheri.gemspec +0 -67
- data/tasks/mashery.thor +0 -200
    
        data/README.md
    CHANGED
    
    | @@ -1,3 +1,58 @@ | |
| 1 | 
            +
            # masheri
         | 
| 1 2 |  | 
| 3 | 
            +
            A Rails library for the [Mashery API](http://support.mashery.com/docs/mashery_api).
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## Installation
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Add the following to your `Gemfile`
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            ```ruby
         | 
| 10 | 
            +
            gem "masheri"
         | 
| 11 | 
            +
            ```
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            Then run the installer to create `config/masheri.yml`
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            ```bash
         | 
| 16 | 
            +
            $ rails g masheri:install
         | 
| 17 | 
            +
            ```
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            ## Configuration
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            Edit `config/masheri.yml` with your `site_key`, `api_key` and `shared_secret` options.
         | 
| 22 | 
            +
             | 
| 23 | 
            +
             | 
| 24 | 
            +
             | 
| 25 | 
            +
            ```yaml
         | 
| 26 | 
            +
            development:
         | 
| 27 | 
            +
              site_id: 123
         | 
| 28 | 
            +
              api_key: abc
         | 
| 29 | 
            +
              shared_secret: xyz
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            test:
         | 
| 32 | 
            +
              site_id: 123
         | 
| 33 | 
            +
              api_key: abc
         | 
| 34 | 
            +
              shared_secret: xyz
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            production:
         | 
| 37 | 
            +
              site_id: 123
         | 
| 38 | 
            +
              api_key: abc
         | 
| 39 | 
            +
              shared_secret: xyz
         | 
| 40 | 
            +
            ```
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            ## Usage
         | 
| 43 | 
            +
             | 
| 44 | 
            +
             | 
| 45 | 
            +
            ### Members
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            ```ruby
         | 
| 48 | 
            +
            Masheri::Member.fetch_all #=>
         | 
| 49 | 
            +
            ```
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            ### ???
         | 
| 52 | 
            +
             | 
| 53 | 
            +
             | 
| 54 | 
            +
            ### ???
         | 
| 55 | 
            +
             | 
| 56 | 
            +
             | 
| 57 | 
            +
            ### ???
         | 
| 2 58 |  | 
| 3 | 
            -
            Fix this!
         | 
    
        data/lib/masheri.rb
    CHANGED
    
    | @@ -1,32 +1,68 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            $LOAD_PATH.unshift File.expand_path("./lib")
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'active_support/core_ext'
         | 
| 2 4 | 
             
            require 'logger'
         | 
| 5 | 
            +
            require 'digest/md5'
         | 
| 6 | 
            +
            require 'restclient'
         | 
| 3 7 |  | 
| 4 8 | 
             
            require 'masheri/exceptions'
         | 
| 5 | 
            -
            require 'masheri/ | 
| 9 | 
            +
            require 'masheri/config'
         | 
| 10 | 
            +
            require 'masheri/query_builder'
         | 
| 11 | 
            +
            require 'masheri/query_methods'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            require 'masheri/rpc_client'
         | 
| 14 | 
            +
            require 'masheri/rest_client'
         | 
| 15 | 
            +
            require 'masheri/rest_client/query'
         | 
| 16 | 
            +
             | 
| 6 17 | 
             
            require 'masheri/api_object_base'
         | 
| 18 | 
            +
             | 
| 7 19 | 
             
            require 'masheri/member'
         | 
| 20 | 
            +
            require 'masheri/service'
         | 
| 8 21 | 
             
            require 'masheri/key'
         | 
| 9 22 | 
             
            require 'masheri/role'
         | 
| 10 23 | 
             
            require 'masheri/query'
         | 
| 11 24 |  | 
| 12 | 
            -
            if defined?(Rails)
         | 
| 13 | 
            -
              require 'masheri/rails'
         | 
| 14 | 
            -
            end
         | 
| 15 | 
            -
             | 
| 16 25 | 
             
            module Masheri
         | 
| 17 | 
            -
               | 
| 18 | 
            -
              @@client = nil
         | 
| 26 | 
            +
              @@config = nil
         | 
| 19 27 |  | 
| 20 | 
            -
               | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
               | 
| 28 | 
            +
              def self.config
         | 
| 29 | 
            +
                raise Masheri::ConfigMissing.new unless @@config.present?
         | 
| 30 | 
            +
                @@config
         | 
| 31 | 
            +
              end
         | 
| 24 32 |  | 
| 25 | 
            -
               | 
| 26 | 
            -
             | 
| 33 | 
            +
              def self.config=(other)
         | 
| 34 | 
            +
                @@config = other
         | 
| 35 | 
            +
              end
         | 
| 27 36 |  | 
| 28 37 | 
             
              def self.load_config!(yaml_file)
         | 
| 29 | 
            -
                Masheri. | 
| 38 | 
            +
                Masheri.config = Masheri::Config.new(yaml_file)
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              def self.local_config
         | 
| 42 | 
            +
                File.expand_path("~/.masheri.yml")
         | 
| 43 | 
            +
              end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
              def self.rpc
         | 
| 46 | 
            +
                Masheri::RpcClient.new
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
              def self.rest
         | 
| 50 | 
            +
                Masheri::RestClient.new
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              def self.developer_activity(service_id, options)
         | 
| 54 | 
            +
                Masheri.rest.developer_activity(service_id, options)
         | 
| 30 55 | 
             
              end
         | 
| 31 56 | 
             
            end
         | 
| 32 57 |  | 
| 58 | 
            +
            # TODO: Let config be accepted as command line argument
         | 
| 59 | 
            +
            # (masheri -C config.yml)
         | 
| 60 | 
            +
            if defined?(Rails)
         | 
| 61 | 
            +
              require 'masheri/rails'
         | 
| 62 | 
            +
            elsif File.exists?(Masheri.local_config)
         | 
| 63 | 
            +
              Masheri.load_config! Masheri.local_config
         | 
| 64 | 
            +
            elsif defined?(RSpec)
         | 
| 65 | 
            +
              # Skip testing environment..
         | 
| 66 | 
            +
            else
         | 
| 67 | 
            +
              raise Masheri::MissingConfig.new
         | 
| 68 | 
            +
            end
         | 
| @@ -1,12 +1,14 @@ | |
| 1 1 | 
             
            module Masheri
         | 
| 2 2 | 
             
              class ApiObjectBase
         | 
| 3 | 
            +
                mattr_accessor :type_name
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
                def self.create(fields = {})
         | 
| 4 6 | 
             
                  # XXX: only send fields that aren't read-only
         | 
| 5 7 | 
             
                  new(Masheri.client.call_remote(method('create'), fields))
         | 
| 6 8 | 
             
                end
         | 
| 7 9 |  | 
| 8 10 | 
             
                def self.fetch(id)
         | 
| 9 | 
            -
                  data = Masheri. | 
| 11 | 
            +
                  data = Masheri.rpc.call_remote(method('fetch'), id)
         | 
| 10 12 | 
             
                  data.nil?? nil : new(data)
         | 
| 11 13 | 
             
                end
         | 
| 12 14 |  | 
| @@ -0,0 +1,71 @@ | |
| 1 | 
            +
            module Masheri
         | 
| 2 | 
            +
              class Config
         | 
| 3 | 
            +
                DEFAULT_HOSTS = {
         | 
| 4 | 
            +
                  test:       'api.sandbox.mashery.com',
         | 
| 5 | 
            +
                  production: 'api.mashery.com'
         | 
| 6 | 
            +
                }
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                attr_accessor :config
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def initialize(yaml_file)
         | 
| 11 | 
            +
                  @config ||= YAML.load_file(yaml_file)
         | 
| 12 | 
            +
                  check_config!
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def check_config!
         | 
| 16 | 
            +
                  if config["site_id"].blank?
         | 
| 17 | 
            +
                    raise ParamMissing.new("site_id")
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  if config["key"].blank?
         | 
| 21 | 
            +
                    raise ParamMissing.new("key")
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  if config["secret"].blank?
         | 
| 25 | 
            +
                    raise ParamMissing.new("secret")
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  find_host!
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def site_id
         | 
| 32 | 
            +
                  @site_id ||= config["site_id"]
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def key
         | 
| 36 | 
            +
                  @key     ||= config["key"]
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                alias :api_key :key
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def secret
         | 
| 42 | 
            +
                  @secret  ||= config["secret"]
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def host
         | 
| 46 | 
            +
                  @host    ||= find_host!
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def signature
         | 
| 50 | 
            +
                  Digest::MD5.hexdigest(key + secret + Time.now.to_f.to_i.to_s)
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                protected
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def find_host!
         | 
| 56 | 
            +
                  if config["host"].present?
         | 
| 57 | 
            +
                    config["host"]
         | 
| 58 | 
            +
                  else
         | 
| 59 | 
            +
                    if defined?(Rails)
         | 
| 60 | 
            +
                      if Rails.env.test? || Rails.env.development?
         | 
| 61 | 
            +
                        DEFAULT_HOSTS[:test]
         | 
| 62 | 
            +
                      elsif Rails.env.production?
         | 
| 63 | 
            +
                        DEFAULT_HOSTS[:production]
         | 
| 64 | 
            +
                      end
         | 
| 65 | 
            +
                    end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                    raise ParamMissing.new("host")
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
            end
         | 
    
        data/lib/masheri/exceptions.rb
    CHANGED
    
    | @@ -1,27 +1,45 @@ | |
| 1 1 | 
             
            module Masheri
         | 
| 2 | 
            -
              class  | 
| 3 | 
            -
                def  | 
| 4 | 
            -
                   | 
| 5 | 
            -
             | 
| 6 | 
            -
                   | 
| 7 | 
            -
                  else JsonRpcException.new("#{options['message']} (JSON-RPC error #{options['code']})")
         | 
| 8 | 
            -
                  end
         | 
| 2 | 
            +
              class InvalidDateRange < Exception
         | 
| 3 | 
            +
                def initialize(start_date, end_date)
         | 
| 4 | 
            +
                  days = ((end_date - start_date) / 1.day).ceil
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  super("Your start_date and end_date are #{days} days apart. Mashery's API does not like date ranges that span longer than 7 days. Please use multiple queries to gather your data.")
         | 
| 9 7 | 
             
                end
         | 
| 10 8 | 
             
              end
         | 
| 11 9 |  | 
| 12 | 
            -
              class  | 
| 10 | 
            +
              class QueryParamMissing < Exception
         | 
| 11 | 
            +
                def initialize(param)
         | 
| 12 | 
            +
                  super "Couldn't complete request. The query param #{param} is missing."
         | 
| 13 | 
            +
                end
         | 
| 13 14 | 
             
              end
         | 
| 14 15 |  | 
| 15 | 
            -
              class  | 
| 16 | 
            +
              class ParamMissing < Exception
         | 
| 17 | 
            +
                def initialize(param)
         | 
| 18 | 
            +
                  super "Couldn't determine Mashery #{param}! Please check your config/masheri.yml"
         | 
| 19 | 
            +
                end
         | 
| 16 20 | 
             
              end
         | 
| 17 21 |  | 
| 18 | 
            -
              class  | 
| 22 | 
            +
              class ConfigMissing < Exception
         | 
| 23 | 
            +
                def initialize
         | 
| 24 | 
            +
                  super "No configuration has been loaded! Please call Masheri.load_config! with a valid Yaml file."
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              class MissingConfig < Exception
         | 
| 29 | 
            +
                def initialize
         | 
| 30 | 
            +
                  if defined?(Rails)
         | 
| 31 | 
            +
                    super("Couldn't find config/masheri.yml! \n" +
         | 
| 32 | 
            +
                          "Please run `rails g masheri:install` to create one and populate it with the necessary API credentials.")
         | 
| 33 | 
            +
                  else
         | 
| 34 | 
            +
                    super("Couldn't find ~/.masheri.yml! \n" +
         | 
| 35 | 
            +
                          "Please run `masheri --init` to create one and populate it with the necessary API credentials.")
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 19 38 | 
             
              end
         | 
| 20 39 |  | 
| 21 | 
            -
              class  | 
| 22 | 
            -
                 | 
| 23 | 
            -
             | 
| 24 | 
            -
                  @errors = errs
         | 
| 40 | 
            +
              class UnknownFormat < Exception
         | 
| 41 | 
            +
                def initialize(format)
         | 
| 42 | 
            +
                  super "Unknown format #{format} for REST API call. Standard formats are CSV and JSON."
         | 
| 25 43 | 
             
                end
         | 
| 26 44 | 
             
              end
         | 
| 27 45 | 
             
            end
         | 
    
        data/lib/masheri/init.rb
    CHANGED
    
    
    
        data/lib/masheri/member.rb
    CHANGED
    
    | @@ -1,12 +1,5 @@ | |
| 1 1 | 
             
            module Masheri
         | 
| 2 2 | 
             
              class Member < ApiObjectBase
         | 
| 3 | 
            -
                attr_reader :created, :updated
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                attr_accessor(:username, :email, :display_name, :uri, :blog, :im, :imsvc, :phone,
         | 
| 6 | 
            -
                              :company, :address1, :address2, :locality, :region, :postal_code,
         | 
| 7 | 
            -
                              :country_code, :first_name, :last_name, :registration_ipaddr, :area_status,
         | 
| 8 | 
            -
                              :external_id, :passwd_new)
         | 
| 9 | 
            -
             | 
| 10 3 | 
             
                def self.create(username, display_name, email, fields = {})
         | 
| 11 4 | 
             
                  fields ||= {}
         | 
| 12 5 | 
             
                  our_fields = fields.merge('username' => username, 'display_name' => display_name, 'email' => email)
         | 
| @@ -14,11 +7,11 @@ module Masheri | |
| 14 7 | 
             
                end
         | 
| 15 8 |  | 
| 16 9 | 
             
                def self.fetch_all
         | 
| 17 | 
            -
                  Masheri. | 
| 10 | 
            +
                  Masheri::RpcClient.new.call_remote("object.query", params: "SELECT * FROM members")
         | 
| 18 11 | 
             
                end
         | 
| 19 12 |  | 
| 20 13 | 
             
                def self.fetch_by_username(username)
         | 
| 21 | 
            -
                  Masheri. | 
| 14 | 
            +
                  Masheri::RpcClient.new.call_remote("member.fetch", params: username)
         | 
| 22 15 | 
             
                end
         | 
| 23 16 |  | 
| 24 17 | 
             
                def add_role(role_or_id)
         | 
    
        data/lib/masheri/query.rb
    CHANGED
    
    
| @@ -0,0 +1,170 @@ | |
| 1 | 
            +
            module Masheri
         | 
| 2 | 
            +
              class QueryBuilder
         | 
| 3 | 
            +
                attr_accessor :klass
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def initialize(klass, options = {})
         | 
| 6 | 
            +
                  @klass      = klass
         | 
| 7 | 
            +
                  @options    = options
         | 
| 8 | 
            +
                  @conditions = Where.new
         | 
| 9 | 
            +
                  @select     = Select.new
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def select(argument)
         | 
| 13 | 
            +
                  @select = Select.new(argument)
         | 
| 14 | 
            +
                  clone
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def from(argument)
         | 
| 18 | 
            +
                  @from = From.new(argument)
         | 
| 19 | 
            +
                  clone
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                def where(argument)
         | 
| 23 | 
            +
                  @conditions.add argument
         | 
| 24 | 
            +
                  clone
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def order(column, order)
         | 
| 28 | 
            +
                  @order = Order.new(column, order)
         | 
| 29 | 
            +
                  clone
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def items(argument)
         | 
| 33 | 
            +
                  @items = Items.new(argument)
         | 
| 34 | 
            +
                  clone
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                def page(argument)
         | 
| 38 | 
            +
                  @page = Page.new(argument)
         | 
| 39 | 
            +
                  clone
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def query
         | 
| 43 | 
            +
                  [@select, @from, @order, @conditions, @page, @items].map(&:to_s).reject {|s|
         | 
| 44 | 
            +
                    s.blank?
         | 
| 45 | 
            +
                  }.compact.join(" ").strip
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                alias :to_s :query
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def to_json
         | 
| 51 | 
            +
                  Masheri.rpc.query(query)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                def all
         | 
| 55 | 
            +
                  Masheri::RpcResponse.new(self)
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                def find_each(&block)
         | 
| 59 | 
            +
                  Masheri::RpcResponse.new(self).find_each(&block)
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                def first
         | 
| 63 | 
            +
                  Masheri::RpcResponse.new(items(1)).to_objects.first
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                protected
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                class Select
         | 
| 69 | 
            +
                  def initialize(argument = nil)
         | 
| 70 | 
            +
                    @argument = argument
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  def query
         | 
| 74 | 
            +
                    @argument || "*"
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  def to_s
         | 
| 78 | 
            +
                    "SELECT #{query}"
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                class From
         | 
| 83 | 
            +
                  def initialize(argument)
         | 
| 84 | 
            +
                    @argument = argument
         | 
| 85 | 
            +
                  end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  def to_s
         | 
| 88 | 
            +
                    raise MissingFrom.new if @argument.nil?
         | 
| 89 | 
            +
                    "FROM #{@argument}"
         | 
| 90 | 
            +
                  end
         | 
| 91 | 
            +
                end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                class Where
         | 
| 94 | 
            +
                  def initialize(hash = {})
         | 
| 95 | 
            +
                    @hash = hash
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                  def add(hash)
         | 
| 99 | 
            +
                    @hash.merge!(hash)
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                  def to_s
         | 
| 103 | 
            +
                    if @hash.blank?
         | 
| 104 | 
            +
                      ""
         | 
| 105 | 
            +
                    else
         | 
| 106 | 
            +
                      "WHERE #{compute_relation}"
         | 
| 107 | 
            +
                    end
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  def compute_relation
         | 
| 111 | 
            +
                    @hash.map do |key, value|
         | 
| 112 | 
            +
                      if value.is_a? String
         | 
| 113 | 
            +
                        "#{key} = '#{value}'"
         | 
| 114 | 
            +
                      else
         | 
| 115 | 
            +
                        "#{key} = #{value}"
         | 
| 116 | 
            +
                      end
         | 
| 117 | 
            +
                    end.join(" AND ")
         | 
| 118 | 
            +
                  end
         | 
| 119 | 
            +
                end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                # An ASC or DESC modifier may appear after each field in the ORDER BY list.  If no modifer appears, ASC is assumed.
         | 
| 122 | 
            +
                # > SELECT * FROM members ORDER BY created DESC
         | 
| 123 | 
            +
                class Order
         | 
| 124 | 
            +
                  def initialize(column, order)
         | 
| 125 | 
            +
                    @column = column
         | 
| 126 | 
            +
                    @order  = order
         | 
| 127 | 
            +
                  end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                  def to_s
         | 
| 130 | 
            +
                    if @column.blank? || @order.blank?
         | 
| 131 | 
            +
                      ""
         | 
| 132 | 
            +
                    else
         | 
| 133 | 
            +
                      "ORDER BY #{@column} #{@desc}"
         | 
| 134 | 
            +
                    end
         | 
| 135 | 
            +
                  end
         | 
| 136 | 
            +
                end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                # the ITEMS clause can specify an alternative number of records to return per page.
         | 
| 139 | 
            +
                # > SELECT * FROM members ITEMS 25
         | 
| 140 | 
            +
                class Items
         | 
| 141 | 
            +
                  def initialize(count)
         | 
| 142 | 
            +
                    @count = count
         | 
| 143 | 
            +
                  end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                  def to_s
         | 
| 146 | 
            +
                    if @count.blank?
         | 
| 147 | 
            +
                      ""
         | 
| 148 | 
            +
                    else
         | 
| 149 | 
            +
                      "ITEMS #{@count}"
         | 
| 150 | 
            +
                    end
         | 
| 151 | 
            +
                  end
         | 
| 152 | 
            +
                end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                # By default the first page is returned.  The PAGE clause allows additional pages to be returned.
         | 
| 155 | 
            +
                # > SELECT * FROM members PAGE 5
         | 
| 156 | 
            +
                class Page
         | 
| 157 | 
            +
                  def initialize(page)
         | 
| 158 | 
            +
                    @page = page
         | 
| 159 | 
            +
                  end
         | 
| 160 | 
            +
             | 
| 161 | 
            +
                  def to_s
         | 
| 162 | 
            +
                    if @page.blank?
         | 
| 163 | 
            +
                      ""
         | 
| 164 | 
            +
                    else
         | 
| 165 | 
            +
                      "PAGE #{@page}"
         | 
| 166 | 
            +
                    end
         | 
| 167 | 
            +
                  end
         | 
| 168 | 
            +
                end
         | 
| 169 | 
            +
              end
         | 
| 170 | 
            +
            end
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            module Masheri
         | 
| 2 | 
            +
              module QueryInstanceMethods
         | 
| 3 | 
            +
                def initialize(attributes)
         | 
| 4 | 
            +
                  attributes.each do |key, value|
         | 
| 5 | 
            +
                    send("#{key}=", value)
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              module QueryClassMethods
         | 
| 11 | 
            +
                def items(argument)
         | 
| 12 | 
            +
                  default_query.items(argument)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def where(argument)
         | 
| 16 | 
            +
                  default_query.where(argument)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def page(argument)
         | 
| 20 | 
            +
                  default_query.page(argument)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def find_each(&block)
         | 
| 24 | 
            +
                  default_query.find_each(&block)
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def standard_query
         | 
| 28 | 
            +
                  Masheri.rpc.query_builder(self).from(object_type).items(100)
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def default_query
         | 
| 32 | 
            +
                  standard_query
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def first
         | 
| 36 | 
            +
                  Masheri::Service.new standard_query.items(1).all.items[0]
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
            end
         | 
    
        data/lib/masheri/rails.rb
    CHANGED
    
    | @@ -1,11 +1,10 @@ | |
| 1 1 | 
             
            module Masheri
         | 
| 2 | 
            -
              class MissingConfig < Exception; end
         | 
| 3 2 |  | 
| 4 3 | 
             
              def self.load_rails_config!
         | 
| 5 4 | 
             
                if File.exists? rails_config
         | 
| 6 5 | 
             
                  load_config! rails_config
         | 
| 7 6 | 
             
                else
         | 
| 8 | 
            -
                  raise MissingConfig.new | 
| 7 | 
            +
                  raise MissingConfig.new
         | 
| 9 8 | 
             
                end
         | 
| 10 9 | 
             
              end
         | 
| 11 10 |  | 
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            module Masheri
         | 
| 2 | 
            +
              class RestClient
         | 
| 3 | 
            +
                def config
         | 
| 4 | 
            +
                  Masheri.config
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def developer_activity_query(service_id, options)
         | 
| 8 | 
            +
                  query_options = {service_id: service_id, resource: "developer_activity"}.merge(options)
         | 
| 9 | 
            +
                  Masheri::RestClient::Query.new(query_options)
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def developer_activity_url(service_id, options)
         | 
| 13 | 
            +
                  query = developer_activity_query(service_id, options)
         | 
| 14 | 
            +
                  query.url
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def developer_activity(service_id, options)
         | 
| 18 | 
            +
                  query    = developer_activity_query(service_id, options)
         | 
| 19 | 
            +
                  response = ::RestClient.get(query.url)
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  if query.format == "json"
         | 
| 22 | 
            +
                    JSON.parse(response)
         | 
| 23 | 
            +
                  elsif query.format == "csv"
         | 
| 24 | 
            +
                    response
         | 
| 25 | 
            +
                  else
         | 
| 26 | 
            +
                    raise UnknownFormat.new(query.format)
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -0,0 +1,74 @@ | |
| 1 | 
            +
            module Masheri
         | 
| 2 | 
            +
              class RestClient
         | 
| 3 | 
            +
                class Query
         | 
| 4 | 
            +
                  def initialize(options)
         | 
| 5 | 
            +
                    @options  = options
         | 
| 6 | 
            +
                  end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def format
         | 
| 9 | 
            +
                    @options[:format] || "csv"
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  def limit
         | 
| 13 | 
            +
                    @options[:limit] || 1000
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  def start_date
         | 
| 17 | 
            +
                    @options[:start_date].strftime("%Y-%m-%dT00:00:00Z")
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def end_date
         | 
| 21 | 
            +
                    @options[:end_date].strftime("%Y-%m-%dT00:00:00Z")
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def check_params!
         | 
| 25 | 
            +
                    raise QueryParamMissing.new("end_date")   if @options[:end_date].blank?
         | 
| 26 | 
            +
                    raise QueryParamMissing.new("start_date") if @options[:start_date].blank?
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def check_dates!
         | 
| 30 | 
            +
                    if @options[:end_date] - @options[:start_date] > 7.days
         | 
| 31 | 
            +
                      raise InvalidDateRange.new(@options[:start_date], @options[:end_date])
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def params
         | 
| 36 | 
            +
                    check_params!
         | 
| 37 | 
            +
                    check_dates!
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    params = {
         | 
| 40 | 
            +
                      start_date: start_date,
         | 
| 41 | 
            +
                      end_date:   end_date,
         | 
| 42 | 
            +
                      format:     format,
         | 
| 43 | 
            +
                      limit:      limit,
         | 
| 44 | 
            +
                      apikey:     config.key,
         | 
| 45 | 
            +
                      sig:        config.signature
         | 
| 46 | 
            +
                    }
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  def config
         | 
| 50 | 
            +
                    Masheri.config
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  def query_params
         | 
| 54 | 
            +
                    URI.encode_www_form(params).gsub("%3A", ":")
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  def service_id
         | 
| 58 | 
            +
                    @options[:service_id]
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  def resource
         | 
| 62 | 
            +
                    @options[:resource]
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                  def path
         | 
| 66 | 
            +
                    "/v2/rest/#{config.site_id}/reports/calls/#{resource}/service/#{service_id}"
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  def url
         | 
| 70 | 
            +
                    URI::HTTP.build(host: config.host, path: path, query: query_params).to_s
         | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
                end
         | 
| 73 | 
            +
              end
         | 
| 74 | 
            +
            end
         | 
| @@ -0,0 +1,130 @@ | |
| 1 | 
            +
            module Masheri
         | 
| 2 | 
            +
              class RpcResponse
         | 
| 3 | 
            +
                def initialize(query_builder)
         | 
| 4 | 
            +
                  @query_builder = query_builder
         | 
| 5 | 
            +
                  @json          = query_builder.to_json
         | 
| 6 | 
            +
                end
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def result
         | 
| 9 | 
            +
                  @json["result"]
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def error
         | 
| 13 | 
            +
                  @json["error"]
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def items
         | 
| 17 | 
            +
                  result["items"]
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def to_objects
         | 
| 21 | 
            +
                  items.map do |item|
         | 
| 22 | 
            +
                    @query_builder.klass.new(item)
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def find_each(&block)
         | 
| 27 | 
            +
                  items.each(&block)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  if next_page?
         | 
| 30 | 
            +
                    response = next_page!
         | 
| 31 | 
            +
                    response.find_each(&block)
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def error?
         | 
| 36 | 
            +
                  error.present?
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                def length
         | 
| 40 | 
            +
                  items.length
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def more_pages?
         | 
| 44 | 
            +
                  current_page < total_pages
         | 
| 45 | 
            +
                end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                alias :next_page? :more_pages?
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                def next_page_number
         | 
| 50 | 
            +
                  current_page + 1
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                # Can't call Mashery too many times, or they get mad
         | 
| 54 | 
            +
                MASHERY_WAIT_TIME = 0.1
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                def next_page!
         | 
| 57 | 
            +
                  sleep(MASHERY_WAIT_TIME)
         | 
| 58 | 
            +
                  RpcResponse.new(@query_builder.page(next_page_number))
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                def total_items
         | 
| 62 | 
            +
                  result["total_items"]
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                def total_pages
         | 
| 66 | 
            +
                  result["total_pages"]
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def current_page
         | 
| 70 | 
            +
                  result["current_page"]
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                def items_per_page
         | 
| 74 | 
            +
                  result["items_per_page"]
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
              class RpcClient
         | 
| 79 | 
            +
                def config
         | 
| 80 | 
            +
                  Masheri.config
         | 
| 81 | 
            +
                end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                # Test Mashery API with echo service
         | 
| 84 | 
            +
                def echo(value)
         | 
| 85 | 
            +
                  call_remote('test.echo', value)
         | 
| 86 | 
            +
                end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                def query_builder(klass)
         | 
| 89 | 
            +
                  Masheri::QueryBuilder.new(klass)
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                # Use the Mashery query language to grab data
         | 
| 93 | 
            +
                def query(string)
         | 
| 94 | 
            +
                  call_remote("object.query", params: string)
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                # Create an object
         | 
| 98 | 
            +
                def create(type, params)
         | 
| 99 | 
            +
                  # TODO: Handle params!
         | 
| 100 | 
            +
                  call_remote [type_name, "create"].join('.')
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                def call_remote(method, opts = {})
         | 
| 104 | 
            +
                  perform('method' => method, 'params' => Array(opts[:params]), 'id' => 1)
         | 
| 105 | 
            +
                end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                protected
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                def perform(params)
         | 
| 110 | 
            +
                  JSON.parse(post!(full_url, params))
         | 
| 111 | 
            +
                end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                def post!(full_url, params)
         | 
| 114 | 
            +
                  ::RestClient.post(full_url, params.to_json, {
         | 
| 115 | 
            +
                                      "Content-Type"   => "application/json",
         | 
| 116 | 
            +
                                      "Accept"         => "text/plain",
         | 
| 117 | 
            +
                                      "Content-Length" => params.size
         | 
| 118 | 
            +
                                    })
         | 
| 119 | 
            +
                end
         | 
| 120 | 
            +
             | 
| 121 | 
            +
                def full_url
         | 
| 122 | 
            +
                  build_url(config.site_id, config.key, config.signature)
         | 
| 123 | 
            +
                end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
                def build_url(site_id, apikey, signature)
         | 
| 126 | 
            +
                  query = URI.encode_www_form(apikey: apikey, sig: signature)
         | 
| 127 | 
            +
                  URI::HTTP.build(host: config.host, path: "/v2/json-rpc/#{site_id}", query: query.to_s).to_s
         | 
| 128 | 
            +
                end
         | 
| 129 | 
            +
              end
         | 
| 130 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            module Masheri
         | 
| 2 | 
            +
              class Service
         | 
| 3 | 
            +
                include QueryInstanceMethods
         | 
| 4 | 
            +
                extend QueryClassMethods
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                attr_accessor :service_key, :name, :limits, :created, :updated, :object_type
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def self.object_type
         | 
| 9 | 
            +
                  "services"
         | 
| 10 | 
            +
                end
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                def developer_activity(options = {})
         | 
| 13 | 
            +
                  Masheri.rest.developer_activity(service_key, start_date: 1.day.ago, end_date: 0.days.ago)
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def self.show_list
         | 
| 17 | 
            +
                  find_each do |entry|
         | 
| 18 | 
            +
                    printf "Service Name: %-50s Service Key: %s\n", entry.name.inspect, entry.service_key
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: masheri
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.3. | 
| 4 | 
            +
              version: 0.3.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: 2013-09- | 
| 12 | 
            +
            date: 2013-09-12 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: activesupport
         | 
| @@ -28,23 +28,7 @@ dependencies: | |
| 28 28 | 
             
                  - !ruby/object:Gem::Version
         | 
| 29 29 | 
             
                    version: 3.1.0
         | 
| 30 30 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 31 | 
            -
              name:  | 
| 32 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 33 | 
            -
                none: false
         | 
| 34 | 
            -
                requirements:
         | 
| 35 | 
            -
                - - ! '>='
         | 
| 36 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 37 | 
            -
                    version: '0'
         | 
| 38 | 
            -
              type: :runtime
         | 
| 39 | 
            -
              prerelease: false
         | 
| 40 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 41 | 
            -
                none: false
         | 
| 42 | 
            -
                requirements:
         | 
| 43 | 
            -
                - - ! '>='
         | 
| 44 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 45 | 
            -
                    version: '0'
         | 
| 46 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 47 | 
            -
              name: httparty
         | 
| 31 | 
            +
              name: rest-client
         | 
| 48 32 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 49 33 | 
             
                none: false
         | 
| 50 34 | 
             
                requirements:
         | 
| @@ -84,25 +68,26 @@ extra_rdoc_files: | |
| 84 68 | 
             
            - README.md
         | 
| 85 69 | 
             
            - README.textile
         | 
| 86 70 | 
             
            files:
         | 
| 87 | 
            -
            - Gemfile
         | 
| 88 | 
            -
            - Gemfile.lock
         | 
| 89 | 
            -
            - LICENSE.txt
         | 
| 90 | 
            -
            - README.md
         | 
| 91 | 
            -
            - README.textile
         | 
| 92 | 
            -
            - Rakefile
         | 
| 93 | 
            -
            - VERSION
         | 
| 94 71 | 
             
            - lib/masheri.rb
         | 
| 95 72 | 
             
            - lib/masheri/api_object_base.rb
         | 
| 96 | 
            -
            - lib/masheri/ | 
| 73 | 
            +
            - lib/masheri/config.rb
         | 
| 97 74 | 
             
            - lib/masheri/exceptions.rb
         | 
| 98 75 | 
             
            - lib/masheri/init.rb
         | 
| 99 76 | 
             
            - lib/masheri/key.rb
         | 
| 77 | 
            +
            - lib/masheri/local.rb
         | 
| 100 78 | 
             
            - lib/masheri/member.rb
         | 
| 101 79 | 
             
            - lib/masheri/query.rb
         | 
| 80 | 
            +
            - lib/masheri/query_builder.rb
         | 
| 81 | 
            +
            - lib/masheri/query_methods.rb
         | 
| 102 82 | 
             
            - lib/masheri/rails.rb
         | 
| 83 | 
            +
            - lib/masheri/rest_client.rb
         | 
| 84 | 
            +
            - lib/masheri/rest_client/query.rb
         | 
| 103 85 | 
             
            - lib/masheri/role.rb
         | 
| 104 | 
            -
            - masheri. | 
| 105 | 
            -
            -  | 
| 86 | 
            +
            - lib/masheri/rpc_client.rb
         | 
| 87 | 
            +
            - lib/masheri/service.rb
         | 
| 88 | 
            +
            - LICENSE.txt
         | 
| 89 | 
            +
            - README.md
         | 
| 90 | 
            +
            - README.textile
         | 
| 106 91 | 
             
            homepage: http://github.com/farleyknight/masheri
         | 
| 107 92 | 
             
            licenses:
         | 
| 108 93 | 
             
            - MIT
         | 
| @@ -118,7 +103,7 @@ required_ruby_version: !ruby/object:Gem::Requirement | |
| 118 103 | 
             
                  version: '0'
         | 
| 119 104 | 
             
                  segments:
         | 
| 120 105 | 
             
                  - 0
         | 
| 121 | 
            -
                  hash:  | 
| 106 | 
            +
                  hash: 2969431552703139300
         | 
| 122 107 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 123 108 | 
             
              none: false
         | 
| 124 109 | 
             
              requirements:
         | 
    
        data/Gemfile
    DELETED
    
    
    
        data/Gemfile.lock
    DELETED
    
    | @@ -1,31 +0,0 @@ | |
| 1 | 
            -
            GEM
         | 
| 2 | 
            -
              remote: http://rubygems.org/
         | 
| 3 | 
            -
              specs:
         | 
| 4 | 
            -
                activesupport (4.0.0)
         | 
| 5 | 
            -
                  i18n (~> 0.6, >= 0.6.4)
         | 
| 6 | 
            -
                  minitest (~> 4.2)
         | 
| 7 | 
            -
                  multi_json (~> 1.3)
         | 
| 8 | 
            -
                  thread_safe (~> 0.1)
         | 
| 9 | 
            -
                  tzinfo (~> 0.3.37)
         | 
| 10 | 
            -
                atomic (1.1.13)
         | 
| 11 | 
            -
                httparty (0.11.0)
         | 
| 12 | 
            -
                  multi_json (~> 1.0)
         | 
| 13 | 
            -
                  multi_xml (>= 0.5.2)
         | 
| 14 | 
            -
                i18n (0.6.5)
         | 
| 15 | 
            -
                json (1.8.0)
         | 
| 16 | 
            -
                minitest (4.7.5)
         | 
| 17 | 
            -
                multi_json (1.7.9)
         | 
| 18 | 
            -
                multi_xml (0.5.5)
         | 
| 19 | 
            -
                thor (0.18.1)
         | 
| 20 | 
            -
                thread_safe (0.1.2)
         | 
| 21 | 
            -
                  atomic
         | 
| 22 | 
            -
                tzinfo (0.3.37)
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            PLATFORMS
         | 
| 25 | 
            -
              ruby
         | 
| 26 | 
            -
             | 
| 27 | 
            -
            DEPENDENCIES
         | 
| 28 | 
            -
              activesupport (>= 3.1.0)
         | 
| 29 | 
            -
              httparty
         | 
| 30 | 
            -
              json
         | 
| 31 | 
            -
              thor
         | 
    
        data/Rakefile
    DELETED
    
    | @@ -1,15 +0,0 @@ | |
| 1 | 
            -
            begin
         | 
| 2 | 
            -
              require 'jeweler'
         | 
| 3 | 
            -
              Jeweler::RubygemsDotOrgTasks.new
         | 
| 4 | 
            -
             | 
| 5 | 
            -
              Jeweler::Tasks.new do |gemspec|
         | 
| 6 | 
            -
                gemspec.name     = "masheri"
         | 
| 7 | 
            -
                gemspec.summary  = "Rails gem for Mashery. Clean config and includes tests."
         | 
| 8 | 
            -
                gemspec.email    = "farleyknight@gmail.com"
         | 
| 9 | 
            -
                gemspec.homepage = "http://github.com/farleyknight/masheri"
         | 
| 10 | 
            -
                gemspec.authors  = ["Farley Knight"]
         | 
| 11 | 
            -
                gemspec.license  = "MIT"
         | 
| 12 | 
            -
              end
         | 
| 13 | 
            -
            rescue LoadError => error
         | 
| 14 | 
            -
              puts error
         | 
| 15 | 
            -
            end
         | 
    
        data/VERSION
    DELETED
    
    | @@ -1 +0,0 @@ | |
| 1 | 
            -
            0.3.1
         | 
    
        data/lib/masheri/client.rb
    DELETED
    
    | @@ -1,61 +0,0 @@ | |
| 1 | 
            -
            require 'active_support'
         | 
| 2 | 
            -
            require 'json'
         | 
| 3 | 
            -
            require 'httparty'
         | 
| 4 | 
            -
            require 'digest/md5'
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            module Masheri
         | 
| 7 | 
            -
              class Client
         | 
| 8 | 
            -
                TEST_HOST = 'api.sandbox.mashery.com'
         | 
| 9 | 
            -
                PRODUCTION_HOST = 'api.mashery.com'
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                def self.from_yaml(yaml_file)
         | 
| 12 | 
            -
                  config = YAML.load_file(yaml_file)
         | 
| 13 | 
            -
                  new(config["site_id"], config["key"], config["secret"])
         | 
| 14 | 
            -
                end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                attr_accessor :uri, :key, :secret
         | 
| 17 | 
            -
             | 
| 18 | 
            -
                def initialize(site_id, key, secret)
         | 
| 19 | 
            -
                  host    = Masheri.test_mode ? TEST_HOST : PRODUCTION_HOST
         | 
| 20 | 
            -
                  @uri    = "http://#{host}/v2/json-rpc/#{site_id}"
         | 
| 21 | 
            -
                  @key    = key
         | 
| 22 | 
            -
                  @secret = secret
         | 
| 23 | 
            -
                end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                def echo(value)
         | 
| 26 | 
            -
                  call_remote('test.echo', value)
         | 
| 27 | 
            -
                end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                def perform(params)
         | 
| 30 | 
            -
                  # all calls are synchronous, so id in request and response will always be 1
         | 
| 31 | 
            -
                  if Masheri.logger
         | 
| 32 | 
            -
                    Masheri.logger.debug("Calling query with params #{params.inspect} on URI #{full_url}")
         | 
| 33 | 
            -
                  end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                  response = RestClient.post(full_url, params.to_json, {
         | 
| 36 | 
            -
                                               "Content-Type"   => "application/json",
         | 
| 37 | 
            -
                                               "Accept"         => "text/plain",
         | 
| 38 | 
            -
                                               "Content-Length" => params.size
         | 
| 39 | 
            -
                                             })
         | 
| 40 | 
            -
             | 
| 41 | 
            -
                  JSON.parse response
         | 
| 42 | 
            -
                end
         | 
| 43 | 
            -
             | 
| 44 | 
            -
                def query(string)
         | 
| 45 | 
            -
                  call_remote("object.query", params: string)
         | 
| 46 | 
            -
                end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                def call_remote(method, opts = {})
         | 
| 49 | 
            -
                  perform({'method' => method, 'params'=> [opts[:params]], 'id' => 1})
         | 
| 50 | 
            -
                end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                def create(type, params)
         | 
| 53 | 
            -
                  call_remote("#{type}.create")
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
             | 
| 56 | 
            -
                protected
         | 
| 57 | 
            -
                def full_url
         | 
| 58 | 
            -
                  "#{@uri}?apikey=#{@key}&sig=#{Digest::MD5.hexdigest(@key + @secret + Time.now.to_f.to_i.to_s)}"
         | 
| 59 | 
            -
                end
         | 
| 60 | 
            -
              end
         | 
| 61 | 
            -
            end
         | 
    
        data/masheri.gemspec
    DELETED
    
    | @@ -1,67 +0,0 @@ | |
| 1 | 
            -
            # Generated by jeweler
         | 
| 2 | 
            -
            # DO NOT EDIT THIS FILE DIRECTLY
         | 
| 3 | 
            -
            # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
         | 
| 4 | 
            -
            # -*- encoding: utf-8 -*-
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            Gem::Specification.new do |s|
         | 
| 7 | 
            -
              s.name = "masheri"
         | 
| 8 | 
            -
              s.version = "0.3.1"
         | 
| 9 | 
            -
             | 
| 10 | 
            -
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 | 
            -
              s.authors = ["Farley Knight"]
         | 
| 12 | 
            -
              s.date = "2013-09-05"
         | 
| 13 | 
            -
              s.email = "farleyknight@gmail.com"
         | 
| 14 | 
            -
              s.extra_rdoc_files = [
         | 
| 15 | 
            -
                "LICENSE.txt",
         | 
| 16 | 
            -
                "README.md",
         | 
| 17 | 
            -
                "README.textile"
         | 
| 18 | 
            -
              ]
         | 
| 19 | 
            -
              s.files = [
         | 
| 20 | 
            -
                "Gemfile",
         | 
| 21 | 
            -
                "Gemfile.lock",
         | 
| 22 | 
            -
                "LICENSE.txt",
         | 
| 23 | 
            -
                "README.md",
         | 
| 24 | 
            -
                "README.textile",
         | 
| 25 | 
            -
                "Rakefile",
         | 
| 26 | 
            -
                "VERSION",
         | 
| 27 | 
            -
                "lib/masheri.rb",
         | 
| 28 | 
            -
                "lib/masheri/api_object_base.rb",
         | 
| 29 | 
            -
                "lib/masheri/client.rb",
         | 
| 30 | 
            -
                "lib/masheri/exceptions.rb",
         | 
| 31 | 
            -
                "lib/masheri/init.rb",
         | 
| 32 | 
            -
                "lib/masheri/key.rb",
         | 
| 33 | 
            -
                "lib/masheri/member.rb",
         | 
| 34 | 
            -
                "lib/masheri/query.rb",
         | 
| 35 | 
            -
                "lib/masheri/rails.rb",
         | 
| 36 | 
            -
                "lib/masheri/role.rb",
         | 
| 37 | 
            -
                "masheri.gemspec",
         | 
| 38 | 
            -
                "tasks/mashery.thor"
         | 
| 39 | 
            -
              ]
         | 
| 40 | 
            -
              s.homepage = "http://github.com/farleyknight/masheri"
         | 
| 41 | 
            -
              s.licenses = ["MIT"]
         | 
| 42 | 
            -
              s.require_paths = ["lib"]
         | 
| 43 | 
            -
              s.rubygems_version = "1.8.25"
         | 
| 44 | 
            -
              s.summary = "Rails gem for Mashery. Clean config and includes tests."
         | 
| 45 | 
            -
             | 
| 46 | 
            -
              if s.respond_to? :specification_version then
         | 
| 47 | 
            -
                s.specification_version = 3
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
         | 
| 50 | 
            -
                  s.add_runtime_dependency(%q<activesupport>, [">= 3.1.0"])
         | 
| 51 | 
            -
                  s.add_runtime_dependency(%q<thor>, [">= 0"])
         | 
| 52 | 
            -
                  s.add_runtime_dependency(%q<httparty>, [">= 0"])
         | 
| 53 | 
            -
                  s.add_runtime_dependency(%q<json>, [">= 0"])
         | 
| 54 | 
            -
                else
         | 
| 55 | 
            -
                  s.add_dependency(%q<activesupport>, [">= 3.1.0"])
         | 
| 56 | 
            -
                  s.add_dependency(%q<thor>, [">= 0"])
         | 
| 57 | 
            -
                  s.add_dependency(%q<httparty>, [">= 0"])
         | 
| 58 | 
            -
                  s.add_dependency(%q<json>, [">= 0"])
         | 
| 59 | 
            -
                end
         | 
| 60 | 
            -
              else
         | 
| 61 | 
            -
                s.add_dependency(%q<activesupport>, [">= 3.1.0"])
         | 
| 62 | 
            -
                s.add_dependency(%q<thor>, [">= 0"])
         | 
| 63 | 
            -
                s.add_dependency(%q<httparty>, [">= 0"])
         | 
| 64 | 
            -
                s.add_dependency(%q<json>, [">= 0"])
         | 
| 65 | 
            -
              end
         | 
| 66 | 
            -
            end
         | 
| 67 | 
            -
             | 
    
        data/tasks/mashery.thor
    DELETED
    
    | @@ -1,200 +0,0 @@ | |
| 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.test_mode = ENV['MASHERY_PRODUCTION_MODE'].blank?
         | 
| 28 | 
            -
                  ::Mashery.logger.level = Logger::DEBUG
         | 
| 29 | 
            -
                  ::Mashery.client = ::Mashery::Client.new(site_id, key, secret)
         | 
| 30 | 
            -
                  begin
         | 
| 31 | 
            -
                    yield
         | 
| 32 | 
            -
                  rescue ::Mashery::HttpException => e
         | 
| 33 | 
            -
                    error("HTTP error: #{e.message}")
         | 
| 34 | 
            -
                  rescue ::Mashery::JsonRpcException => e
         | 
| 35 | 
            -
                    error(e.message)
         | 
| 36 | 
            -
                  rescue ::Mashery::ValidationException => e
         | 
| 37 | 
            -
                    e.errors.each {|err| warn("#{err['field']}: #{err['message']}")}
         | 
| 38 | 
            -
                    error("Unable to execute method due to validation errors")
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
                end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                def warn(msg)
         | 
| 43 | 
            -
                  say_status :WARN, msg, :yellow
         | 
| 44 | 
            -
                end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                def ok(msg)
         | 
| 47 | 
            -
                  say_status :OK, msg
         | 
| 48 | 
            -
                end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                def error(msg)
         | 
| 51 | 
            -
                  say_status :ERROR, msg, :red
         | 
| 52 | 
            -
                end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                def debug(msg)
         | 
| 55 | 
            -
                  say_status :DEBUG, msg, :cyan
         | 
| 56 | 
            -
                end
         | 
| 57 | 
            -
              end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
              class MemberCLI < CLI
         | 
| 60 | 
            -
                namespace 'mashery:member'
         | 
| 61 | 
            -
             | 
| 62 | 
            -
                desc "create USERNAME DISPLAY_NAME EMAIL [--fields ...]", "Create a member"
         | 
| 63 | 
            -
                method_option :fields, :type => :hash
         | 
| 64 | 
            -
                def create(username, display_name, email)
         | 
| 65 | 
            -
                  run do
         | 
| 66 | 
            -
                    begin
         | 
| 67 | 
            -
                      member = ::Mashery::Member.create(username, display_name, email, options[:fields])
         | 
| 68 | 
            -
                      ok("Member #{member.username} created")
         | 
| 69 | 
            -
                    rescue ::Mashery::DuplicateObjectException
         | 
| 70 | 
            -
                      error("The username #{username} has already been claimed")
         | 
| 71 | 
            -
                    end
         | 
| 72 | 
            -
                  end
         | 
| 73 | 
            -
                end
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                desc "fetch USERNAME", "Fetch a member"
         | 
| 76 | 
            -
                def fetch(username)
         | 
| 77 | 
            -
                  run do
         | 
| 78 | 
            -
                    member = ::Mashery::Member.fetch(username)
         | 
| 79 | 
            -
                    if member
         | 
| 80 | 
            -
                      ok("Member #{username} found")
         | 
| 81 | 
            -
                      say(member.to_yaml)
         | 
| 82 | 
            -
                    else
         | 
| 83 | 
            -
                      warn("Member #{username} not found")
         | 
| 84 | 
            -
                    end
         | 
| 85 | 
            -
                  end
         | 
| 86 | 
            -
                end
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                desc "addrole USERNAME ROLE_ID", "Assign a role to a member"
         | 
| 89 | 
            -
                def addrole(username, role_id)
         | 
| 90 | 
            -
                  run do
         | 
| 91 | 
            -
                    member = ::Mashery::Member.fetch(username)
         | 
| 92 | 
            -
                    if member
         | 
| 93 | 
            -
                      role = ::Mashery::Role.fetch(role_id.to_i)
         | 
| 94 | 
            -
                      if role
         | 
| 95 | 
            -
                        member.add_role(role)
         | 
| 96 | 
            -
                        ok("Role #{role.name} assigned to member #{username}")
         | 
| 97 | 
            -
                      else
         | 
| 98 | 
            -
                        warn("Role #{role_id} not found")
         | 
| 99 | 
            -
                      end
         | 
| 100 | 
            -
                    else
         | 
| 101 | 
            -
                      warn("Member #{username} not found")
         | 
| 102 | 
            -
                    end
         | 
| 103 | 
            -
                  end
         | 
| 104 | 
            -
                end
         | 
| 105 | 
            -
             | 
| 106 | 
            -
                desc "rmrole USERNAME ROLE_ID", "Revoke a role from a member"
         | 
| 107 | 
            -
                def rmrole(username, role_id)
         | 
| 108 | 
            -
                  run do
         | 
| 109 | 
            -
                    member = ::Mashery::Member.fetch(username)
         | 
| 110 | 
            -
                    if member
         | 
| 111 | 
            -
                      role = ::Mashery::Role.fetch(role_id.to_i)
         | 
| 112 | 
            -
                      if role
         | 
| 113 | 
            -
                        member.remove_role(role)
         | 
| 114 | 
            -
                        ok("Role #{role.name} revoked from member #{username}")
         | 
| 115 | 
            -
                      else
         | 
| 116 | 
            -
                        warn("Role #{role_id} not found")
         | 
| 117 | 
            -
                      end
         | 
| 118 | 
            -
                    else
         | 
| 119 | 
            -
                      warn("Member #{username} not found")
         | 
| 120 | 
            -
                    end
         | 
| 121 | 
            -
                  end
         | 
| 122 | 
            -
                end
         | 
| 123 | 
            -
             | 
| 124 | 
            -
                desc "delete USERNAME", "Delete a member"
         | 
| 125 | 
            -
                def delete(username)
         | 
| 126 | 
            -
                  run do
         | 
| 127 | 
            -
                    ::Mashery::Member.delete(username)
         | 
| 128 | 
            -
                    ok("Member #{username} deleted")
         | 
| 129 | 
            -
                  end
         | 
| 130 | 
            -
                end
         | 
| 131 | 
            -
              end
         | 
| 132 | 
            -
             | 
| 133 | 
            -
              class KeyCLI < CLI
         | 
| 134 | 
            -
                namespace 'mashery:key'
         | 
| 135 | 
            -
             | 
| 136 | 
            -
                desc "create SERVICE_KEY USERNAME [--fields ...]", "Create a key"
         | 
| 137 | 
            -
                method_option :fields, :type => :hash
         | 
| 138 | 
            -
                def create(service_key, username)
         | 
| 139 | 
            -
                  run do
         | 
| 140 | 
            -
                    key = ::Mashery::Key.create(service_key, username, options[:fields])
         | 
| 141 | 
            -
                    ok("Key #{key.id} created for member #{username} and service #{service_key}")
         | 
| 142 | 
            -
                  end
         | 
| 143 | 
            -
                end
         | 
| 144 | 
            -
             | 
| 145 | 
            -
                desc "fetch ID", "Fetch a key"
         | 
| 146 | 
            -
                def fetch(id)
         | 
| 147 | 
            -
                  run do
         | 
| 148 | 
            -
                    key = ::Mashery::Key.fetch(id.to_i)
         | 
| 149 | 
            -
                    if key
         | 
| 150 | 
            -
                      ok("Key #{id} found")
         | 
| 151 | 
            -
                      say(key.to_yaml)
         | 
| 152 | 
            -
                    else
         | 
| 153 | 
            -
                      warn("Key #{id} not found")
         | 
| 154 | 
            -
                    end
         | 
| 155 | 
            -
                  end
         | 
| 156 | 
            -
                end
         | 
| 157 | 
            -
             | 
| 158 | 
            -
                desc "delete ID", "Delete a key"
         | 
| 159 | 
            -
                def delete(id)
         | 
| 160 | 
            -
                  run do
         | 
| 161 | 
            -
                    ::Mashery::Key.delete(id.to_i)
         | 
| 162 | 
            -
                    ok("Key #{id} deleted")
         | 
| 163 | 
            -
                  end
         | 
| 164 | 
            -
                end
         | 
| 165 | 
            -
              end
         | 
| 166 | 
            -
             | 
| 167 | 
            -
              class RoleCLI < CLI
         | 
| 168 | 
            -
                namespace 'mashery:role'
         | 
| 169 | 
            -
             | 
| 170 | 
            -
                desc "create NAME [--fields ...]", "Create a role"
         | 
| 171 | 
            -
                method_option :fields, :type => :hash
         | 
| 172 | 
            -
                def create(name)
         | 
| 173 | 
            -
                  run do
         | 
| 174 | 
            -
                    role = ::Mashery::Role.create(name, options[:fields])
         | 
| 175 | 
            -
                    ok("Role #{role.id} created with name #{name}")
         | 
| 176 | 
            -
                  end
         | 
| 177 | 
            -
                end
         | 
| 178 | 
            -
             | 
| 179 | 
            -
                desc "fetch ID", "Fetch a role"
         | 
| 180 | 
            -
                def fetch(id)
         | 
| 181 | 
            -
                  run do
         | 
| 182 | 
            -
                    role = ::Mashery::Role.fetch(id.to_i)
         | 
| 183 | 
            -
                    if role
         | 
| 184 | 
            -
                      ok("Role #{id} found")
         | 
| 185 | 
            -
                      say(role.to_yaml)
         | 
| 186 | 
            -
                    else
         | 
| 187 | 
            -
                      warn("Role #{id} not found")
         | 
| 188 | 
            -
                    end
         | 
| 189 | 
            -
                  end
         | 
| 190 | 
            -
                end
         | 
| 191 | 
            -
             | 
| 192 | 
            -
                desc "delete ID", "Delete a role"
         | 
| 193 | 
            -
                def delete(id)
         | 
| 194 | 
            -
                  run do
         | 
| 195 | 
            -
                    ::Mashery::Role.delete(id.to_i)
         | 
| 196 | 
            -
                    ok("Role #{id} deleted")
         | 
| 197 | 
            -
                  end
         | 
| 198 | 
            -
                end
         | 
| 199 | 
            -
              end
         | 
| 200 | 
            -
            end
         |