mingle4r 0.4.3 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,13 @@
1
+ 0.4.5
2
+ -----
3
+ * fixed card updation
4
+ * user type properties of a card can be set directly either by using the user name or the user id
5
+ * properties of type 'tree relationship' and 'Card' can be updated by giving a number
6
+
7
+ 0.4.4
8
+ -----
9
+ * more bug fixes
10
+
1
11
  0.4.3
2
12
  -----
3
13
  * Lots of bug fixes
data/README CHANGED
@@ -108,6 +108,34 @@ m_c.proj_id = 'great_mingle_project'
108
108
  card = m_c.project.cards[0]
109
109
  card.property_value('Status')
110
110
 
111
+ Setting a particular property
112
+ -----------------------------
113
+
114
+ sets the value of the property. The property name given should be the same as in Mingle.
115
+ Type, name and description should be set directly when creating or updating a card.
116
+ In case of a custom property use the following method. The value given should be one of
117
+ the values that Mingle accepts in case of a managed list
118
+
119
+ m_c = Mingle4r::MingleClient.new('http://localhost:8080', 'testuser', 'password')
120
+ m_c.proj_id = 'great_mingle_project'
121
+ defect_card = m_c.project.cards.first
122
+ defect_card.property_value('Status', 'Closed')
123
+ defect_card.save
124
+
125
+ In case of properties of type 'Tree Relatioship property' or 'Card'(properties which link
126
+ to another card) you can should set the property by giving the number of the card. For e.g.
127
+
128
+ story_card = m_c.projects.cards.find {|c| c.type == 'Story'}.first
129
+ story_card.property_value('Feature', 12)
130
+ story_card.save
131
+
132
+ In case of properties of type 'Team member' you can either use the user id (not the name or
133
+ the login id, you would have to look at the xml to get the id) or more simply the user name.
134
+ For e.g.
135
+
136
+ story_card.property_value('Assignee', 'James Bond')
137
+ story_card.save
138
+
111
139
  Creating a card
112
140
  ---------------
113
141
 
@@ -124,20 +152,6 @@ task = Mingle4r::API::new :name => 'set up Cruise build', :type => 'task',
124
152
  :description => 'a basic cruise build needs to be set up so that we can start working'
125
153
  task.save => It simply won't work, there is a workaround but rather use as described above.
126
154
 
127
- Setting a particular property
128
- -----------------------------
129
-
130
- sets the value of the property. The property name given should be the same as in Mingle.
131
- Type, name and description should be set directly when creating or updating a card.
132
- In case of a custom property use the following method. The value given should be one of
133
- the values that Mingle accepts in case of a managed list
134
-
135
- m_c = Mingle4r::MingleClient.new('http://localhost:8080', 'testuser', 'password')
136
- m_c.proj_id = 'great_mingle_project'
137
- defect_card = m_c.project.cards.first
138
- defect_card.property_value('Status', 'Closed')
139
- defect_card.save
140
-
141
155
  Adding comment to a particular card
142
156
  -----------------------------------
143
157
 
@@ -274,7 +288,7 @@ gem install mingle4r
274
288
 
275
289
  (The MIT License)
276
290
 
277
- Copyright (c) 2009 Arusarka Haldar
291
+ Copyright (c) 2010 Arusarka Haldar
278
292
 
279
293
  Permission is hereby granted, free of charge, to any person obtaining
