ruby-fogbugz-0.2.1/0000755000175600017570000000000012620617703013201 5ustar pravipraviruby-fogbugz-0.2.1/ruby-fogbugz.gemspec0000644000175600017570000000211512620617703017167 0ustar pravipravi# -*- encoding: utf-8 -*- $:.push File.expand_path("../lib", __FILE__) require "ruby_fogbugz/version" Gem::Specification.new do |s| s.name = "ruby-fogbugz" s.version = Fogbugz::VERSION s.platform = Gem::Platform::RUBY s.authors = ['Simon Hørup Eskildsen', 'Jared Szechy'] s.email = ['sirup@sirupsen.com', 'jared.szechy@gmail.com'] s.homepage = 'https://github.com/firmafon/ruby-fogbugz' s.summary = %q{Ruby wrapper for the Fogbugz API } s.description = %q{A simple Ruby wrapper for the Fogbugz XML API} s.license = 'MIT' s.rubyforge_project = "ruby-fogbugz" s.add_dependency 'crack', '~> 0.4' s.add_development_dependency 'rake', '~> 10.1' s.add_development_dependency 'minitest', '~> 5.8' s.add_development_dependency 'mocha', '~> 1.1' s.add_development_dependency 'codeclimate-test-reporter' s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n") s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } s.require_paths = ["lib"] end ruby-fogbugz-0.2.1/.travis.yml0000644000175600017570000000027712620617703015320 0ustar pravipravilanguage: ruby rvm: - 2.0.0-p647 - 2.1.7 - 2.2.3 - jruby-9.0.0.0 sudo: false addons: code_climate: repo_token: ef52b4659b14e65b70be219cf870eaffcef8ee9c260b767b26694e2c7f59e88c ruby-fogbugz-0.2.1/README.md0000644000175600017570000000642712620617703014471 0ustar pravipravi[![Build Status](https://travis-ci.org/firmafon/ruby-fogbugz.svg)](https://travis-ci.org/firmafon/ruby-fogbugz) [![Code Climate](https://codeclimate.com/github/firmafon/ruby-fogbugz/badges/gpa.svg)](https://codeclimate.com/github/firmafon/ruby-fogbugz) [![Test Coverage](https://codeclimate.com/github/firmafon/ruby-fogbugz/badges/coverage.svg)](https://codeclimate.com/github/firmafon/ruby-fogbugz/coverage) # ruby-fogbugz A very simple wrapper for the Fogbugz API. It won't give you fancy classes for everything, it'll simply aid you in sending the API requests, parsing the returned XML finally retuning you a Hash. ## Installation Add this line to your application's Gemfile: ```ruby gem 'ruby-fogbugz' ``` And then execute: $ bundle Or install it yourself as: $ gem install ruby-fogbugz ## Usage The Fogbugz API works by sending HTTP GET parameters to the API where the GET parameter `cmd` invokes a Fogbugz method, e.g. `cmd=listProjects` to get a list of all projects, `cmd`s then accept further arguments, such as listing all cases assigned to a specific person: cmd=search&ixAssignedTo=2&cols=sTitle,sStatus # list all cases associated to the user with ID of 2 in Fogbugz In `ruby-fogbugz` that request would be: ```ruby fogbugz.command(:search, :ixAssignedTo => 2, :cols => "sTitle,sStatus") ``` Returns your parsed XML: ```ruby { "description"=>"All open cases assigned to Simon Eskildsen", "cases" => { "case"=> [ {"ixBug"=>"143", "sTitle"=>"Write ruby-fogbugz documentation", "sStatus"=>"active", "operations"=>"edit,assign,resolve,email,remind"}, {"ixBug"=>"146", "sTitle"=>"Tame a unicorn", "sStatus"=>"active", "operations"=>"edit,assign,resolve,email,remind"}, {"ixBug"=>"152", "sTitle"=>"Hug a walrus", "sStatus"=>"active", "operations"=>"edit,assign,resolve,email,remind"}, ], "count"=>"3" } } ``` As you see, `ruby-fogbugz` is without magic and leaves most to the user. `cmd` is the first argument to `Fogbugz#command`, the second argument being a `Hash` of additional GET arguments to specify the request further. You can see available `cmd`'s and arguments at the [Fogbugz API documentation][fad]. All Fogbugz API requests require a token. Thus `#authenticate` must be called on the `ruby-fogbugz` instance before `#command`'s are sent: ```ruby require 'fogbugz' fogbugz = Fogbugz::Interface.new(:email => 'my@email.com', :password => 'seekrit', :uri => 'https://company.fogbugz.com') # remember to use https! fogbugz.authenticate # token is now automatically attached to every future requests p fogbugz.command(:listPeople) ``` `#authenticate` fetches a new token every time. To avoid the extra request, obtain a token: ```ruby require 'fogbugz' fogbugz = Fogbugz::Interface.new(:email => 'my@email.com', :password => 'seekrit', :uri => 'https://company.fogbugz.com') # remember to use https! fogbugz.authenticate # token is now automatically attached to every future requests puts "Token: #{fogbugz.token}" ``` Run the script, and initialize with the returned token: ```ruby fogbugz = Fogbugz::Interface.new(:token => "some token to use from now on", :uri => 'https://company.fogbugz.com') # remember to use https! ``` [fad]:http://fogbugz.stackexchange.com/fogbugz-xml-api ## License `ruby-fogbugz` is released under the MIT license. ruby-fogbugz-0.2.1/test/0000755000175600017570000000000012620617703014160 5ustar pravipraviruby-fogbugz-0.2.1/test/test_helper.rb0000644000175600017570000000074312620617703017027 0ustar pravipravirequire 'codeclimate-test-reporter' CodeClimate::TestReporter.start require 'rubygems' gem 'minitest' # ensures you're using the gem, and not the built in MT $: << File.expand_path(File.dirname(__FILE__) + "../lib") require 'minitest/autorun' require 'minitest/pride' require 'mocha/mini_test' require 'fogbugz' class FogTest < MiniTest::Unit::TestCase def self.test(description, &block) define_method("test_" + description.split.join('_').gsub(/\W/, ''), block) end end ruby-fogbugz-0.2.1/test/adapters/0000755000175600017570000000000012620617703015763 5ustar pravipraviruby-fogbugz-0.2.1/test/adapters/xml/0000755000175600017570000000000012620617703016563 5ustar pravipraviruby-fogbugz-0.2.1/test/adapters/xml/crack_test.rb0000644000175600017570000000143212620617703021232 0ustar pravipravirequire 'test_helper' require 'ruby_fogbugz/adapters/xml/cracker' class Cracker < FogTest test 'should parse XML and get rid of the response namespace' do XML = <<-xml 2 xml assert_equal({"version" => "2"}, Fogbugz::Adapter::XML::Cracker.parse(XML)) end # Sometimes Fogbugz returns responses like this test 'should return nil when the response is not valid' do XML = <<-xml Object moved

