rally_rest_api 0.5.7 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,6 +8,10 @@ class String # :nodoc: all
8
8
  alias :to_q :to_s
9
9
  end
10
10
 
11
+ class Fixnum
12
+ alias :to_q :to_s
13
+ end
14
+
11
15
  class Symbol # :nodoc: all
12
16
  def to_q
13
17
  self.to_s.to_camel
@@ -66,22 +70,22 @@ end
66
70
  class RestQuery
67
71
  attr_reader :type
68
72
 
69
- def initialize(type, *args, &block)
73
+ def initialize(type, args = {}, &block)
70
74
  @type = type
71
75
  @query_string = "query=" << URI.escape(QueryBuilder.new("and", &block).to_q) if block_given?
72
- @query_params = process_args(args[0])
76
+ @query_params = process_args(args)
73
77
  end
74
78
 
75
- def process_args(args) # :nodoc"
79
+ def process_args(args) # :nodoc:
76
80
  return if args.nil?
77
81
  query_string = ""
78
- args.each do |key, value|
79
- case key
82
+ args.each do |k, v|
83
+ case k
80
84
  when :order
81
85
  # this is a hack, we need a better way to express descending
82
- value = [value].flatten.map { |e| e.to_s.to_camel }.join(", ").gsub(", Desc", " desc")
86
+ v = [v].flatten.map { |e| e.to_s.to_camel }.join(", ").gsub(", Desc", " desc")
83
87
  end
84
- query_string << "&#{key}=#{URI.escape(value.to_s)}"
88
+ query_string << "&#{k}=#{URI.escape(v.to_q)}"
85
89
  end
86
90
  query_string
87
91
  end
@@ -36,6 +36,7 @@ class QueryResult < RestObject
36
36
  @start_index = elements[:start_index].to_i
37
37
  end
38
38
 
39
+ require 'active_support/breakpoint'
39
40
  # fetch the next page of results. Uses the original query to generate the query string.
40
41
  def next_page
41
42
  @rally_rest.query(@query.next_page(:start => self.start_index + self.page_size,
@@ -71,13 +71,18 @@ class RallyRestAPI
71
71
  # Example :
72
72
  # rally.find(:artifact, :page_size => 20, :start_index => 20) { equal :name, "name" }
73
73
  # See RestQuery for more info.
74
- def find(type, *args, &query)
74
+ def find(type, args = {}, &query)
75
75
  # pass the args to RestQuery, make it generate the string and handle generating the query for the
76
76
  # next page etc.
77
77
  query = RestQuery.new(type, args, &query)
78
78
  query(query)
79
79
  end
80
80
 
81
+ # find all object of a given type. Base types work also (.e.g :artifact)
82
+ def find_all(type, *args)
83
+ find(type, args) { gt :object_i_d, "0" }
84
+ end
85
+
81
86
  # update - update an object
82
87
  def update(rest_object, attributes)
83
88
  rest_object.update(attributes)
@@ -113,7 +113,8 @@ class RestObject
113
113
  return elements
114
114
  end
115
115
 
116
- # lifted from rails
116
+ public
117
+
117
118
  def underscore(camel_cased_word)
118
119
  camel_cased_word.to_s.gsub(/::/, '/').
119
120
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
@@ -122,7 +123,6 @@ class RestObject
122
123
  downcase
123
124
  end
124
125
 
125
- public
126
126
 
127
127
  # return the XML of the resource
128
128
  def body
@@ -150,13 +150,20 @@ class RestObject
150
150
  self.elements[:object_id]
151
151
  end
152
152
 
153
+ # return the typedef for this resource.
154
+ def typedef
155
+ # this is a little ugly as we start to introduce some type specific info into this class.
156
+ # All WorkspaceDomainObjects have a #workspace, that excludes user, workspace and subscription.
157
+ return nil if self.type =~ /User|Workspace|Subscription/
158
+ TypeDefinition.cached_type_definition(self)
159
+ end
160
+
153
161
  # re-read the resource
154
162
  def refresh
155
163
  self.elements(true)
156
164
  self
157
165
  end
158
166
 
159
- protected
160
167
  def elements(read = @elements.nil?) #:nodoc:
161
168
  if read
162
169
  @document_content = read_rest(self.ref, @username, @password)
@@ -1,23 +1,59 @@
1
1
 
2
- class TypeDefinition # :nodoc:
3
- def initialize(type, value)
4
- @type = type
5
- @value = value
2
+ require 'rally_rest_api/string_utils'
3
+ require 'rally_rest_api/rest_object'
4
+
5
+ class TypeDefinition < RestObject # :nodoc:
6
+
7
+ def self.cached_type_definition(workspace_domain_object)
8
+ # todo, actually cache the value
9
+ typedef = workspace_domain_object.workspace.type_definitions.values.find do |typedef|
10
+ puts "#{workspace_domain_object.type} == #{typedef.element_name}"
11
+ workspace_domain_object.type == typedef.element_name
12
+ end
13
+ TypeDefinition.new(typedef.rally_rest, typedef.body)
14
+ end
15
+
16
+ def collection_attributes(include_parent = false)
17
+ collect_attributes_of_type("COLLECTION", include_parent)
18
+ end
19
+
20
+ def object_attributes(include_parent = false)
21
+ collect_attributes_of_type("OBJECT", include_parent)
6
22
  end
7
23
 
8
- def collection_attributes
9
- value.attributes.values.collect do |attr_def|
10
- attr_def.element_name if attr_def.attribute_type == "COLLECTION"
11
- end.compact
24
+ def reference_attributes(include_parent = false)
25
+ collection_attributes(include_parent).merge object_attributes(include_parent)
12
26
  end
13
27
 
14
- def attributes
15
- all_attributes = []
16
- value.parent.attributes
28
+ def collect_attributes_of_type(type, include_parent)
29
+ self.attributes(include_parent).inject({}) do |h, (element_name, attrdef)|
30
+ h[element_name] = attrdef if attrdef.attribute_type == type
31
+ h
32
+ end
33
+ end
34
+
35
+ def symbol_keyed_attributes(attribute_array)
36
+ attribute_array.inject({}) do |hash, attrdef|
37
+ hash[underscore(attrdef.element_name).intern] = attrdef
38
+ hash
39
+ end
40
+ end
41
+
42
+ def attributes(include_parent = false)
43
+ return symbol_keyed_attributes(self.elements[:attributes].values) unless include_parent
44
+
45
+ typedef = self
46
+ all_attributes = {}
47
+ until typedef.parent.nil?
48
+ all_attributes.merge! typedef.attributes(false)
49
+ typedef = typedef.parent
50
+ end
51
+ all_attributes
17
52
  end
18
53
 
19
54
  def parent
20
- TypeDefinition.new(value.parent.name, value.parent)
55
+ return nil if self.elements[:parent].nil?
56
+ TypeDefinition.new(self.rally_rest, self.elements[:parent].body)
21
57
  end
22
58
 
23
59
  end
@@ -2,7 +2,7 @@ module RallyRestVersion #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 5
5
- TINY = 7
5
+ TINY = 8
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: rally_rest_api
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.5.7
7
- date: 2006-11-28 00:00:00 -07:00
6
+ version: 0.5.8
7
+ date: 2006-11-29 00:00:00 -07:00
8
8
  summary: A ruby-ized interface to Rally's REST webservices API
9
9
  require_paths:
10
10
  - lib