280
294
  a copy of this software and associated documentation files (the
data/TODO.txt CHANGED
@@ -1,13 +1,15 @@
1
1
  will be fixed/implemented very soon
2
2
  -----------------------------------
3
3
 
4
- * fix updation of card properties
4
+ * write documentation about updating card properties of type 'Card', 'Tree Relationship property'
5
+ and 'Team member'
6
+ * complete manual QA to ensure/prioritize what needs to be done for card object
7
+ * performance fixes
5
8
 
6
9
  will be implemented, but not very important for now
7
10
  ----------------------------------------------------
8
11
 
9
12
  * update documentation - write about executing transitions directly on the transition
10
- * provide a helper method to link to a card
11
13
  * write tests for project class
12
14
  * implement card_types for a project
13
15
  * mingle client should have cards method
@@ -21,13 +21,8 @@ module Mingle4r
21
21
  end
22
22
 
23
23
  module InstanceMethods
24
- # so that active resource tries to find by number
25
- def id
26
- number()
27
- end
28
-
29
24
  def type
30
- card_type.name
25
+ attributes['card_type_name']
31
26
  end
32
27
 
33
28
  def type=(type)
@@ -112,7 +107,8 @@ EOS
112
107
  # as the mingle property name. the value is optional
113
108
  def property_value(name, val = nil)
114
109
  property = properties.detect { |p| p.name == name }
115
- val ? property.value = val : property.value
110
+ val ? set_prop_val(property, val) : property.value
111
+ # val ? property.value = val : property.value
116
112
  end
117
113
 
118
114
  # Gets the custom properties in the form of an array of hashes with the property names as keys and
@@ -121,9 +117,31 @@ EOS
121
117
  properties.map { |p| {p.name => p.value} }
122
118
  end
123
119
 
120
+ def encode(options = {})
121
+ options.merge! :root => 'card'
122
+ self.class.format.encode(attributes, options)
123
+ end
124
+
124
125
  private
126
+ def set_prop_val(prop, val)
127
+ val = find_user_id_with_name(val) if(prop.type_description == 'Automatically generated from the team list' && is_not_a_num?(val))
128
+ prop.value = val
129
+ end
130
+
131
+ def is_not_a_num?(val)
132
+ !(val.is_a?(Fixnum))
133
+ end
134
+
135
+ def find_user_id_with_name(name)
136
+ set_attributes_for(User)
137
+ users = User.find(:all)
138
+ user = users.detect { |mingle_user| mingle_user.user.name == name }
139
+ user.user.id
140
+ end
141
+
125
142
  def set_attributes_for(klass)
126
- resource_site = File.join(self.class.site.to_s, "cards/#{self.number()}").to_s
143
+ nested_resource_site = File.join(self.class.site.to_s, "cards/#{self.number()}").to_s
144
+ resource_site = (klass == User) ? self.class.site.to_s : nested_resource_site
127
145
  klass.site = resource_site
128
146
  klass.user = self.class.user
129
147
  klass.password = self.class.password
@@ -146,6 +164,19 @@ EOS
146
164
  return @transition_class_set unless val
147
165
  @transition_class_set = val
148
166
  end
167
+
168
+ def user_class_set(val = nil)
169
+ return @user_class_set unless val
170
+ @user_class_set = val
171
+ end
172
+ end
173
+
174
+ private
175
+ # post setup hook
176
+ def self.on_setup(klass)
177
+ klass.format = Mingle4r::CardFormat.new
178
+ klass.primary_key = 'number'
179
+ klass
149
180
  end
150
181
  end
151
182
  end
@@ -89,6 +89,11 @@ module Mingle4r
89
89
  end # module InstanceMethods
90
90
 
91
91
  extend Mingle4r::CommonClassMethods
92
+
93
+ private
94
+ def self.on_setup(klass)
95
+ klass.primary_key = 'identifier'
96
+ end
92
97
  end # class Project
93
98
  end # class API
94
99
  end
@@ -2,6 +2,11 @@ module Mingle4r
2
2
  module API
3
3
  class Wiki
4
4
  extend Mingle4r::CommonClassMethods
5
+
6
+ private
7
+ def self.on_setup(klass)
8
+ klass.primary_key = 'identifier'
9
+ end
5
10
  end
6
11
  end
7
12
  end
@@ -9,10 +9,13 @@ module Mingle4r
9
9
  end
10
10
 
11
11
  def decode(xml)
12
- from_xml_data(Hash.from_xml(xml))
12
+ data = from_xml_data(Hash.from_xml(xml))
13
+ convert_properties(data)
14
+ data
13
15
  end
14
16
 
15
17
  def encode(hash, options={})
18
+ options.merge! :dasherize => false
16
19
  hash.to_xml(options)
17
20
  end
18
21
 
@@ -24,5 +27,61 @@ module Mingle4r
24
27
  data
25
28
  end
26
29
  end
30
+
31
+ def convert_properties(data)
32
+ types_to_convert = ['Any card used in tree', 'Card',
33
+ 'Automatically generated from the team list']
34
+ types_to_convert.each { |type| convert_prop_tags_of_type(type, data)}
35
+ convert_card_type_tag(data)
36
+ end
37
+
38
+ def for_every_card_in(data, &block)
39
+ if data.is_a?(Hash)
40
+ block.call(data)
41
+ else
42
+ data.collect! { |card| block.call(card) }
43
+ end
44
+ end
45
+
46
+ def convert_prop_tags_of_type(type, data)
47
+ for_every_card_in(data) { |card| convert_card_for_prop_tags_of_type(card, type) }
48
+ end
49
+
50
+ def convert_card_for_prop_tags_of_type(card, type)
51
+ return card unless card['properties']
52
+ card['properties'].collect! do |prop|
53
+ convert_prop(prop) if (prop_is_of_type?(prop, type))
54
+ prop
55
+ end
56
+ card
57
+ end
58
+
59
+ def convert_prop(prop)
60
+ if prop_is_of_type?(prop, 'Automatically generated from the team list')
61
+ prop = convert_team_member_prop(prop)
62
+ else
63
+ prop['value'] = prop['value']['number'] if prop['value']
64
+ end
65
+ prop
66
+ end
67
+
68
+ def convert_team_member_prop(prop)
69
+ return prop unless prop['value']
70
+ url = prop['value']['url']
71
+ prop['value'] = File.basename(url).gsub('.xml', '').to_i
72
+ prop
73
+ end
74
+
75
+ def prop_is_of_type?(prop, type)
76
+ prop['type_description'] == type
77
+ end
78
+
79
+ def convert_card_type_tag(data)
80
+ for_every_card_in(data) do |card|
81
+ card_type = card.delete('card_type')
82
+ card['card_type_name'] = card_type['name']
83
+ card
84
+ end
85
+ end
27
86
  end
28
87
  end
@@ -88,10 +88,11 @@ module Mingle4r
88
88
  end
89
89
 
90
90
  def setup_class(klass)
91
- set_resource_options(klass)
91
+ set_resource_attributes(klass)
92
92
  set_class_name(klass)
93
93
  include_instance_methods(klass)
94
94
  include_singleton_methods(klass)
95
+ on_setup(klass) if(respond_to?('on_setup'))
95
96
  end
96
97
 
97
98
  def include_singleton_methods(klass)
@@ -108,7 +109,7 @@ module Mingle4r
108
109
  klass
109
110
  end
110
111
 
111
- def set_resource_options(klass)
112
+ def set_resource_attributes(klass)
112
113
  klass.site = self.site
113
114
  klass.user = self.user
114
115
  klass.password = self.password
@@ -130,7 +131,7 @@ module Mingle4r
130
131
  end
131
132
 
132
133
  def method_missing(meth_id, *args, &block)
133
- raise ResourceNotSetup.new("Site is not set for #{name}. Please set it.") unless @resource_class
134
+ raise ResourceNotSetup.new("Site not set for #{name}.") unless @resource_class
134
135
  @resource_class.send(meth_id.to_sym, *args, &block)
135
136
  end
136
137
  end
@@ -2,7 +2,7 @@ module Mingle4r
2
2
  module Version
3
3
  Major = '0'
4
4
  Minor = '4'
5
- Tiny = '3'
5
+ Tiny = '5'
6
6
 
7
7
  def self.to_s
8
8
  Major + '.' + Minor + '.' + Tiny
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mingle4r
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 5
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 3
10
- version: 0.4.3
9
+ - 5
10
+ version: 0.4.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - asur
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-05-24 00:00:00 +05:30
18
+ date: 2010-06-02 00:00:00 +05:30
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: "0"
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
- description: " A connector wrapper for connecting to Mingle(http://studios.thoughtworks.com/mingle-agile-project-management).\n It uses active resource to handle the restful connections to Mingle. Makes the job of connecting to Mingle a \n lot easier. Also since it uses lazy evaluation, resources are fetched only when they are requested.\n"
35
+ description: " A wrapper connector for connecting to Mingle(http://studios.thoughtworks.com/mingle-agile-project-management).\n It uses active resource to handle the restful connections to Mingle. Makes the job of connecting to Mingle a \n lot easier.\n"
36
36
  email: arusarka@gmail.com
37
37
  executables: []
38
38