gds_zendesk 1.0.2

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2013 HM Government (Government Digital Service)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,55 @@
1
+ # GDS Zendesk
2
+
3
+ ## What is it?
4
+
5
+ `gds_zendesk` is a Ruby gem which (partially) wraps the [Zendesk REST API v2](http://developer.zendesk.com/documentation/rest_api/introduction.html).
6
+
7
+ The [zendesk_api](https://github.com/zendesk/zendesk_api_client_rb) gem is used under the covers.
8
+
9
+ ## Why does it exist?
10
+
11
+ This gem has certain advantages over the `zendesk_api` gem:
12
+
13
+ * Rails integration
14
+ * A dummy Zendesk client implementation, since Zendesk doesn't provide a staging environment
15
+ * Ability to simulate error conditions
16
+
17
+ ## Rails integration
18
+
19
+ ### Installation
20
+
21
+ Simply add the gem to your Gemfile and bundle it up:
22
+
23
+ gem 'gds_zendesk'
24
+
25
+ Run the installation generator:
26
+
27
+ $ rails generate gds_zendesk:install
28
+
29
+ This generates an initializer at `config/initializers/gds_zendesk.rb`.
30
+
31
+ ### Configuration
32
+
33
+ #### Mandatory settings
34
+
35
+ This gem needs to be configured with a Zendesk username and password before it can be used.
36
+ These are set in `config/initializers/gds_zendesk.rb`
37
+
38
+ #### Enabling development mode
39
+
40
+ Because Zendesk doesn't provide a staging environment, it is advised to use the development mode
41
+ during development and testing. When this mode is enabled:
42
+ * the real Zendesk client is replaced by an interface-equivalent dummy implementation (which makes no network calls)
43
+ * ticket creation failures can be simulated by including `break_zendesk` anywhere in the ticket description
44
+
45
+ Development mode can be enabled by configuring `development_mode: true`. It is off by default.
46
+
47
+ ## Usage
48
+
49
+ Invoke
50
+
51
+ ```
52
+ GDSZendesk::Client.new(config_options)
53
+ ```
54
+
55
+ to create a new client.
@@ -0,0 +1,14 @@
1
+ require "rake"
2
+ require "bundler/gem_tasks"
3
+ require 'rspec/core/rake_task'
4
+ require "gem_publisher"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task :default => :spec
9
+
10
+ desc "Publish the gem"
11
+ task :publish_gem do |t|
12
+ gem = GemPublisher.publish_if_updated("gds_zendesk.gemspec", :rubygems)
13
+ puts "Published #{gem}" if gem
14
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'gds_zendesk/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "gds_zendesk"
8
+ gem.version = GDSZendesk::VERSION
9
+ gem.authors = ["Jake Benilov"]
10
+ gem.email = ["benilov@gmail.com"]
11
+ gem.description = %q{Client and models for communicating with Zendesk}
12
+ gem.summary = %q{Client and models for communicating with Zendesk}
13
+ gem.homepage = "https://github.com/alphagov/gds_zendesk"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency 'null_logger', '0.0.1'
21
+ gem.add_dependency 'zendesk_api', '1.0.2'
22
+
23
+ gem.add_development_dependency 'rake', '10.0.3'
24
+ gem.add_development_dependency 'rspec', '2.12.0'
25
+ gem.add_development_dependency 'gem_publisher', '1.2.0'
26
+ gem.add_development_dependency 'faraday_middleware', '0.8.8' # had to pin for gem resolution to work on Jenkins
27
+ gem.add_development_dependency "webmock", '1.9.0'
28
+ end
@@ -0,0 +1,6 @@
1
+ #!/bin/sh
2
+ set -e
3
+ rm -f Gemfile.lock
4
+ bundle install --path "${HOME}/bundles/${JOB_NAME}"
5
+ bundle exec rake
6
+ bundle exec rake publish_gem
@@ -0,0 +1 @@
1
+ require "gds_zendesk/version"
@@ -0,0 +1,56 @@
1
+ require 'forwardable'
2
+ require 'null_logger'
3
+ require 'zendesk_api'
4
+
5
+ require 'gds_zendesk/users'
6
+
7
+ module GDSZendesk
8
+ class Client
9
+ extend Forwardable
10
+ def_delegators :@zendesk_client, :ticket
11
+
12
+ attr_accessor :config_options
13
+
14
+ def initialize(config_options)
15
+ @config_options = defaults.merge(config_options)
16
+ @zendesk_client = build
17
+ end
18
+
19
+ def users
20
+ Users.new(@zendesk_client)
21
+ end
22
+
23
+ def build
24
+ check_that_username_and_password_are_provided
25
+
26
+ ZendeskAPI::Client.new { |config|
27
+ config.url = "https://govuk.zendesk.com/api/v2/"
28
+ config.username = username
29
+ config.password = password
30
+ config.logger = logger
31
+ }
32
+ end
33
+
34
+ protected
35
+ def logger
36
+ @config_options[:logger] || @config_options["logger"]
37
+ end
38
+
39
+ def check_that_username_and_password_are_provided
40
+ raise ArgumentError, "Zendesk username not provided" if username.nil?
41
+ raise ArgumentError, "Zendesk password not provided" if password.nil?
42
+ end
43
+
44
+ def username
45
+ @config_options[:username] || @config_options["username"]
46
+ end
47
+
48
+ def password
49
+ @config_options[:password] || @config_options["password"]
50
+ end
51
+
52
+ def defaults
53
+ { logger: NullLogger.instance }
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,65 @@
1
+ require 'null_logger'
2
+ require 'gds_zendesk/field_mappings'
3
+ require 'zendesk_api/error'
4
+
5
+ module GDSZendesk
6
+ class DummyClient
7
+ attr_reader :ticket, :users
8
+
9
+ def initialize(options)
10
+ @logger = options[:logger] || NullLogger.instance
11
+ @ticket = DummyTicket.new(@logger)
12
+ @users = DummyUsers.new(@logger)
13
+ end
14
+ end
15
+
16
+ class DummyTicket
17
+ attr_reader :options
18
+
19
+ def initialize(logger)
20
+ @logger = logger
21
+ end
22
+
23
+ def create!(options)
24
+ @options = options
25
+ if should_raise_error?
26
+ @logger.info("Simulating Zendesk ticket creation failure: #{options.inspect}")
27
+ raise ZendeskAPI::Error::RecordInvalid.new(body: {"details" => "sample error message from Zendesk"})
28
+ else
29
+ @logger.info("Zendesk ticket created: #{options.inspect}")
30
+ end
31
+ end
32
+
33
+ protected
34
+ def should_raise_error?
35
+ description =~ /break_zendesk/ or comment =~ /break_zendesk/
36
+ end
37
+
38
+ def description
39
+ @options[:description]
40
+ end
41
+
42
+ def comment
43
+ @options[:comment][:value] unless @options[:comment].nil?
44
+ end
45
+ end
46
+
47
+ class DummyUsers
48
+ def initialize(logger)
49
+ @logger = logger
50
+ end
51
+
52
+ def search(attributes)
53
+ []
54
+ end
55
+
56
+ def suspended?(user_email)
57
+ false
58
+ end
59
+
60
+ def create!(new_user_attributes)
61
+ @created_user_attributes = new_user_attributes
62
+ @logger.info("Zendesk user created: #{new_user_attributes.inspect}")
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,6 @@
1
+ module GDSZendesk
2
+ FIELD_MAPPINGS = {
3
+ needed_by_date: "21485833",
4
+ not_before_date: "21502036"
5
+ }
6
+ end
@@ -0,0 +1,67 @@
1
+ require 'json'
2
+
3
+ module GDSZendesk
4
+ module TestHelpers
5
+ def zendesk_has_no_user_with_email(email)
6
+ stub_request(:get, "#{zendesk_endpoint}/users/search?query=#{email}").
7
+ to_return(body: {users: [], previous_page: nil, next_page: nil, count: 0}.to_json,
8
+ headers: {'Content-Type' => 'application/json'})
9
+ end
10
+
11
+ def zendesk_has_user(user_details)
12
+ stub_request(:get, "#{zendesk_endpoint}/users/search?query=#{user_details[:email]}").
13
+ to_return(body: {users: [user_details], previous_page: nil, next_page: nil, count: 1}.to_json,
14
+ headers: {'Content-Type' => 'application/json'})
15
+ end
16
+
17
+ def stub_zendesk_user_creation(user_properties = nil)
18
+ stub = stub_http_request(:post, "#{zendesk_endpoint}/users")
19
+ stub.with(body: {user: user_properties}) unless user_properties.nil?
20
+ stub.to_return(status: 201, body: { user: { id: 12345, name: "abc" }})
21
+ end
22
+
23
+ def stub_zendesk_ticket_creation(ticket_properties = nil)
24
+ stub = stub_http_request(:post, "#{zendesk_endpoint}/tickets")
25
+ stub.with(body: {ticket: ticket_properties}) unless ticket_properties.nil?
26
+ stub.to_return(status: 201, body: { ticket: { id: 12345 }})
27
+ end
28
+
29
+ def stub_zendesk_ticket_creation_with_body(body)
30
+ stub_http_request(:post, "#{zendesk_endpoint}/tickets").
31
+ with(body: body).
32
+ to_return(status: 201, body: { ticket: { id: 12345 }})
33
+ end
34
+
35
+ def stub_zendesk_user_update(user_id, user_properties)
36
+ stub_http_request(:put, "#{zendesk_endpoint}/users/#{user_id}").
37
+ with(body: {user: user_properties}).
38
+ to_return(status: 201, body: { user: { id: 12345, name: "abc" }})
39
+ end
40
+
41
+ def zendesk_is_unavailable
42
+ stub_request(:any, /#{zendesk_endpoint}\/.*/).to_return(status: 503)
43
+ end
44
+
45
+ def zendesk_endpoint
46
+ "https://#{valid_zendesk_credentials["username"]}:#{valid_zendesk_credentials["password"]}@govuk.zendesk.com/api/v2"
47
+ end
48
+
49
+ def valid_zendesk_credentials=(credentials)
50
+ @zendesk_credentials = credentials
51
+ end
52
+
53
+ def valid_zendesk_credentials
54
+ @zendesk_credentials || { "username" => "abc", "password" => "def" }
55
+ end
56
+
57
+ def assert_created_ticket_has(ticket_options)
58
+ assert_requested :post, %r{/api/v2/tickets},
59
+ body: { ticket: hash_including(ticket_options) }, times: 1
60
+ end
61
+
62
+ def assert_created_ticket_has_requester(requester_options)
63
+ assert_requested :post, %r{/api/v2/tickets},
64
+ body: { ticket: hash_including(requester: hash_including(requester_options)) }, times: 1
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,49 @@
1
+ module GDSZendesk
2
+ class Users
3
+ def initialize(client)
4
+ @client = client
5
+ end
6
+
7
+ def create_or_update_user(requested_user)
8
+ existing_users = find_by_email(requested_user.email)
9
+ if existing_users.empty?
10
+ create(requested_user)
11
+ else
12
+ existing_user_in_zendesk = existing_users.first
13
+ update(existing_user_in_zendesk, requested_user)
14
+ end
15
+ end
16
+
17
+ def suspended?(user_email)
18
+ existing_users = find_by_email(user_email)
19
+ if existing_users.empty?
20
+ false
21
+ else
22
+ existing_user_in_zendesk = existing_users.first
23
+ existing_user_in_zendesk["suspended"]
24
+ end
25
+ end
26
+
27
+ protected
28
+ def find_by_email(email)
29
+ @client.users.search(query: email).to_a
30
+ end
31
+
32
+ def create(requested_user)
33
+ @client.users.create!(email: requested_user.email,
34
+ name: requested_user.name,
35
+ details: "Job title: #{requested_user.job}",
36
+ phone: requested_user.phone,
37
+ verified: true)
38
+ end
39
+
40
+ def update(existing_user_in_zendesk, requested_user)
41
+ existing_user_in_zendesk.update(details: "Job title: #{requested_user.job}")
42
+ if !requested_user.phone.nil? && !requested_user.phone.empty?
43
+ existing_user_in_zendesk.update(phone: requested_user.phone)
44
+ end
45
+ existing_user_in_zendesk.save
46
+ existing_user_in_zendesk
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module GDSZendesk
2
+ VERSION = "1.0.2"
3
+ end
@@ -0,0 +1,24 @@
1
+ INITIALIZER = <<END
2
+ require 'yaml'
3
+ require 'gds_zendesk/client'
4
+ require 'gds_zendesk/dummy_client'
5
+
6
+ GDS_ZENDESK_CLIENT = if Rails.env.development? || Rails.env.test?
7
+ GDSZendesk::DummyClient.new(logger: Rails.logger)
8
+ else
9
+ config_yaml_file = File.join(Rails.root, 'config', 'zendesk.yml')
10
+ config = YAML.load_file(config_yaml_file)[Rails.env]
11
+ GDSZendesk::Client.new(username: config['username'], password: config['password'], logger: Rails.logger)
12
+ end
13
+ END
14
+
15
+ # This module name is slightly differently capitalised to the main library module
16
+ # The reason for this is that the module name is used by Rails within the
17
+ # generator CLI tools, and the tools get confused if the module is called GDSZendesk
18
+ module GdsZendesk
19
+ class InstallGenerator < Rails::Generators::Base
20
+ def create_initializer_file
21
+ initializer "gds_zendesk.rb", INITIALIZER
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+ require 'gds_zendesk/test_helpers'
3
+ require 'gds_zendesk/client'
4
+ require 'null_logger'
5
+
6
+ module GDSZendesk
7
+ describe Client do
8
+ include GDSZendesk::TestHelpers
9
+
10
+ def valid_credentials
11
+ { "username" => "user", "password" => "pass" }
12
+ end
13
+
14
+ def client(options = {})
15
+ Client.new(valid_credentials.merge(options))
16
+ end
17
+
18
+ it "should raise an error if no username is provided" do
19
+ lambda { Client.new(password: "abc") }.should raise_error(ArgumentError,
20
+ /username not provided/)
21
+ end
22
+
23
+ it "should raise an error if no password is provided" do
24
+ lambda { Client.new(username: "abc") }.should raise_error(ArgumentError,
25
+ /password not provided/)
26
+ end
27
+
28
+ it "should use a null logger if no logger has been provided" do
29
+ client.config_options[:logger].should be_an_instance_of(NullLogger::Logger)
30
+ end
31
+
32
+ it "should use the passed logger if one has been provided" do
33
+ custom_logger = stub("logger")
34
+
35
+ client(logger: custom_logger).config_options[:logger].should eq(custom_logger)
36
+ end
37
+
38
+ it "should raise tickets in Zendesk" do
39
+ self.valid_zendesk_credentials = valid_credentials
40
+ post_stub = stub_zendesk_ticket_creation(some: "data")
41
+
42
+ client.ticket.create(some: "data")
43
+
44
+ post_stub.should have_been_requested
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,43 @@
1
+ require 'gds_zendesk/dummy_client'
2
+
3
+ module GDSZendesk
4
+ describe DummyClient do
5
+ context "when a ticket has been raised" do
6
+ let(:ticket_options) { { opt1: "val1" } }
7
+
8
+ it "should log the ticket details" do
9
+ logger = stub("logger")
10
+ logger.should_receive(:info).with("Zendesk ticket created: #{ticket_options.inspect}")
11
+
12
+ client = DummyClient.new(logger: logger)
13
+ client.ticket.create!(ticket_options)
14
+ end
15
+
16
+ it "can simulate failures, triggered by a specific description or comment" do
17
+ logger = mock("logger")
18
+ client = DummyClient.new(logger: logger)
19
+ logger.should_receive(:info).with(/Simulating Zendesk ticket creation failure/).twice
20
+
21
+ lambda {
22
+ client.ticket.create!(description: "break_zendesk")
23
+ }.should raise_error(ZendeskAPI::Error::RecordInvalid)
24
+
25
+ lambda {
26
+ client.ticket.create!(comment: { value: "break_zendesk" })
27
+ }.should raise_error(ZendeskAPI::Error::RecordInvalid)
28
+ end
29
+ end
30
+
31
+ context "when a user has been created" do
32
+ let(:created_user_options) { { email: "a@b.com" } }
33
+
34
+ it "should log the user details" do
35
+ logger = stub("logger")
36
+ logger.should_receive(:info).with("Zendesk user created: #{created_user_options.inspect}")
37
+
38
+ client = DummyClient.new(logger: logger)
39
+ client.users.create!(created_user_options)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ require 'gds_zendesk/client'
4
+ require 'gds_zendesk/users'
5
+ require 'gds_zendesk/test_helpers'
6
+
7
+ module GDSZendesk
8
+ describe Users do
9
+ include GDSZendesk::TestHelpers
10
+
11
+ let(:users) { Client.new(valid_zendesk_credentials).users }
12
+
13
+ context "existing users" do
14
+ before do
15
+ zendesk_has_user(email: "test@test.com", id: 123)
16
+ end
17
+
18
+ context "creating/updating a user" do
19
+ it "should update the phone and job title if those are set" do
20
+ stub_post = stub_zendesk_user_update(123, phone: "12345", details: "Job title: Developer")
21
+ users.create_or_update_user(stub("requested user", email: "test@test.com", phone: "12345", job: "Developer"))
22
+
23
+ stub_post.should have_been_requested
24
+ end
25
+ end
26
+
27
+ it "should know whether the user is suspended or not" do
28
+ zendesk_has_user(email: "test@test.com", id: 123, suspended: "true")
29
+ users.suspended?("test@test.com").should be_true
30
+ end
31
+ end
32
+
33
+ context "non-existent users" do
34
+ before do
35
+ zendesk_has_no_user_with_email("test@test.com")
36
+ end
37
+
38
+ it "should not be suspended" do
39
+ users.should_not be_suspended("test@test.com")
40
+ end
41
+
42
+ context "creating/updating" do
43
+ it "should create that user" do
44
+ stub_post = stub_zendesk_user_creation(
45
+ verified: true,
46
+ name: "Abc",
47
+ email: "test@test.com",
48
+ phone: "12345",
49
+ details: "Job title: Developer"
50
+ )
51
+ user_being_requested = stub("requested user",
52
+ name: "Abc", email: "test@test.com", phone: "12345", job: "Developer")
53
+
54
+ users.create_or_update_user(user_being_requested)
55
+ stub_post.should have_been_requested
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,3 @@
1
+ require 'webmock/rspec'
2
+
3
+ WebMock.disable_net_connect!(:allow_localhost => true)
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gds_zendesk
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Jake Benilov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-01-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: null_logger
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 0.0.1
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.1
30
+ - !ruby/object:Gem::Dependency
31
+ name: zendesk_api
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 1.0.2
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: 1.0.2
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - '='
52
+ - !ruby/object:Gem::Version
53
+ version: 10.0.3
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 10.0.3
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - '='
68
+ - !ruby/object:Gem::Version
69
+ version: 2.12.0
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - '='
76
+ - !ruby/object:Gem::Version
77
+ version: 2.12.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: gem_publisher
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - '='
84
+ - !ruby/object:Gem::Version
85
+ version: 1.2.0
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - '='
92
+ - !ruby/object:Gem::Version
93
+ version: 1.2.0
94
+ - !ruby/object:Gem::Dependency
95
+ name: faraday_middleware
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - '='
100
+ - !ruby/object:Gem::Version
101
+ version: 0.8.8
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - '='
108
+ - !ruby/object:Gem::Version
109
+ version: 0.8.8
110
+ - !ruby/object:Gem::Dependency
111
+ name: webmock
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 1.9.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - '='
124
+ - !ruby/object:Gem::Version
125
+ version: 1.9.0
126
+ description: Client and models for communicating with Zendesk
127
+ email:
128
+ - benilov@gmail.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - .gitignore
134
+ - Gemfile
135
+ - LICENCE.txt
136
+ - README.md
137
+ - Rakefile
138
+ - gds_zendesk.gemspec
139
+ - jenkins.sh
140
+ - lib/gds_zendesk.rb
141
+ - lib/gds_zendesk/client.rb
142
+ - lib/gds_zendesk/dummy_client.rb
143
+ - lib/gds_zendesk/field_mappings.rb
144
+ - lib/gds_zendesk/test_helpers.rb
145
+ - lib/gds_zendesk/users.rb
146
+ - lib/gds_zendesk/version.rb
147
+ - lib/generators/gds_zendesk/install/install_generator.rb
148
+ - spec/gds_zendesk/client_spec.rb
149
+ - spec/gds_zendesk/dummy_client_spec.rb
150
+ - spec/gds_zendesk/users_spec.rb
151
+ - spec/spec_helper.rb
152
+ homepage: https://github.com/alphagov/gds_zendesk
153
+ licenses: []
154
+ post_install_message:
155
+ rdoc_options: []
156
+ require_paths:
157
+ - lib
158
+ required_ruby_version: !ruby/object:Gem::Requirement
159
+ none: false
160
+ requirements:
161
+ - - ! '>='
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ segments:
165
+ - 0
166
+ hash: 4508364526887278478
167
+ required_rubygems_version: !ruby/object:Gem::Requirement
168
+ none: false
169
+ requirements:
170
+ - - ! '>='
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ segments:
174
+ - 0
175
+ hash: 4508364526887278478
176
+ requirements: []
177
+ rubyforge_project:
178
+ rubygems_version: 1.8.23
179
+ signing_key:
180
+ specification_version: 3
181
+ summary: Client and models for communicating with Zendesk
182
+ test_files:
183
+ - spec/gds_zendesk/client_spec.rb
184
+ - spec/gds_zendesk/dummy_client_spec.rb
185
+ - spec/gds_zendesk/users_spec.rb
186
+ - spec/spec_helper.rb