teamcity 1.3.1

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.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.travis.yml +3 -0
  4. data/.yardopts +1 -0
  5. data/CHANGELOG.md +83 -0
  6. data/Gemfile +4 -0
  7. data/Guardfile +9 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +194 -0
  10. data/Rakefile +1 -0
  11. data/lib/faraday/null_response_body.rb +17 -0
  12. data/lib/teamcity.rb +26 -0
  13. data/lib/teamcity/api.rb +19 -0
  14. data/lib/teamcity/client.rb +16 -0
  15. data/lib/teamcity/client/build_types.rb +305 -0
  16. data/lib/teamcity/client/builds.rb +92 -0
  17. data/lib/teamcity/client/common.rb +23 -0
  18. data/lib/teamcity/client/projects.rb +159 -0
  19. data/lib/teamcity/client/tests.rb +24 -0
  20. data/lib/teamcity/client/vcs_roots.rb +70 -0
  21. data/lib/teamcity/configuration.rb +51 -0
  22. data/lib/teamcity/connection.rb +28 -0
  23. data/lib/teamcity/element_builder.rb +27 -0
  24. data/lib/teamcity/headers.rb +47 -0
  25. data/lib/teamcity/request.rb +35 -0
  26. data/lib/teamcity/version.rb +3 -0
  27. data/spec/cassettes/BuildTypes/DELETE/_delete_agent_requirement/should_delete_the_agent_requirement.yml +83 -0
  28. data/spec/cassettes/BuildTypes/DELETE/_delete_buildtype/should_delete_a_buildtype.yml +40 -0
  29. data/spec/cassettes/BuildTypes/DELETE/_delete_buildtype_parameter/should_delete_a_buildtype_parameter.yml +81 -0
  30. data/spec/cassettes/BuildTypes/GET/_buildtype/should_fetch_the_details_of_a_buildtype_by_id.yml +89 -0
  31. data/spec/cassettes/BuildTypes/GET/_buildtype/should_raise_an_error_if_the_buildtype_does_not_exist.yml +52 -0
  32. data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_fetch_the_build_configuration_agent_requirements_for_a_buildtype.yml +46 -0
  33. data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_return_an_array.yml +46 -0
  34. data/spec/cassettes/BuildTypes/GET/_buildtype_agent_requirements/should_return_nil_if_there_are_no_agent_requirements_defined.yml +46 -0
  35. data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_fetch_the_build_configuration_artifact_dependencies_for_a_buildtype.yml +46 -0
  36. data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_return_an_array.yml +46 -0
  37. data/spec/cassettes/BuildTypes/GET/_buildtype_artifact_dependencies/should_return_nil_if_there_are_no_artifact_dependencies_defined.yml +46 -0
  38. data/spec/cassettes/BuildTypes/GET/_buildtype_branches/should_fetch_vcs_branches_the_vcs_root_is_configured_to_use.yml +46 -0
  39. data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_fetch_the_build_configuration_features_for_a_buildtype.yml +46 -0
  40. data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_return_an_array.yml +46 -0
  41. data/spec/cassettes/BuildTypes/GET/_buildtype_features/should_return_nil_if_there_are_no_features_defined.yml +46 -0
  42. data/spec/cassettes/BuildTypes/GET/_buildtype_investigations/should_get_investigation_details.yml +48 -0
  43. data/spec/cassettes/BuildTypes/GET/_buildtype_investigations/should_return_nil_if_no_one_is_investigating.yml +46 -0
  44. data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_fetch_the_build_configuration_parameters_for_a_buildtype.yml +46 -0
  45. data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_return_an_array.yml +46 -0
  46. data/spec/cassettes/BuildTypes/GET/_buildtype_parameters/should_return_nil_if_there_are_no_parameters_defined.yml +46 -0
  47. data/spec/cassettes/BuildTypes/GET/_buildtype_settings/should_fetch_the_settings_for_a_given_buildtype.yml +89 -0
  48. data/spec/cassettes/BuildTypes/GET/_buildtype_settings/should_return_an_array.yml +89 -0
  49. data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_fetch_the_build_configuration_snapshot_dependencies_for_a_buildtype.yml +46 -0
  50. data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_return_an_array.yml +46 -0
  51. data/spec/cassettes/BuildTypes/GET/_buildtype_snapshot_dependencies/should_return_nil_if_there_are_no_snapshot_dependencies_defined.yml +46 -0
  52. data/spec/cassettes/BuildTypes/GET/_buildtype_state/should_fetch_the_state_of_the_buildtype.yml +89 -0
  53. data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_fetch_the_build_configuration_steps_for_a_buildtype.yml +47 -0
  54. data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_return_an_array.yml +46 -0
  55. data/spec/cassettes/BuildTypes/GET/_buildtype_steps/should_return_nil_if_there_are_no_steps_defined.yml +46 -0
  56. data/spec/cassettes/BuildTypes/GET/_buildtype_template/should_return_nil_if_the_buildtype_is_not_associated_with_a_template.yml +52 -0
  57. data/spec/cassettes/BuildTypes/GET/_buildtype_template/should_return_the_attributes_of_the_associated_template.yml +46 -0
  58. data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_fetch_the_build_configuration_triggers_for_a_buildtype.yml +46 -0
  59. data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_return_an_array.yml +46 -0
  60. data/spec/cassettes/BuildTypes/GET/_buildtype_triggers/should_return_nil_if_there_are_no_triggers_defined.yml +46 -0
  61. data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_fetch_the_build_configuration_vcs_root_entries_for_a_buildtype.yml +47 -0
  62. data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_return_an_array.yml +47 -0
  63. data/spec/cassettes/BuildTypes/GET/_buildtype_vcs_root_entries/should_return_nil_if_there_are_no_vcs_root_entries_defined.yml +46 -0
  64. data/spec/cassettes/BuildTypes/GET/_buildtypes/should_fetch_all_the_buildtypes.yml +46 -0
  65. data/spec/cassettes/BuildTypes/POST/_attach_vcs_root/should_attach_a_vcs_root_to_a_buildtype.yml +47 -0
  66. data/spec/cassettes/BuildTypes/POST/_create_agent_requirement/should_create_an_agent_requirement_for_a_buildtype.yml +46 -0
  67. data/spec/cassettes/BuildTypes/POST/_create_build_step/should_create_a_build_step_for_a_given_build_type.yml +46 -0
  68. data/spec/cassettes/BuildTypes/POST/_create_build_trigger/should_create_a_build_trigger_for_a_given_build_type.yml +46 -0
  69. data/spec/cassettes/BuildTypes/POST/_create_buildtype/should_create_a_build_type.yml +86 -0
  70. data/spec/cassettes/BuildTypes/PUT/_set_build_step_field/should_disable_a_build_step.yml +44 -0
  71. data/spec/cassettes/BuildTypes/PUT/_set_build_step_field/should_enable_a_build_step.yml +48 -0
  72. data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_pause_a_project.yml +44 -0
  73. data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_set_a_projects_description.yml +44 -0
  74. data/spec/cassettes/BuildTypes/PUT/_set_buildtype_field/should_set_the_buildtype_name.yml +44 -0
  75. data/spec/cassettes/BuildTypes/PUT/_set_buildtype_parameter/should_set_a_buildtype_parameter.yml +44 -0
  76. data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_if_it_should_perform_clean_builds.yml +46 -0
  77. data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_what_is_the_timeout_in_minutes_when_executing_builds.yml +46 -0
  78. data/spec/cassettes/BuildTypes/PUT/_set_buildtype_setting/should_set_where_the_checkout_happens_when_building.yml +46 -0
  79. data/spec/cassettes/Builds/DELETE/_unpin_build/should_unpin_a_build.yml +83 -0
  80. data/spec/cassettes/Builds/GET/_build/should_fetch_the_build_details.yml +91 -0
  81. data/spec/cassettes/Builds/GET/_build/should_raise_an_error_if_the_build_does_not_exist.yml +53 -0
  82. data/spec/cassettes/Builds/GET/_build_artifacts/should_fetch_all_the_artifacts.yml +89 -0
  83. data/spec/cassettes/Builds/GET/_build_pinned_/should_return_false_when_a_build_is_not_pinned.yml +126 -0
  84. data/spec/cassettes/Builds/GET/_build_pinned_/should_return_true_when_a_build_is_pinned.yml +126 -0
  85. data/spec/cassettes/Builds/GET/_build_statistics/should_return_statistics_for_a_build.yml +89 -0
  86. data/spec/cassettes/Builds/GET/_build_tags/should_fetch_the_build_tags.yml +89 -0
  87. 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
  88. data/spec/cassettes/Builds/GET/_builds/should_allow_you_to_filter_by_multiple_build_locators.yml +46 -0
  89. data/spec/cassettes/Builds/GET/_builds/should_allow_you_to_filter_results_by_build_locators.yml +46 -0
  90. data/spec/cassettes/Builds/GET/_builds/should_fetch_all_the_builds.yml +46 -0
  91. data/spec/cassettes/Builds/GET/_builds/should_return_an_empty_array_if_no_results_are_found.yml +46 -0
  92. data/spec/cassettes/Builds/PUT/_pin_build/should_pin_a_build.yml +83 -0
  93. data/spec/cassettes/Projects/DELETE/_delete_project/should_delete_a_project.yml +82 -0
  94. data/spec/cassettes/Projects/DELETE/_delete_project_parameter/should_delete_a_project_parameter.yml +123 -0
  95. data/spec/cassettes/Projects/GET/_parent_project/should_fetch_the_parent_project_for_a_given_project.yml +46 -0
  96. data/spec/cassettes/Projects/GET/_parent_project/should_return_nil_if_there_is_no_parent_project_for_a_given_project.yml +46 -0
  97. data/spec/cassettes/Projects/GET/_project/should_fetch_a_single_project_by_id.yml +47 -0
  98. data/spec/cassettes/Projects/GET/_project/should_raise_an_error_if_the_project_does_not_exist.yml +52 -0
  99. data/spec/cassettes/Projects/GET/_project_buildtypes/should_fetch_all_the_buildTypes_for_a_project.yml +46 -0
  100. data/spec/cassettes/Projects/GET/_project_buildtypes/should_return_nil_if_the_project_does_not_have_any_build_types.yml +46 -0
  101. data/spec/cassettes/Projects/GET/_project_parameters/should_fetch_all_the_paramters_for_a_given_project.yml +46 -0
  102. data/spec/cassettes/Projects/GET/_project_parameters/should_return_nil_if_there_are_no_parameters_defined_for_a_project.yml +46 -0
  103. data/spec/cassettes/Projects/GET/_projects/should_fetch_projects.yml +46 -0
  104. data/spec/cassettes/Projects/POST/_copy_project/should_copy_a_project.yml +135 -0
  105. data/spec/cassettes/Projects/POST/_create_project/should_create_a_project.yml +45 -0
  106. data/spec/cassettes/Projects/PUT/_set_parent_project/should_set_a_parent_project_for_a_given_project.yml +134 -0
  107. data/spec/cassettes/Projects/PUT/_set_project_field/should_archive_a_project.yml +86 -0
  108. data/spec/cassettes/Projects/PUT/_set_project_field/should_set_a_projects_description.yml +86 -0
  109. data/spec/cassettes/Projects/PUT/_set_project_field/should_set_a_projects_name.yml +86 -0
  110. data/spec/cassettes/Projects/PUT/_set_project_parameter/should_set_a_project_parameter.yml +86 -0
  111. data/spec/cassettes/Tests/GET/_tests/should_allow_you_to_filter_by_test_id.yml +49 -0
  112. data/spec/cassettes/Tests/GET/_tests/should_allow_you_to_filter_results_by_test_count_locator.yml +55 -0
  113. data/spec/cassettes/Tests/GET/_tests/should_fetch_all_the_tests.yml +60 -0
  114. data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_no_build_is_found.yml +51 -0
  115. data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_no_test_is_found.yml +51 -0
  116. data/spec/cassettes/Tests/GET/_tests/should_return_an_empty_array_if_not_build_is_given.yml +51 -0
  117. data/spec/cassettes/VCSRoots/GET/_vcs_root_details/should_fetch_the_vcs_root_details.yml +91 -0
  118. data/spec/cassettes/VCSRoots/GET/_vcs_roots/should_fetch_vcs_roots.yml +47 -0
  119. 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
  120. 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
  121. data/spec/cassettes/VCSRoots/PUT/_set_vcs_root_field/should_set_a_vcs_modification_check_interval.yml +179 -0
  122. data/spec/faraday/null_response_body_spec.rb +18 -0
  123. data/spec/spec_helper.rb +22 -0
  124. data/spec/support/vcr_setup.rb +9 -0
  125. data/spec/teamcity/api_spec.rb +64 -0
  126. data/spec/teamcity/client/builds_spec.rb +113 -0
  127. data/spec/teamcity/client/buildtypes_spec.rb +308 -0
  128. data/spec/teamcity/client/projects_spec.rb +207 -0
  129. data/spec/teamcity/client/tests_spec.rb +47 -0
  130. data/spec/teamcity/client/vcs_roots_spec.rb +86 -0
  131. data/spec/teamcity/client_spec.rb +14 -0
  132. data/spec/teamcity/element_builder_spec.rb +30 -0
  133. data/spec/teamcity/headers_spec.rb +43 -0
  134. data/spec/teamcity/version_spec.rb +7 -0
  135. data/spec/teamcity_spec.rb +89 -0
  136. data/teamcity.gemspec +26 -0
  137. 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,3 @@
1
+ module TeamCity
2
+ VERSION = '1.3.1'
3
+ 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