loco_bill 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +28 -0
- data/lib/loco_bill/configuration.rb +42 -0
- data/lib/loco_bill/login.rb +1 -1
- data/lib/loco_bill/request.rb +31 -20
- data/lib/loco_bill.rb +1 -0
- metadata +5 -4
- data/README +0 -15
    
        data/README.rdoc
    ADDED
    
    | @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            LocoBill
         | 
| 2 | 
            +
            --------
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            An interface for interacting with Bill.com's API.
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            Requires Nokogiri.
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            Create an initializer (or what have you) to set the following:
         | 
| 9 | 
            +
            ==============================================================
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              LocoBill::Configuration.environment = :production # or :sandbox
         | 
| 12 | 
            +
              LocoBill::Configuration.application_key = "aaa"
         | 
| 13 | 
            +
              LocoBill::Configuration.org_id = "bbb"
         | 
| 14 | 
            +
              LocoBill::Configuration.username = "xxx"
         | 
| 15 | 
            +
              LocoBill::Configuration.password = "yyy"
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            Use like so:
         | 
| 18 | 
            +
            ============
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              vendor = LocoBill.create_vendor :vendor => {:name => 'Test'} # will auto-login for you and store the session ID, if you're not already logged in
         | 
| 21 | 
            +
              vendor.result.inspect => #<LocoBill::RequestResult transactionId="Transaction1", status="OK", id="xxy">
         | 
| 22 | 
            +
              
         | 
| 23 | 
            +
              LocoBill.create_bill :bill => {
         | 
| 24 | 
            +
                :billLineItems => [
         | 
| 25 | 
            +
                  {:billLineItem => {:amount => 11}},
         | 
| 26 | 
            +
                  {:billLineItem => {:amount => 32}}
         | 
| 27 | 
            +
                ]
         | 
| 28 | 
            +
              }
         | 
| @@ -0,0 +1,42 @@ | |
| 1 | 
            +
            module LocoBill
         | 
| 2 | 
            +
              module Configuration
         | 
| 3 | 
            +
                API_VERSION = "1.0" # :nodoc:
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                class << self
         | 
| 6 | 
            +
                  attr_accessor :session_id, :transaction_id
         | 
| 7 | 
            +
                  attr_writer :application_key, :username, :password, :org_id
         | 
| 8 | 
            +
                end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def self.expectant_reader(*attributes) # :nodoc:
         | 
| 11 | 
            +
                  attributes.each do |attribute|
         | 
| 12 | 
            +
                    (class << self; self; end).send(:define_method, attribute) do
         | 
| 13 | 
            +
                      attribute_value = instance_variable_get("@#{attribute}")
         | 
| 14 | 
            +
                      raise "#{attribute} needs to be set" unless attribute_value
         | 
| 15 | 
            +
                      attribute_value
         | 
| 16 | 
            +
                    end
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
                expectant_reader :environment, :application_key, :username, :password, :org_id
         | 
| 20 | 
            +
              
         | 
| 21 | 
            +
                def self.environment=(env)
         | 
| 22 | 
            +
                  unless [:sandbox, :production].include?(env)
         | 
| 23 | 
            +
                    raise ArgumentError, "#{env.inspect} is not a valid environment"
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                  @environment = env
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
                
         | 
| 28 | 
            +
                def self.api_endpoint
         | 
| 29 | 
            +
                  "/crudApi"
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
                
         | 
| 32 | 
            +
                def self.server # :nodoc:
         | 
| 33 | 
            +
                  case environment
         | 
| 34 | 
            +
                  when :production
         | 
| 35 | 
            +
                    "api.bill.com"
         | 
| 36 | 
            +
                  when :sandbox
         | 
| 37 | 
            +
                    "api-test.cashview.com"
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
                
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
            end
         | 
    
        data/lib/loco_bill/login.rb
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            module LocoBill
         | 
| 2 2 | 
             
              def self.login
         | 
