ruby_tfs 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/tfs/builds.rb +2 -2
- data/lib/tfs/changes.rb +19 -0
- data/lib/tfs/changesets.rb +4 -0
- data/lib/tfs/client.rb +2 -2
- data/lib/tfs/query_engine.rb +21 -7
- data/ruby_tfs.gemspec +1 -1
- data/spec/fixtures/cassettes/builds.yml +46 -0
- data/spec/tfs/query_engine_spec.rb +0 -12
- metadata +3 -2
data/lib/tfs/builds.rb
CHANGED
@@ -23,8 +23,8 @@ module TFS
|
|
23
23
|
#
|
24
24
|
def find(definition, project, number)
|
25
25
|
begin
|
26
|
-
TFS.builds(
|
27
|
-
rescue RestClient::
|
26
|
+
TFS.builds(definition: definition, project: project, number: number).run.first
|
27
|
+
rescue RestClient::ResourceNotFound => e
|
28
28
|
raise Queryable::RecordNotFound, "No record found for '#{definition}', '#{project}', #{number}"
|
29
29
|
end
|
30
30
|
end
|
data/lib/tfs/changes.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module TFS
|
2
|
+
class Changes < Queryable
|
3
|
+
|
4
|
+
class << self
|
5
|
+
# Changes have to be scoped by changesets, so all requires we have a changeset id
|
6
|
+
def all(changeset)
|
7
|
+
TFS.changesets(changeset).changes
|
8
|
+
end
|
9
|
+
|
10
|
+
# Change can be found by changeset and path
|
11
|
+
#
|
12
|
+
# TFS::Changes.find(123, '/path/to/change')
|
13
|
+
#
|
14
|
+
def find(changeset, path)
|
15
|
+
TFS.changes({changeset: changeset, path: path}).run.first
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/tfs/changesets.rb
CHANGED
data/lib/tfs/client.rb
CHANGED
@@ -23,10 +23,10 @@ module TFS
|
|
23
23
|
|
24
24
|
# Creates the connection to the data provider source
|
25
25
|
def connect
|
26
|
-
@connection
|
26
|
+
@connection ||= @provider.new endpoint, opts_for_connection
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
TFS::QueryEngine::VALID_CLASSES.each do |klass|
|
30
30
|
define_method(base_class(klass).downcase) do |*params|
|
31
31
|
TFS::QueryEngine.new(klass, @connection, params)
|
32
32
|
end
|
data/lib/tfs/query_engine.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'tfs/queryable'
|
2
2
|
require 'tfs/builds'
|
3
3
|
require 'tfs/changesets'
|
4
|
+
require 'tfs/changes'
|
4
5
|
require 'tfs/projects'
|
5
6
|
|
6
7
|
require 'tfs/work_items'
|
@@ -12,15 +13,25 @@ module TFS
|
|
12
13
|
|
13
14
|
attr_reader :type
|
14
15
|
|
16
|
+
|
17
|
+
# Classes we currently support queries on
|
15
18
|
VALID_CLASSES = [
|
16
19
|
TFS::Builds,
|
17
20
|
TFS::Changesets,
|
18
21
|
TFS::Projects,
|
19
|
-
TFS::WorkItems
|
22
|
+
TFS::WorkItems,
|
23
|
+
TFS::Changes
|
20
24
|
]
|
21
25
|
|
26
|
+
# Default pagination `#all` limit
|
27
|
+
# for all other actions, it limits by default to 20 (API level limit)
|
22
28
|
DEFAULT_LIMIT = 50
|
23
29
|
|
30
|
+
# A new query requres a base class (of one of the above `VALID_CLASSES`),
|
31
|
+
# a connection (from `client.connection`) and can take additional selection parameters
|
32
|
+
#
|
33
|
+
# TFS::QueryEngine(TFS::Projects, TFS.client.connection, 'project-name')
|
34
|
+
#
|
24
35
|
def initialize(for_class, connection, params="")
|
25
36
|
check_type(for_class)
|
26
37
|
@type, @connection = for_class, connection
|
@@ -28,45 +39,48 @@ module TFS
|
|
28
39
|
@native_query = @connection.send(base_class(for_class), normalize(params))
|
29
40
|
end
|
30
41
|
|
42
|
+
# Returns the underlying `OData::QueryBuilder` object in case you want to work
|
43
|
+
# directly against the odata adapter
|
31
44
|
def raw
|
32
45
|
@native_query
|
33
46
|
end
|
34
47
|
|
48
|
+
# Limit records returned
|
35
49
|
def limit(count)
|
36
50
|
@native_query = @native_query.top(count)
|
37
51
|
self
|
38
52
|
end
|
39
53
|
|
54
|
+
# Ordering. Must be a valid field
|
40
55
|
def order_by(query)
|
41
56
|
@native_query = @native_query.order_by(query)
|
42
57
|
self
|
43
58
|
end
|
44
59
|
|
60
|
+
# Filtering, use odata query syntax
|
45
61
|
def where(filter)
|
46
62
|
@native_query = @native_query.filter(filter)
|
47
63
|
self
|
48
64
|
end
|
49
65
|
|
66
|
+
# Return a count of records rather than records
|
50
67
|
def count
|
51
68
|
@native_query = @native_query.count
|
52
69
|
self
|
53
70
|
end
|
54
71
|
|
55
|
-
|
56
|
-
check_type(klass)
|
57
|
-
@native_query.expand(base_class(klass))
|
58
|
-
self
|
59
|
-
end
|
60
|
-
|
72
|
+
# For pagination. Skips supplied number of records
|
61
73
|
def page(start)
|
62
74
|
@native_query = @native_query.skip(start)
|
63
75
|
self
|
64
76
|
end
|
65
77
|
|
78
|
+
# Required to execute the query
|
66
79
|
def run
|
67
80
|
@connection.execute
|
68
81
|
end
|
69
82
|
|
83
|
+
# Returns the actual query string (does not run query)
|
70
84
|
def to_query
|
71
85
|
@native_query.query
|
72
86
|
end
|
data/ruby_tfs.gemspec
CHANGED
@@ -448,4 +448,50 @@ http_interactions:
|
|
448
448
|
syntax.</message>\r\n</error>"
|
449
449
|
http_version:
|
450
450
|
recorded_at: Wed, 06 Mar 2013 21:02:55 GMT
|
451
|
+
- request:
|
452
|
+
method: get
|
453
|
+
uri: https://snd%5Cplukevdh_cp:garbage@codeplexodata.cloudapp.net/TFS29/Builds(Definition='rubytfs_demo',Project='rubytfs',Number='1')
|
454
|
+
body:
|
455
|
+
encoding: US-ASCII
|
456
|
+
string: ''
|
457
|
+
headers:
|
458
|
+
Accept:
|
459
|
+
- ! '*/*; q=0.5, application/xml'
|
460
|
+
Accept-Encoding:
|
461
|
+
- gzip, deflate
|
462
|
+
User-Agent:
|
463
|
+
- Ruby
|
464
|
+
response:
|
465
|
+
status:
|
466
|
+
code: 404
|
467
|
+
message: Not Found
|
468
|
+
headers:
|
469
|
+
Cache-Control:
|
470
|
+
- private
|
471
|
+
Content-Length:
|
472
|
+
- '246'
|
473
|
+
Content-Type:
|
474
|
+
- application/xml
|
475
|
+
Expires:
|
476
|
+
- Wed, 06 Mar 2013 22:06:55 GMT
|
477
|
+
Vary:
|
478
|
+
- ! '*'
|
479
|
+
Server:
|
480
|
+
- Microsoft-IIS/7.0
|
481
|
+
Dataserviceversion:
|
482
|
+
- 1.0;
|
483
|
+
X-Aspnet-Version:
|
484
|
+
- 4.0.30319
|
485
|
+
X-Powered-By:
|
486
|
+
- ASP.NET
|
487
|
+
Date:
|
488
|
+
- Wed, 06 Mar 2013 22:06:34 GMT
|
489
|
+
body:
|
490
|
+
encoding: US-ASCII
|
491
|
+
string: ! "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\r\n<error
|
492
|
+
xmlns=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\">\r\n
|
493
|
+
\ <code></code>\r\n <message xml:lang=\"en-US\">Resource not found for the
|
494
|
+
segment 'Builds'.</message>\r\n</error>"
|
495
|
+
http_version:
|
496
|
+
recorded_at: Wed, 06 Mar 2013 22:06:34 GMT
|
451
497
|
recorded_with: VCR 2.4.0
|
@@ -25,18 +25,6 @@ describe TFS::QueryEngine do
|
|
25
25
|
query.limit(10).order_by("Reason")
|
26
26
|
end
|
27
27
|
|
28
|
-
it "can include other results" do
|
29
|
-
native_query.should_receive(:expand).with('Changesets').and_return(native_query).once
|
30
|
-
|
31
|
-
query.include(TFS::Changesets)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "raises error if expand by invalid class" do
|
35
|
-
expect { query.include('String') }.to raise_error(TypeError)
|
36
|
-
|
37
|
-
native_query.should_not have_received(:expand)
|
38
|
-
end
|
39
|
-
|
40
28
|
it "can cause pagination" do
|
41
29
|
native_query.should_receive(:skip).with(10)
|
42
30
|
query.page(10)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_tfs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -55,6 +55,7 @@ files:
|
|
55
55
|
- README.md
|
56
56
|
- ruby_tfs.gemspec
|
57
57
|
- lib/tfs/builds.rb
|
58
|
+
- lib/tfs/changes.rb
|
58
59
|
- lib/tfs/changesets.rb
|
59
60
|
- lib/tfs/class_helpers.rb
|
60
61
|
- lib/tfs/client.rb
|
@@ -95,7 +96,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
95
96
|
version: '0'
|
96
97
|
segments:
|
97
98
|
- 0
|
98
|
-
hash:
|
99
|
+
hash: -1238616650401436106
|
99
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
100
101
|
none: false
|
101
102
|
requirements:
|