```ruby
require "volunteermatch/version"

require 'base64'
require 'digest/sha2'
require 'net/http'
require 'uri'
require 'json'
require 'ostruct'

module Volunteermatch
  # code goes here...
end```

Add basic framework to make api calls
user
```ruby
require "volunteermatch/version"

require 'base64'
require 'digest/sha2'
require 'net/http'
require 'uri'
require 'json'
require 'ostruct'

module Volunteermatch
  class << self
    attr_accessor :attributes

    def initialize(api_username, api_key)
      @api_username   = api_username
      @api_key        = api_key
    end

    protected

    def call(action, json_query)
      nonce           = Digest::SHA2.hexdigest(rand.to_s)[0, 20]
      creation_time   = Time.now.utc.strftime("%Y-%m-%dT%H:%M:%S%z")
      password_digest = Base64.encode64(Digest::SHA2.digest(nonce + creation_time + @api_key)).chomp
      url             = URI.parse("http://www.volunteermatch.org/api/call?action=#{action.to_s}&query=" + URI.encode(json_query))

      req             = Net::HTTP::Get.new(url.request_uri)

      req.add_field('Content-Type', 'application/json')
      req.add_field('Authorization', 'WSSE profile="UsernameToken"')
      req.add_field('X-WSSE', 'UsernameToken Username="' + @api_username + '", PasswordDigest="' + password_digest + '", ' +
          'Nonce="' + nonce + '", Created="' + creation_time + '"')

      res             = Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
      raise "HTTP error code #{res.code}" unless res.code == "200"
      OpenStruct.new(JSON.parse res.body)
    end
  end
end```
assistant