| 3 | 
            -
                Request.new(:login, :username =>  | 
| 3 | 
            +
                Request.new(:login, :username => LocoBill::Configuration.username, :password => LocoBill::Configuration.password, :orgID => LocoBill::Configuration.org_id)
         | 
| 4 4 | 
             
              end
         | 
| 5 5 | 
             
            end
         | 
    
        data/lib/loco_bill/request.rb
    CHANGED
    
    | @@ -1,31 +1,32 @@ | |
| 1 1 | 
             
            module LocoBill
         | 
| 2 2 | 
             
              class Request
         | 
| 3 | 
            -
                 | 
| 4 | 
            -
                @@api_domain = 'api.bill.com'
         | 
| 5 | 
            -
                @@api_endpoint = "/crudApi"
         | 
| 6 | 
            -
                @@session_id = nil
         | 
| 7 | 
            -
                @@transaction_id = 0
         | 
| 3 | 
            +
                attr_reader :result
         | 
| 8 4 | 
             
                NON_OPERATION_WRAPPED_ACTIONS = [:login, :logout, :getorglist]
         | 
| 9 5 | 
             
                INLINE_PARAMS_ACTIONS = {:get_list => :object}
         | 
| 10 6 |  | 
| 11 7 | 
             
                def initialize(action, params={})
         | 
| 12 8 | 
             
                  @action = action.to_sym
         | 
| 13 | 
            -
                   | 
| 14 | 
            -
                   | 
| 15 | 
            -
                    @@session_id = LocoBill.login.result.sessionId
         | 
| 16 | 
            -
                  end
         | 
| 9 | 
            +
                  auto_login
         | 
| 10 | 
            +
                  
         | 
| 17 11 | 
             
                  @params = params
         | 
| 18 12 | 
             
                  @result = process_response(api(build_request_xml))
         | 
| 19 13 | 
             
                end
         | 
| 20 14 |  | 
| 15 | 
            +
                # auto-login & grab session id if we don't already have one.
         | 
| 16 | 
            +
                def auto_login
         | 
| 17 | 
            +
                  if LocoBill::Configuration.session_id.nil? && @action != :login
         | 
| 18 | 
            +
                    LocoBill::Configuration.session_id = LocoBill.login.result.sessionId
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
                
         | 
| 21 22 | 
             
                def build_request_xml
         | 
| 22 23 | 
             
                  operation_wrapped = !NON_OPERATION_WRAPPED_ACTIONS.include?(@action)
         | 
| 23 24 |  | 
| 24 25 | 
             
                  Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
         | 
| 25 | 
            -
                    xml.request(:version =>  | 
| 26 | 
            +
                    xml.request(:version => LocoBill::Configuration::API_VERSION, :applicationkey => LocoBill::Configuration.application_key) {
         | 
| 26 27 | 
             
                      if operation_wrapped
         | 
| 27 28 | 
             
                        # gotta wrap most of the api calls in an "operation" block with a transaction id & session id
         | 
| 28 | 
            -
                        xml.operation(:transactionId => transaction_id, :sessionId =>  | 
| 29 | 
            +
                        xml.operation(:transactionId => LocoBill::Configuration.transaction_id, :sessionId => LocoBill::Configuration.session_id) { action_xml(xml) }
         | 
| 29 30 | 
             
                      else
         | 
| 30 31 | 
             
                        action_xml(xml)
         | 
| 31 32 | 
             
                      end
         | 
| @@ -46,27 +47,37 @@ module LocoBill | |
| 46 47 | 
             
                # BillApi.create_vendor :vendor => {:name => 'Test'}
         | 
| 47 48 | 
             
                def params_xml(xml, params)
         | 
| 48 49 | 
             
                  params.each do |k, v|
         | 
| 49 | 
            -
                     | 
| 50 | 
            -
                       | 
| 51 | 
            -
             | 
| 52 | 
            -
                       | 
| 53 | 
            -
             | 
| 50 | 
            +
                    xml.send(k) {
         | 
| 51 | 
            +
                      if v.is_a?(Hash)
         | 
| 52 | 
            +
                        params_xml(xml, v)
         | 
| 53 | 
            +
                      elsif v.is_a?(Array)
         | 
| 54 | 
            +
                        v.each do |hash|
         | 
| 55 | 
            +
                          params_xml(xml, hash)
         | 
| 56 | 
            +
                        end
         | 
| 57 | 
            +
                      else
         | 
| 58 | 
            +
                        if v.is_a?(Time) || v.is_a?(Date)
         | 
| 59 | 
            +
                          v = v.to_time.strftime("%m/%d/%Y")
         | 
| 60 | 
            +
                        end
         | 
| 61 | 
            +
                        
         | 
| 62 | 
            +
                        xml.text(v)
         | 
| 63 | 
            +
                      end
         | 
| 64 | 
            +
                    }
         | 
| 54 65 | 
             
                  end
         | 
| 55 66 | 
             
                end
         | 
| 56 67 |  | 
| 57 68 | 
             
                # generate a transaction id for operation requests
         | 
| 58 69 | 
             
                def transaction_id
         | 
| 59 | 
            -
                   | 
| 60 | 
            -
                  "Transaction#{ | 
| 70 | 
            +
                  ::Configuration.transaction_id += 1
         | 
| 71 | 
            +
                  "Transaction#{::Configuration.transaction_id}"
         | 
| 61 72 | 
             
                end
         | 
| 62 73 |  | 
| 63 74 | 
             
                def api(xml_body)
         | 
| 64 75 | 
             
                  # puts "XML BODY: #{xml_body}"
         | 
| 65 | 
            -
                  https = Net::HTTP.new( | 
| 76 | 
            +
                  https = Net::HTTP.new(LocoBill::Configuration.server, 443)
         | 
| 66 77 | 
             
                  https.use_ssl = true
         | 
| 67 78 | 
             
                  https.read_timeout=5 # 5 second timeout
         | 
| 68 79 | 
             
                  https.verify_mode = OpenSSL::SSL::VERIFY_NONE
         | 
| 69 | 
            -
                  req = Net::HTTP::Post.new( | 
| 80 | 
            +
                  req = Net::HTTP::Post.new(LocoBill::Configuration.api_endpoint)
         | 
| 70 81 | 
             
                  req.body = "request=#{req.send(:urlencode, xml_body)}" # prefixing the request with "request=" showed up in the docs absolutely nowhere. thanks, bill.com.
         | 
| 71 82 | 
             
                  req.content_type = 'application/x-www-form-urlencoded'
         | 
| 72 83 |  | 
    
        data/lib/loco_bill.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version | |
| 5 5 | 
             
              segments: 
         | 
| 6 6 | 
             
              - 0
         | 
| 7 7 | 
             
              - 0
         | 
| 8 | 
            -
              -  | 
| 9 | 
            -
              version: 0.0. | 
| 8 | 
            +
              - 4
         | 
| 9 | 
            +
              version: 0.0.4
         | 
| 10 10 | 
             
            platform: ruby
         | 
| 11 11 | 
             
            authors: 
         | 
| 12 12 | 
             
            - chris mcc
         | 
| @@ -14,7 +14,7 @@ autorequire: | |
| 14 14 | 
             
            bindir: bin
         | 
| 15 15 | 
             
            cert_chain: []
         | 
| 16 16 |  | 
| 17 | 
            -
            date: 2010-06- | 
| 17 | 
            +
            date: 2010-06-15 00:00:00 -04:00
         | 
| 18 18 | 
             
            default_executable: 
         | 
| 19 19 | 
             
            dependencies: 
         | 
| 20 20 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -41,10 +41,11 @@ extensions: [] | |
| 41 41 | 
             
            extra_rdoc_files: []
         | 
| 42 42 |  | 
| 43 43 | 
             
            files: 
         | 
| 44 | 
            +
            - lib/loco_bill/configuration.rb
         | 
| 44 45 | 
             
            - lib/loco_bill/login.rb
         | 
| 45 46 | 
             
            - lib/loco_bill/request.rb
         | 
| 46 47 | 
             
            - lib/loco_bill.rb
         | 
| 47 | 
            -
            - README
         | 
| 48 | 
            +
            - README.rdoc
         | 
| 48 49 | 
             
            - init.rb
         | 
| 49 50 | 
             
            has_rdoc: true
         | 
| 50 51 | 
             
            homepage: http://github.com/DigitalAdvisor/loco_bill
         | 
    
        data/README
    DELETED
    
    | @@ -1,15 +0,0 @@ | |
| 1 | 
            -
            An interface for interacting with Bill.com's API. Expects the following constants to be set (in environment.rb or an initializer or what have you):
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            BILL_API_APPLICATION_KEY
         | 
| 4 | 
            -
            BILL_API_USERNAME
         | 
| 5 | 
            -
            BILL_API_PASSWORD
         | 
| 6 | 
            -
            BILL_API_ORG_ID
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            Requires Nokogiri.
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            Use like so:
         | 
| 11 | 
            -
             | 
| 12 | 
            -
              login = LocoBill.login
         | 
| 13 | 
            -
              login.result.inspect => #<LocoBill::RequestResult status="OK", sessionId="xxx", orgID="yyy">
         | 
| 14 | 
            -
              vendor = BillApi.create_vendor :vendor => {:name => 'Test'} # will auto-login for you, if you're not already logged in
         | 
| 15 | 
            -
              vendor.result.inspect => #<LocoBill::RequestResult transactionId="Transaction1", status="OK", id="xxy">
         |