Object moved to here.

xml assert_equal(nil, Fogbugz::Adapter::XML::Cracker.parse(XML)) end end ruby-fogbugz-0.2.1/test/interface_test.rb0000644000175600017570000000326412620617703017511 0ustar pravipravirequire 'test_helper.rb' class FogTest CREDENTIALS = { :email => "test@test.com", :password => 'seekrit', :uri => 'http://fogbugz.test.com' } end class BasicInterface < FogTest def setup @fogbugz = Fogbugz::Interface.new(CREDENTIALS) end test 'when instantiating options should be overwriting and be publicly available' do assert_equal CREDENTIALS, @fogbugz.options end end class InterfaceRequests < FogTest def setup #Fogbugz.adapter[:http] = mock() #Fogbugz.adapter[:http].expects(:new) end test 'authentication should send correct parameters' do fogbugz = Fogbugz::Interface.new(CREDENTIALS) fogbugz.http.expects(:request).with(:logon, :params => { :email => CREDENTIALS[:email], :password => CREDENTIALS[:password] }).returns("token") fogbugz.xml.expects(:parse).with("token").returns({"token" => "22"}) fogbugz.authenticate end test 'requesting with an action should send along token and correct parameters' do fogbugz = Fogbugz::Interface.new(CREDENTIALS) fogbugz.token = 'token' fogbugz.http.expects(:request).with(:search, {:params => {:q => 'case', :token => 'token'}}).returns("omgxml") fogbugz.xml.expects(:parse).with("omgxml") fogbugz.command(:search, :q => 'case') end test 'throws an exception if #command is requested with no token' do fogbugz = Fogbugz::Interface.new(CREDENTIALS) fogbugz.token = nil assert_raises Fogbugz::Interface::RequestError do fogbugz.command(:search, :q => 'case') end end end ruby-fogbugz-0.2.1/Gemfile0000644000175600017570000000014012620617703014467 0ustar pravipravisource "http://rubygems.org" # Specify your gem's dependencies in ruby-fogbugz.gemspec gemspec ruby-fogbugz-0.2.1/metadata.yml0000644000175600017570000000624112620617703015507 0ustar pravipravi--- !ruby/object:Gem::Specification name: ruby-fogbugz version: !ruby/object:Gem::Version version: 0.2.1 platform: ruby authors: - Simon Hørup Eskildsen - Jared Szechy autorequire: bindir: bin cert_chain: [] date: 2015-09-15 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: crack requirement: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: '0.4' type: :runtime prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: '0.4' - !ruby/object:Gem::Dependency name: rake requirement: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: '10.1' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: '10.1' - !ruby/object:Gem::Dependency name: minitest requirement: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: '5.8' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: '5.8' - !ruby/object:Gem::Dependency name: mocha requirement: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: '1.1' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ~> - !ruby/object:Gem::Version version: '1.1' - !ruby/object:Gem::Dependency name: codeclimate-test-reporter requirement: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' description: A simple Ruby wrapper for the Fogbugz XML API email: - sirup@sirupsen.com - jared.szechy@gmail.com executables: [] extensions: [] extra_rdoc_files: [] files: - .gitignore - .travis.yml - Gemfile - README.md - Rakefile - lib/fogbugz.rb - lib/ruby_fogbugz/adapters/http/net_http.rb - lib/ruby_fogbugz/adapters/xml/cracker.rb - lib/ruby_fogbugz/interface.rb - lib/ruby_fogbugz/version.rb - ruby-fogbugz.gemspec - test/adapters/xml/crack_test.rb - test/interface_test.rb - test/test_helper.rb homepage: https://github.com/firmafon/ruby-fogbugz licenses: - MIT metadata: {} post_install_message: rdoc_options: [] require_paths: - lib required_ruby_version: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' required_rubygems_version: !ruby/object:Gem::Requirement requirements: - - ! '>=' - !ruby/object:Gem::Version version: '0' requirements: [] rubyforge_project: ruby-fogbugz rubygems_version: 2.4.8 signing_key: specification_version: 4 summary: Ruby wrapper for the Fogbugz API test_files: - test/adapters/xml/crack_test.rb - test/interface_test.rb - test/test_helper.rb ruby-fogbugz-0.2.1/lib/0000755000175600017570000000000012620617703013747 5ustar pravipraviruby-fogbugz-0.2.1/lib/fogbugz.rb0000644000175600017570000000044012620617703015735 0ustar pravipravirequire 'ruby_fogbugz/adapters/http/net_http' require 'ruby_fogbugz/adapters/xml/cracker' require 'ruby_fogbugz/interface' module Fogbugz class << self attr_accessor :adapter end self.adapter = { :xml => Adapter::XML::Cracker, :http => Adapter::HTTP::NetHttp } end ruby-fogbugz-0.2.1/lib/ruby_fogbugz/0000755000175600017570000000000012620617703016453 5ustar pravipraviruby-fogbugz-0.2.1/lib/ruby_fogbugz/adapters/0000755000175600017570000000000012620617703020256 5ustar pravipraviruby-fogbugz-0.2.1/lib/ruby_fogbugz/adapters/xml/0000755000175600017570000000000012620617703021056 5ustar pravipraviruby-fogbugz-0.2.1/lib/ruby_fogbugz/adapters/xml/cracker.rb0000644000175600017570000000033512620617703023016 0ustar pravipravirequire 'crack/util' require 'crack/xml' module Fogbugz module Adapter module XML class Cracker def self.parse(xml) Crack::XML.parse(xml)["response"] end end end end end ruby-fogbugz-0.2.1/lib/ruby_fogbugz/adapters/http/0000755000175600017570000000000012620617703021235 5ustar pravipraviruby-fogbugz-0.2.1/lib/ruby_fogbugz/adapters/http/net_http.rb0000644000175600017570000000144112620617703023407 0ustar pravipravirequire 'cgi' require 'net/https' module Fogbugz module Adapter module HTTP class NetHttp attr_accessor :root_url, :requester def initialize(options = {}) @root_url = options[:uri] end def request(action, options) uri = URI("#{@root_url}/api.asp") params = { 'cmd' => action } params.merge!(options[:params]) # build up the form request request = Net::HTTP::Post.new(uri.request_uri) request.set_form_data(params) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = @root_url.start_with? 'https' response = http.start {|http| http.request(request) } response.body end end end end end ruby-fogbugz-0.2.1/lib/ruby_fogbugz/interface.rb0000644000175600017570000000306312620617703020742 0ustar pravipravimodule Fogbugz class Interface class RequestError < StandardError; end class InitializationError < StandardError; end attr_accessor :options, :http, :xml, :token def initialize(options = {}) @options = {}.merge(options) raise InitializationError, "Must supply URI (e.g. https://fogbugz.company.com)" unless options[:uri] @token = options[:token] if options[:token] @http = Fogbugz.adapter[:http].new(:uri => options[:uri]) @xml = Fogbugz.adapter[:xml] end def authenticate response = @http.request :logon, { :params => { :email => @options[:email], :password => @options[:password] } } begin @token ||= @xml.parse(response)["token"] if @token.nil? || @token == '' raise Fogbugz::AuthenticationException.new(@xml.parse(response)["error"]) end rescue REXML::ParseException => e # Probably an issue with the auth information # p response raise Fogbugz::AuthenticationException.new("Looks like there was an issue with authentication (to #{@options[:uri]} as #{@options[:email]}) - probably the host/url.") end @token end def command(action, parameters = {}) raise RequestError, 'No token available, #authenticate first' unless @token parameters[:token] = @token response = @http.request action, { :params => parameters.merge(options[:params] || {}) } @xml.parse(response) end end class AuthenticationException < Exception end end ruby-fogbugz-0.2.1/lib/ruby_fogbugz/version.rb0000644000175600017570000000004712620617703020466 0ustar pravipravimodule Fogbugz VERSION = '0.2.1' end ruby-fogbugz-0.2.1/Rakefile0000644000175600017570000000031312620617703014643 0ustar pravipravirequire 'bundler' Bundler::GemHelper.install_tasks require 'rake/testtask' Rake::TestTask.new do |t| t.libs << "lib" t.libs << "test" t.pattern = "test/**/*_test.rb" end task :default => [:test] ruby-fogbugz-0.2.1/.gitignore0000644000175600017570000000004112620617703015164 0ustar pravipravi*.gem .bundle Gemfile.lock pkg/*