teamcity 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.travis.yml +3 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +83 -0
- data/Gemfile +4 -0
- data/Guardfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +194 -0
- data/Rakefile +1 -0
- data/lib/faraday/null_response_body.rb +17 -0
- data/lib/teamcity.rb +26 -0
- data/lib/teamcity/api.rb +19 -0
- data/lib/teamcity/client.rb +16 -0
- data/lib/teamcity/client/build_types.rb +305 -0
- data/lib/teamcity/client/builds.rb +92 -0
- data/lib/teamcity/client/common.rb +23 -0
- data/lib/teamcity/client/projects.rb +159 -0
- data/lib/teamcity/client/tests.rb +24 -0
- data/lib/teamcity/client/vcs_roots.rb +70 -0
- data/lib/teamcity/configuration.rb +51 -0
- data/lib/teamcity/connection.rb +28 -0
- data/lib/teamcity/element_builder.rb +27 -0
- data/lib/teamcity/headers.rb +47 -0
- data/lib/teamcity/request.rb +35 -0
- data/lib/teamcity/version.rb +3 -0
- data/spec/cassettes/BuildTypes/DELETE/_delete_agent_requirement/should_delete_the_agent_requirement.yml +83 -0
- data/spec/cassettes/BuildTypes/DELETE/_delete_buildtype/should_delete_a_buildtype.yml +40 -0
- data/spec/cassettes/BuildTypes/DELETE/_delete_buildtype_parameter/should_delete_a_buildtype_parameter.yml +81 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype/should_fetch_the_details_of_a_buildtype_by_id.yml +89 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype/should_raise_an_error_if_the_buildtype_does_not_exist.yml +52 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_fetch_the_build_configuration_agent_requirements_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_return_nil_if_there_are_no_agent_requirements_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_fetch_the_build_configuration_artifact_dependencies_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_return_nil_if_there_are_no_artifact_dependencies_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_branches/should_fetch_vcs_branches_the_vcs_root_is_configured_to_use.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_fetch_the_build_configuration_features_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_return_nil_if_there_are_no_features_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_investigations/should_get_investigation_details.yml +48 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_investigations/should_return_nil_if_no_one_is_investigating.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_fetch_the_build_configuration_parameters_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_return_nil_if_there_are_no_parameters_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_settings/should_fetch_the_settings_for_a_given_buildtype.yml +89 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_settings/should_return_an_array.yml +89 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_fetch_the_build_configuration_snapshot_dependencies_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_return_nil_if_there_are_no_snapshot_dependencies_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_state/should_fetch_the_state_of_the_buildtype.yml +89 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_fetch_the_build_configuration_steps_for_a_buildtype.yml +47 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_return_nil_if_there_are_no_steps_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_template/should_return_nil_if_the_buildtype_is_not_associated_with_a_template.yml +52 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_template/should_return_the_attributes_of_the_associated_template.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_fetch_the_build_configuration_triggers_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_return_an_array.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_return_nil_if_there_are_no_triggers_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_fetch_the_build_configuration_vcs_root_entries_for_a_buildtype.yml +47 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_return_an_array.yml +47 -0
- data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_return_nil_if_there_are_no_vcs_root_entries_defined.yml +46 -0
- data/spec/cassettes/BuildTypes/GET/_buildtypes/should_fetch_all_the_buildtypes.yml +46 -0
- data/spec/cassettes/BuildTypes/POST/_attach_vcs_root/should_attach_a_vcs_root_to_a_buildtype.yml +47 -0
- data/spec/cassettes/BuildTypes/POST/_create_agent_requirement/should_create_an_agent_requirement_for_a_buildtype.yml +46 -0
- data/spec/cassettes/BuildTypes/POST/_create_build_step/should_create_a_build_step_for_a_given_build_type.yml +46 -0
- data/spec/cassettes/BuildTypes/POST/_create_build_trigger/should_create_a_build_trigger_for_a_given_build_type.yml +46 -0
- data/spec/cassettes/BuildTypes/POST/_create_buildtype/should_create_a_build_type.yml +86 -0
- data/spec/cassettes/BuildTypes/PUT/_set_build_step_field/should_disable_a_build_step.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_build_step_field/should_enable_a_build_step.yml +48 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_pause_a_project.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_set_a_projects_description.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_set_the_buildtype_name.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_parameter/should_set_a_buildtype_parameter.yml +44 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_if_it_should_perform_clean_builds.yml +46 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_what_is_the_timeout_in_minutes_when_executing_builds.yml +46 -0
- data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_where_the_checkout_happens_when_building.yml +46 -0
- data/spec/cassettes/Builds/DELETE/_unpin_build/should_unpin_a_build.yml +83 -0
- data/spec/cassettes/Builds/GET/_build/should_fetch_the_build_details.yml +91 -0
- data/spec/cassettes/Builds/GET/_build/should_raise_an_error_if_the_build_does_not_exist.yml +53 -0
- data/spec/cassettes/Builds/GET/_build_artifacts/should_fetch_all_the_artifacts.yml +89 -0
- data/spec/cassettes/Builds/GET/_build_pinned_/should_return_false_when_a_build_is_not_pinned.yml +126 -0
- data/spec/cassettes/Builds/GET/_build_pinned_/should_return_true_when_a_build_is_pinned.yml +126 -0
- data/spec/cassettes/Builds/GET/_build_statistics/should_return_statistics_for_a_build.yml +89 -0
- data/spec/cassettes/Builds/GET/_build_tags/should_fetch_the_build_tags.yml +89 -0
- data/spec/cassettes/Builds/GET/_build_tags/should_return_an_empty_array_if_there_are_no_build_tags_defined_for_a_build.yml +89 -0
- data/spec/cassettes/Builds/GET/_builds/should_allow_you_to_filter_by_multiple_build_locators.yml +46 -0
- data/spec/cassettes/Builds/GET/_builds/should_allow_you_to_filter_results_by_build_locators.yml +46 -0
- data/spec/cassettes/Builds/GET/_builds/should_fetch_all_the_builds.yml +46 -0
- data/spec/cassettes/Builds/GET/_builds/should_return_an_empty_array_if_no_results_are_found.yml +46 -0
- data/spec/cassettes/Builds/PUT/_pin_build/should_pin_a_build.yml +83 -0
- data/spec/cassettes/Projects/DELETE/_delete_project/should_delete_a_project.yml +82 -0
- data/spec/cassettes/Projects/DELETE/_delete_project_parameter/should_delete_a_project_parameter.yml +123 -0
- data/spec/cassettes/Projects/GET/_parent_project/should_fetch_the_parent_project_for_a_given_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_parent_project/should_return_nil_if_there_is_no_parent_project_for_a_given_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_project/should_fetch_a_single_project_by_id.yml +47 -0
- data/spec/cassettes/Projects/GET/_project/should_raise_an_error_if_the_project_does_not_exist.yml +52 -0
- data/spec/cassettes/Projects/GET/_project_buildtypes/should_fetch_all_the_buildTypes_for_a_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_project_buildtypes/should_return_nil_if_the_project_does_not_have_any_build_types.yml +46 -0
- data/spec/cassettes/Projects/GET/_project_parameters/should_fetch_all_the_paramters_for_a_given_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_project_parameters/should_return_nil_if_there_are_no_parameters_defined_for_a_project.yml +46 -0
- data/spec/cassettes/Projects/GET/_projects/should_fetch_projects.yml +46 -0
- data/spec/cassettes/Projects/POST/_copy_project/should_copy_a_project.yml +135 -0
- data/spec/cassettes/Projects/POST/_create_project/should_create_a_project.yml +45 -0
- data/spec/cassettes/Projects/PUT/_set_parent_project/should_set_a_parent_project_for_a_given_project.yml +134 -0
- data/spec/cassettes/Projects/PUT/_set_project_field/should_archive_a_project.yml +86 -0
- data/spec/cassettes/Projects/PUT/_set_project_field/should_set_a_projects_description.yml +86 -0
- data/spec/cassettes/Projects/PUT/_set_project_field/should_set_a_projects_name.yml +86 -0
- data/spec/cassettes/Projects/PUT/_set_project_parameter/should_set_a_project_parameter.yml +86 -0
- data/spec/cassettes/Tests/GET/_tests/should_allow_you_to_filter_by_test_id.yml +49 -0
- data/spec/cassettes/Tests/GET/_tests/should_allow_you_to_filter_results_by_test_count_locator.yml +55 -0
- data/spec/cassettes/Tests/GET/_tests/should_fetch_all_the_tests.yml +60 -0
- data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_no_build_is_found.yml +51 -0
- data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_no_test_is_found.yml +51 -0
- data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_not_build_is_given.yml +51 -0
- data/spec/cassettes/VCSRoots/GET/_vcs_root_details/should_fetch_the_vcs_root_details.yml +91 -0
- data/spec/cassettes/VCSRoots/GET/_vcs_roots/should_fetch_vcs_roots.yml +47 -0
- data/spec/cassettes/VCSRoots/POST/_create_vcs_root/should_create_a_git_vcs_root_that_is_shared_with_the_project_and_sub-projects.yml +89 -0
- data/spec/cassettes/VCSRoots/POST/_create_vcs_root/should_create_a_subversion_vcs_root_that_is_shared_with_the_project_and_sub-projects.yml +89 -0
- data/spec/cassettes/VCSRoots/PUT/_set_vcs_root_field/should_set_a_vcs_modification_check_interval.yml +179 -0
- data/spec/faraday/null_response_body_spec.rb +18 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/vcr_setup.rb +9 -0
- data/spec/teamcity/api_spec.rb +64 -0
- data/spec/teamcity/client/builds_spec.rb +113 -0
- data/spec/teamcity/client/buildtypes_spec.rb +308 -0
- data/spec/teamcity/client/projects_spec.rb +207 -0
- data/spec/teamcity/client/tests_spec.rb +47 -0
- data/spec/teamcity/client/vcs_roots_spec.rb +86 -0
- data/spec/teamcity/client_spec.rb +14 -0
- data/spec/teamcity/element_builder_spec.rb +30 -0
- data/spec/teamcity/headers_spec.rb +43 -0
- data/spec/teamcity/version_spec.rb +7 -0
- data/spec/teamcity_spec.rb +89 -0
- data/teamcity.gemspec +26 -0
- metadata +344 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class Client
|
3
|
+
# Defines methods related to tests
|
4
|
+
module Tests
|
5
|
+
# HTTP GET
|
6
|
+
|
7
|
+
# List of tests
|
8
|
+
#
|
9
|
+
# @param options [Hash] list of test locators to filter test results on
|
10
|
+
# @return [Array<Hashie::Mash>] of tests (empty array if no tests exist)
|
11
|
+
def tests(options={})
|
12
|
+
url_params = options.empty? ? '' : "?locator=#{locator(options)}"
|
13
|
+
tests = []
|
14
|
+
begin
|
15
|
+
response = get("testOccurrences#{url_params}")
|
16
|
+
tests = response.testOccurrence
|
17
|
+
rescue
|
18
|
+
tests = []
|
19
|
+
end
|
20
|
+
tests
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class Client
|
3
|
+
module VCSRoots
|
4
|
+
|
5
|
+
VCS_TYPES = { 'git' => 'jetbrains.git' }
|
6
|
+
|
7
|
+
# List of VCS Roots
|
8
|
+
#
|
9
|
+
# @return [Array<Hashie::Mash>, nil] of vcs roots or nil if no vcs roots exist
|
10
|
+
def vcs_roots
|
11
|
+
response = get('vcs-roots')
|
12
|
+
response['vcs-root']
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get VCS Root details
|
16
|
+
#
|
17
|
+
# @param vcs_root_id [String, Numeric]
|
18
|
+
# @return [Hashie::Mash]
|
19
|
+
def vcs_root_details(vcs_root_id)
|
20
|
+
get("vcs-roots/id:#{vcs_root_id}")
|
21
|
+
end
|
22
|
+
|
23
|
+
# Create VCS Root
|
24
|
+
#
|
25
|
+
# @option options [String] :vcs_name Name of the vcs root
|
26
|
+
# @option options [String] :vcs_type Type of VCS: 'git', 'perforce', etc
|
27
|
+
# @option options [String] :project_id to create the vcs root under
|
28
|
+
# @yield [Hash] properties to set on the vcs root, view the page source of the vcs root page for the id and value of a property
|
29
|
+
# @return [Hashie::Mash] vcs root object that was created
|
30
|
+
#
|
31
|
+
# @example Create a Git VCS Root that pulls from master that is only shared with it's project and sub-projecdts and uses the default private key
|
32
|
+
# TeamCity.create_vcs_root(:vcs_name => 'my-git-vcs-root', :vcs_type => 'git', :project_id => 'project2') do |properties|
|
33
|
+
# properties['branch'] = 'master'
|
34
|
+
# properties['url'] = 'git@github.com:jperry/teamcity-ruby-client.git'
|
35
|
+
# properties['authMethod'] = 'PRIVATE_KEY_DEFAULT'
|
36
|
+
# properties['ignoreKnownHosts'] = true
|
37
|
+
# end
|
38
|
+
def create_vcs_root(options = {}, &block)
|
39
|
+
attributes = {
|
40
|
+
:name => options.fetch(:vcs_name),
|
41
|
+
:vcsName => VCS_TYPES[options.fetch(:vcs_type)] || options.fetch(:vcs_type),
|
42
|
+
:projectLocator => options.fetch(:project_id)
|
43
|
+
}
|
44
|
+
|
45
|
+
builder = TeamCity::ElementBuilder.new(attributes, &block)
|
46
|
+
|
47
|
+
post("vcs-roots", :content_type => :json) do |req|
|
48
|
+
req.body = builder.to_request_body
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Set a VCS root field
|
53
|
+
#
|
54
|
+
# @example Set a VCS roots name
|
55
|
+
# TeamCity.set_vcs_root_field('vcs1', 'name', 'new-name')
|
56
|
+
#
|
57
|
+
# @param vcs_root_id [String] the VCS root id
|
58
|
+
# @param field_name [String] the field name: 'name', 'shared', 'project'
|
59
|
+
# @param field_value [String] the value to set the field to
|
60
|
+
# @return [String] vcs_root_field_value that was set
|
61
|
+
def set_vcs_root_field(vcs_root_id, field_name, field_value)
|
62
|
+
path = "vcs-roots/id:#{vcs_root_id}/#{field_name}"
|
63
|
+
put(path, :content_type => :text, :accept => :text) do |req|
|
64
|
+
req.body = field_value
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require_relative 'version'
|
3
|
+
|
4
|
+
module TeamCity
|
5
|
+
module Configuration
|
6
|
+
VALID_OPTIONS_KEYS = [
|
7
|
+
:adapter,
|
8
|
+
:endpoint,
|
9
|
+
:user_agent,
|
10
|
+
:http_user,
|
11
|
+
:http_password
|
12
|
+
].freeze
|
13
|
+
|
14
|
+
DEFAULT_ADAPTER = Faraday.default_adapter
|
15
|
+
|
16
|
+
DEFAULT_ENDPOINT = 'http://teamcity:8111/httpAuth/app/rest/'.freeze
|
17
|
+
|
18
|
+
DEFAULT_USER_AGENT = "TeamCity Ruby Client #{TeamCity::VERSION}".freeze
|
19
|
+
|
20
|
+
DEFAULT_HTTP_USER = nil
|
21
|
+
|
22
|
+
DEFAULT_HTTP_PASSWORD = nil
|
23
|
+
|
24
|
+
DEFAULT_FORMAT = :json
|
25
|
+
|
26
|
+
attr_accessor *VALID_OPTIONS_KEYS
|
27
|
+
|
28
|
+
def self.extended(base)
|
29
|
+
base.reset
|
30
|
+
end
|
31
|
+
|
32
|
+
def configure
|
33
|
+
yield self
|
34
|
+
end
|
35
|
+
|
36
|
+
def options
|
37
|
+
VALID_OPTIONS_KEYS.inject({}) do |option, key|
|
38
|
+
option.merge!(key => send(key))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Reset all configuration options to defaults
|
43
|
+
def reset
|
44
|
+
self.adapter = DEFAULT_ADAPTER
|
45
|
+
self.endpoint = DEFAULT_ENDPOINT
|
46
|
+
self.user_agent = DEFAULT_USER_AGENT
|
47
|
+
self.http_user = DEFAULT_HTTP_USER
|
48
|
+
self.http_password = DEFAULT_HTTP_PASSWORD
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'faraday_middleware'
|
2
|
+
Dir[File.expand_path('../../faraday/*.rb', __FILE__)].each{|f| require f}
|
3
|
+
|
4
|
+
module TeamCity
|
5
|
+
# @private
|
6
|
+
module Connection
|
7
|
+
private
|
8
|
+
|
9
|
+
def connection(options={})
|
10
|
+
faraday_options = {
|
11
|
+
:headers => {
|
12
|
+
'User-Agent' => user_agent
|
13
|
+
}.merge((headers = Headers.build(options)).to_hash),
|
14
|
+
:ssl => {:verify => false},
|
15
|
+
:url => endpoint
|
16
|
+
}
|
17
|
+
|
18
|
+
Faraday::Connection.new(faraday_options) do |connection|
|
19
|
+
connection.use Faraday::Request::UrlEncoded
|
20
|
+
connection.use FaradayMiddleware::Mashify
|
21
|
+
connection.use FaradayMiddleware::ParseJson if headers.accept =~ /json/
|
22
|
+
connection.use FaradayMiddleware::NullResponseBody
|
23
|
+
connection.adapter(adapter)
|
24
|
+
connection.basic_auth(http_user, http_password)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class ElementBuilder
|
3
|
+
def initialize(attributes = {}, &block)
|
4
|
+
@payload = attributes
|
5
|
+
|
6
|
+
if block_given?
|
7
|
+
@payload['properties'] ||= {}
|
8
|
+
@payload['properties']['property'] ||= []
|
9
|
+
|
10
|
+
properties = {}
|
11
|
+
|
12
|
+
yield(properties)
|
13
|
+
|
14
|
+
properties.each do |name, value|
|
15
|
+
@payload['properties']['property'] << {
|
16
|
+
:name => name,
|
17
|
+
:value => value
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_request_body
|
24
|
+
@payload.to_json
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module TeamCity
|
2
|
+
class Headers
|
3
|
+
|
4
|
+
VALID_FORMATS = [ :json, :xml, :text ]
|
5
|
+
|
6
|
+
def self.build(opts={})
|
7
|
+
accept_format = opts.fetch(:accept){ :json }
|
8
|
+
content_type_format = opts.fetch(:content_type){ :json }
|
9
|
+
raise ArgumentError, "Invalid format for :accept, valid formats: #{VALID_FORMATS}" unless VALID_FORMATS.include?(accept_format)
|
10
|
+
raise ArgumentError, "Invalid format for :content_type, valid format: #{VALID_FORMATS}" unless VALID_FORMATS.include?(content_type_format)
|
11
|
+
new do |headers|
|
12
|
+
headers.accept = self.const_get(accept_format.to_s.capitalize).accept
|
13
|
+
headers.content_type = self.const_get(content_type_format.to_s.capitalize).content_type
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_accessor :accept, :content_type
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
yield(self) if block_given?
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_hash
|
24
|
+
{
|
25
|
+
'Accept' => accept,
|
26
|
+
'Content-Type' => content_type
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
class Xml
|
33
|
+
def self.accept; "application/xml; charset=utf-8"; end
|
34
|
+
def self.content_type; "application/xml"; end
|
35
|
+
end
|
36
|
+
|
37
|
+
class Json
|
38
|
+
def self.accept; "application/json; charset=utf-8"; end
|
39
|
+
def self.content_type; "application/json"; end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Text
|
43
|
+
def self.accept; 'text/plain'; end
|
44
|
+
def self.content_type; 'text/plain'; end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module TeamCity
|
2
|
+
# Defines HTTP request methods
|
3
|
+
module Request
|
4
|
+
# Perform an HTTP GET request
|
5
|
+
def get(path, options={}, &block)
|
6
|
+
request(:get, path, options, &block)
|
7
|
+
end
|
8
|
+
|
9
|
+
# Perform an HTTP POST request
|
10
|
+
def post(path, options={}, &block)
|
11
|
+
request(:post, path, options, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Perform an HTTP PUT request
|
15
|
+
def put(path, options={}, &block)
|
16
|
+
request(:put, path, options, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Perform an HTTP DELETE request
|
20
|
+
def delete(path, options={}, &block)
|
21
|
+
request(:delete, path, options, &block)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# Perform an HTTP request
|
27
|
+
def request(method, path, options, &block)
|
28
|
+
response = connection(options).send(method) do |request|
|
29
|
+
block.call(request) if block_given?
|
30
|
+
request.url(path)
|
31
|
+
end
|
32
|
+
response.body
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: http://teamcity-ruby-client:teamcity@localhost:8111/httpAuth/app/rest/buildTypes/BuildTypeTests_DeleteBuildTypeSettings/agent-requirements
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: <agent-requirement id="delete-agent-requirement" type="equals"><properties><property
|
9
|
+
name="property-name" value="delete-agent-requirement"/><property name="property-value"
|
10
|
+
value=""/></properties></agent-requirement>
|
11
|
+
headers:
|
12
|
+
User-Agent:
|
13
|
+
- TeamCity Ruby Client 0.4.0
|
14
|
+
Accept:
|
15
|
+
- application/json; charset=utf-8
|
16
|
+
Content-Type:
|
17
|
+
- application/xml
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Server:
|
24
|
+
- Apache-Coyote/1.1
|
25
|
+
Set-Cookie:
|
26
|
+
- RememberMe=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
|
27
|
+
- TCSESSIONID=D3D0379B84E01FCC30F572AC9D235E06; Path=/; HttpOnly
|
28
|
+
Pragma:
|
29
|
+
- no-cache
|
30
|
+
Expires:
|
31
|
+
- Thu, 01 Jan 1970 00:00:00 GMT
|
32
|
+
Cache-Control:
|
33
|
+
- no-cache
|
34
|
+
- no-store
|
35
|
+
Content-Type:
|
36
|
+
- application/json
|
37
|
+
Transfer-Encoding:
|
38
|
+
- chunked
|
39
|
+
Date:
|
40
|
+
- Wed, 14 Aug 2013 13:40:01 GMT
|
41
|
+
body:
|
42
|
+
encoding: US-ASCII
|
43
|
+
string: ! '{"id":"delete-agent-requirement","type":"equals","properties":{"property":[{"name":"property-name","value":"delete-agent-requirement"},{"name":"property-value","value":""}]}}'
|
44
|
+
http_version:
|
45
|
+
recorded_at: Wed, 14 Aug 2013 13:40:01 GMT
|
46
|
+
- request:
|
47
|
+
method: delete
|
48
|
+
uri: http://teamcity-ruby-client:teamcity@localhost:8111/httpAuth/app/rest/buildTypes/BuildTypeTests_DeleteBuildTypeSettings/agent-requirements/delete-agent-requirement
|
49
|
+
body:
|
50
|
+
encoding: US-ASCII
|
51
|
+
string: ''
|
52
|
+
headers:
|
53
|
+
User-Agent:
|
54
|
+
- TeamCity Ruby Client 0.4.0
|
55
|
+
Accept:
|
56
|
+
- application/json; charset=utf-8
|
57
|
+
Content-Type:
|
58
|
+
- application/json
|
59
|
+
response:
|
60
|
+
status:
|
61
|
+
code: 204
|
62
|
+
message: No Content
|
63
|
+
headers:
|
64
|
+
Server:
|
65
|
+
- Apache-Coyote/1.1
|
66
|
+
Set-Cookie:
|
67
|
+
- RememberMe=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
|
68
|
+
- TCSESSIONID=8A65EEF1CA573F6D40EC4EDE344112BC; Path=/; HttpOnly
|
69
|
+
Pragma:
|
70
|
+
- no-cache
|
71
|
+
Expires:
|
72
|
+
- Thu, 01 Jan 1970 00:00:00 GMT
|
73
|
+
Cache-Control:
|
74
|
+
- no-cache
|
75
|
+
- no-store
|
76
|
+
Date:
|
77
|
+
- Wed, 14 Aug 2013 13:40:01 GMT
|
78
|
+
body:
|
79
|
+
encoding: US-ASCII
|
80
|
+
string: ''
|
81
|
+
http_version:
|
82
|
+
recorded_at: Wed, 14 Aug 2013 13:40:01 GMT
|
83
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,40 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: delete
|
5
|
+
uri: http://teamcity-ruby-client:teamcity@localhost:8111/httpAuth/app/rest/buildTypes/BuildTypeTests_DeleteBuildTypeRequest
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- TeamCity Ruby Client 0.4.0
|
12
|
+
Accept:
|
13
|
+
- application/json; charset=utf-8
|
14
|
+
Content-Type:
|
15
|
+
- application/json
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 204
|
19
|
+
message: No Content
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- Apache-Coyote/1.1
|
23
|
+
Set-Cookie:
|
24
|
+
- RememberMe=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
|
25
|
+
- TCSESSIONID=DEC226611E966051DBB9544DC0506D6A; Path=/; HttpOnly
|
26
|
+
Pragma:
|
27
|
+
- no-cache
|
28
|
+
Expires:
|
29
|
+
- Thu, 01 Jan 1970 00:00:00 GMT
|
30
|
+
Cache-Control:
|
31
|
+
- no-cache
|
32
|
+
- no-store
|
33
|
+
Date:
|
34
|
+
- Wed, 14 Aug 2013 13:43:51 GMT
|
35
|
+
body:
|
36
|
+
encoding: US-ASCII
|
37
|
+
string: ''
|
38
|
+
http_version:
|
39
|
+
recorded_at: Wed, 14 Aug 2013 13:43:51 GMT
|
40
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,81 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: put
|
5
|
+
uri: http://teamcity-ruby-client:teamcity@localhost:8111/httpAuth/app/rest/buildTypes/BuildTypeTests_DeleteBuildTypeSettings/parameters/delete-buildtype-param
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- TeamCity Ruby Client 0.4.0
|
12
|
+
Accept:
|
13
|
+
- text/plain
|
14
|
+
Content-Type:
|
15
|
+
- text/plain
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 200
|
19
|
+
message: OK
|
20
|
+
headers:
|
21
|
+
Server:
|
22
|
+
- Apache-Coyote/1.1
|
23
|
+
Set-Cookie:
|
24
|
+
- RememberMe=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
|
25
|
+
- TCSESSIONID=3DD3228407F350DD087D54467B54201B; Path=/; HttpOnly
|
26
|
+
Pragma:
|
27
|
+
- no-cache
|
28
|
+
Expires:
|
29
|
+
- Thu, 01 Jan 1970 00:00:00 GMT
|
30
|
+
Cache-Control:
|
31
|
+
- no-cache
|
32
|
+
- no-store
|
33
|
+
Content-Type:
|
34
|
+
- text/plain
|
35
|
+
Content-Length:
|
36
|
+
- '0'
|
37
|
+
Date:
|
38
|
+
- Wed, 14 Aug 2013 13:37:47 GMT
|
39
|
+
body:
|
40
|
+
encoding: US-ASCII
|
41
|
+
string: ''
|
42
|
+
http_version:
|
43
|
+
recorded_at: Wed, 14 Aug 2013 13:37:48 GMT
|
44
|
+
- request:
|
45
|
+
method: delete
|
46
|
+
uri: http://teamcity-ruby-client:teamcity@localhost:8111/httpAuth/app/rest/buildTypes/BuildTypeTests_DeleteBuildTypeSettings/parameters/delete-me
|
47
|
+
body:
|
48
|
+
encoding: US-ASCII
|
49
|
+
string: ''
|
50
|
+
headers:
|
51
|
+
User-Agent:
|
52
|
+
- TeamCity Ruby Client 0.4.0
|
53
|
+
Accept:
|
54
|
+
- text/plain
|
55
|
+
Content-Type:
|
56
|
+
- text/plain
|
57
|
+
response:
|
58
|
+
status:
|
59
|
+
code: 204
|
60
|
+
message: No Content
|
61
|
+
headers:
|
62
|
+
Server:
|
63
|
+
- Apache-Coyote/1.1
|
64
|
+
Set-Cookie:
|
65
|
+
- RememberMe=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; HttpOnly
|
66
|
+
- TCSESSIONID=B25867C33EC5BBB87144ADAA3E52E816; Path=/; HttpOnly
|
67
|
+
Pragma:
|
68
|
+
- no-cache
|
69
|
+
Expires:
|
70
|
+
- Thu, 01 Jan 1970 00:00:00 GMT
|
71
|
+
Cache-Control:
|
72
|
+
- no-cache
|
73
|
+
- no-store
|
74
|
+
Date:
|
75
|
+
- Wed, 14 Aug 2013 13:37:47 GMT
|
76
|
+
body:
|
77
|
+
encoding: US-ASCII
|
78
|
+
string: ''
|
79
|
+
http_version:
|
80
|
+
recorded_at: Wed, 14 Aug 2013 13:37:48 GMT
|
81
|
+
recorded_with: VCR 2.4.0
|