torque 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,7 +38,7 @@ class Torque
38
38
  ##
39
39
  # @param iterations A list of iterations
40
40
  #
41
- # Returns a list of iterations sorted from most to least recent
41
+ # @return A list of iterations sorted from most to least recent
42
42
  def self.sort_list(iterations)
43
43
  sorted = iterations.sort {|i1, i2| Integer(i2.number) - Integer(i1.number) }
44
44
  sorted
data/lib/torque/mailer.rb CHANGED
@@ -28,11 +28,6 @@ class Torque
28
28
  end
29
29
  end
30
30
 
31
- # ##
32
- # # Returns true if the email and password combination is valid, else false
33
- # def verify
34
- # end
35
-
36
31
  # @param notes_string The release notes file in string form
37
32
  # @param subject_line The subject line to use in the email
38
33
  # @param address_list A comma-separated list of email addresses to which to send the notes
@@ -13,7 +13,7 @@ class Torque
13
13
  end
14
14
 
15
15
  ##
16
- # Returns true if a connection to www.pivotaltracker.com exists, else false
16
+ # @return True if a connection to www.pivotaltracker.com exists, else false
17
17
  def self.connection?
18
18
  begin
19
19
  TCPSocket.new "www.pivotaltracker.com", 80
@@ -24,7 +24,7 @@ class Torque
24
24
  end
25
25
 
26
26
  ##
27
- # Returns true if the token supplied is a valid token, else false
27
+ # @return True if the token supplied is a valid token, else false
28
28
  def check_token
29
29
  begin
30
30
  get_project_data
@@ -35,9 +35,9 @@ class Torque
35
35
  end
36
36
 
37
37
  ##
38
- # Sends a request through the Pivotal Tracker API
38
+ # @return A string of html data from Pivotal Tracker with data on each of a user's projects
39
39
  #
40
- # Returns a string of html data from Pivotal Tracker with data on each of a user's projects
40
+ # Sends a request through the Pivotal Tracker API
41
41
  def get_project_data
42
42
 
43
43
  host="pivotaltracker.com"
@@ -66,9 +66,9 @@ class Torque
66
66
  ##
67
67
  # @param project The ID of the Pivotal Tracker project from which to get data
68
68
  #
69
- # Sends a request through the Pivotal Tracker API
69
+ # @return A string of html data from Pivotal Tracker with data on the stories for the given project
70
70
  #
71
- # Returns a string of html data from Pivotal Tracker with data on the stories for the given project
71
+ # Sends a request through the Pivotal Tracker API
72
72
  def get_project_stories(project)
73
73
 
74
74
  # Polls story data from pivotal tracker
@@ -103,9 +103,9 @@ class Torque
103
103
  # @param project The ID of the Pivotal Tracker project from which to get data
104
104
  # @param number The number of project iterations to fetch
105
105
  #
106
- # Sends a request throgh the Pivotal Tracker API
106
+ # @return A string of html data from Pivotal Tracker with data on finished iterations of a project
107
107
  #
108
- # Returns a string of html data from Pivotal Tracker with data on finished iterations of a project
108
+ # Sends a request throgh the Pivotal Tracker API
109
109
  def get_project_iterations(project, number=1)
110
110
 
111
111
  # Polls story data from pivotal tracker
@@ -38,7 +38,7 @@ class Torque
38
38
  ##
39
39
  # @param project_html_string An html string containing the story data for a Pivotal Tracker project
40
40
  #
41
- # Returns a list of all Story objects parsed from project_html_string (least recent to most recent date accepted)
41
+ # @return A list of all Story objects parsed from project_html_string (least recent to most recent date accepted)
42
42
  #
43
43
  # Applies during processing any filters that have been added
44
44
  def process_project(project_html_string)
@@ -51,7 +51,7 @@ class Torque
51
51
  ##
52
52
  # @param project_html_string An html string containing iteration data for a Pivotal Tracker project
53
53
  #
54
- # Returns a list of Iteration objects parsed from project_html_string (least recent to most recent iteration)
54
+ # @return A list of Iteration objects parsed from project_html_string (least recent to most recent iteration)
55
55
  def process_project_iterations(project_html_string)
56
56
 
57
57
  project_html = Nokogiri::HTML(project_html_string)
@@ -16,6 +16,10 @@ class Torque
16
16
  # The project name
17
17
  attr_reader :name
18
18
 
19
+ ##
20
+ # @param id The project's ID
21
+ # @param name The project's name
22
+ # @param current True if this is the current project, else false
19
23
  def initialize(id, name, current=false)
20
24
  @current = current
21
25
  @id = id
@@ -27,17 +27,16 @@ class Torque
27
27
 
28
28
  ##
29
29
  # @param token A Pivotal Tracker API token (default: Loads token from .torqueinfo.yaml)
30
+ # @return the project list
30
31
  #
31
32
  # Requests and processes the project list from the Pivotal Tracker API
32
- #
33
- # Returns the project list
34
33
  def load_project_list(token=nil)
35
34
  get_project_list(token)
36
35
  @project_list
37
36
  end
38
37
 
39
38
  ##
40
- # Returns the project list if 'load_project_list' has been called, else returns nil
39
+ # @return The project list if 'load_project_list' has been called, else returns nil
41
40
  #
42
41
  # Does not do any processing
43
42
  def project_list
@@ -45,7 +44,7 @@ class Torque
45
44
  end
46
45
 
47
46
  ##
48
- # Returns the current project if 'load_project_list' has been called and one exists, else returns nil
47
+ # @return The current project if 'load_project_list' has been called and one exists, else returns nil
49
48
  def current_project
50
49
  @project_list.nil? \
51
50
  ? nil
@@ -53,7 +52,7 @@ class Torque
53
52
  end
54
53
 
55
54
  ##
56
- # Formats the project list as a printable string
55
+ # @return The project list formatted as a printable string
57
56
  #
58
57
  # Prepends an asterisk to the current project
59
58
  def format_project_list
@@ -20,7 +20,7 @@ class Torque
20
20
  end
21
21
 
22
22
  ##
23
- # Returns the path to the record file, generating one if it does not exist
23
+ # @return The path to the record file, generating one if it does not exist
24
24
  def get_path
25
25
  generate_record_path if !@path
26
26
  @path
@@ -2,6 +2,7 @@ require 'date'
2
2
  require_relative 'date_settings'
3
3
  require_relative 'field_filter'
4
4
  require_relative 'file_system'
5
+ require_relative 'format_string'
5
6
  require_relative 'record_pathname_settings'
6
7
  require_relative 'torque_info_parser'
7
8
  require_relative 'error/missing_project_error'
@@ -62,6 +63,10 @@ class Torque
62
63
  # True if field filters are being used for stories, else false
63
64
  attr_reader :filters_on
64
65
 
66
+ ##
67
+ # The FormatString object to use to generate notes
68
+ attr_reader :format_string
69
+
65
70
  ##
66
71
  # The number of iterations of the project to generate notes for, or nil if not using iterations
67
72
  attr_reader :iterations
@@ -141,11 +146,23 @@ class Torque
141
146
 
142
147
  @email_address = torque_info.email_address
143
148
  @email_password = torque_info.email_password
144
- @email_to = torque_info.email_to
145
- @output_dir = torque_info.output_dir
149
+ email_to_raw = torque_info.email_to
150
+ format_string_raw = torque_info.format
151
+ output_dir_raw = torque_info.output_dir
146
152
  @project = torque_info.project
147
153
  @token = torque_info.token
148
154
 
155
+ if email_to_raw.class == NilClass; @email_to = []
156
+ elsif email_to_raw.class == String; @email_to = [email_to_raw]
157
+ elsif email_to_raw.class == Array; @email_to = email_to_raw
158
+ else; raise "Unknown parsing error on .torqueinfo.yaml's 'email_to' field: #{@email_to}"
159
+ end
160
+
161
+ @format_string = Torque::FormatString.new(format_string_raw)
162
+
163
+ output_dir_raw = "release_notes" if output_dir_raw.blank?
164
+ @output_dir = "#{@root_dir}/#{output_dir_raw}"
165
+
149
166
  raise MissingTokenError.new(
150
167
  "API token for Pivotal Tracker has not been set"
151
168
  ) if @token.blank?
@@ -153,15 +170,6 @@ class Torque
153
170
  "Project ID for Pivotal Tracker has not been set"
154
171
  ) if @project.blank?
155
172
 
156
- @output_dir = "release_notes" if @output_dir.blank?
157
- @output_dir = "#{@root_dir}/#{@output_dir}"
158
-
159
- if @email_to.class == NilClass; @email_to = []
160
- elsif @email_to.class == String; @email_to = [@email_to]
161
- elsif @email_to.class == Array; @email_to = @email_to
162
- else; raise "Unknown parsing error on .torqueinfo.yaml's 'email_to' field: #{@email_to}"
163
- end
164
-
165
173
  # Sets up the output directory, throwing an error if it cannot be found
166
174
 
167
175
  if !@fs.path_exist? @output_dir
data/lib/torque/story.rb CHANGED
@@ -6,48 +6,48 @@ class Torque
6
6
 
7
7
  ##
8
8
  # The current state of the story (finished, accepted, etc)
9
- attr_reader :current_state
9
+ attr_accessor :current_state
10
10
 
11
11
  ##
12
12
  # The date that the story was accepted, or nil if it has not been accepted yet
13
- attr_reader :date_accepted
13
+ attr_accessor :date_accepted
14
14
 
15
15
  ##
16
16
  # The story description
17
- attr_reader :description
17
+ attr_accessor :description
18
18
 
19
19
  ##
20
20
  # The estimate for the story
21
- attr_reader :estimate
21
+ attr_accessor :estimate
22
+
23
+ ##
24
+ # The story's ID
25
+ attr_accessor :id
22
26
 
23
27
  ##
24
28
  # The labels for the story
25
- attr_reader :labels
29
+ attr_accessor :labels
26
30
 
27
31
  ##
28
32
  # The name of the story
29
- attr_reader :name
33
+ attr_accessor :name
30
34
 
31
35
  ##
32
36
  # The owner of the story
33
- attr_reader :owner
37
+ attr_accessor :owner
34
38
 
35
39
  ##
36
40
  # The ID of the story's project
37
- attr_reader :project_id
38
-
39
- ##
40
- # The story's ID
41
- attr_reader :story_id
41
+ attr_accessor :project_id
42
42
 
43
43
  ##
44
44
  # The story's type (feature, chore, etc)
45
- attr_reader :type
45
+ attr_accessor :type
46
46
 
47
47
  ##
48
48
  # @param html_hash A hash (of html elements keyed by their tags) generated from Pivotal Tracker story html
49
49
  #
50
- # Returns a new story whose fields were parsed from the html_hash provided
50
+ # @return A new story whose fields were parsed from the html_hash provided
51
51
  def self.create(html_hash)
52
52
  Story.new(html_hash).parse
53
53
  end
@@ -67,25 +67,34 @@ class Torque
67
67
  end
68
68
  private :handle_nil
69
69
 
70
- # TODO Add an 'owner' field
70
+ ##
71
+ # @return The url pointing to the story
72
+ def url
73
+ "https://www.pivotaltracker.com/story/show/#{id}"
74
+ end
71
75
 
72
76
  ##
73
77
  # Parses the story's fields from its html hash
78
+ #
79
+ # @return The story (self)
74
80
  def parse
75
81
  html_hash = @html_hash
76
82
 
77
83
  # Default values
84
+
78
85
  @current_state = ""
79
- @date_accepted = nil # Will be a date
86
+ @date_accepted = nil # [Date]
80
87
  @description = ""
81
88
  @estimate = -1
82
- @labels = "" # Will be an array
89
+ @id = -1
90
+ @labels = "" # [Array]
83
91
  @name = ""
84
92
  @owner = ""
85
93
  @project_id = -1
86
- @story_id = -1
87
94
  @type = ""
88
95
 
96
+ # Processes each field
97
+
89
98
  @current_state = handle_nil(@current_state, html_hash["current_state"])
90
99
  @description = handle_nil(@description, html_hash["description"])
91
100
  @name = handle_nil(@name, html_hash["name"])
@@ -94,7 +103,7 @@ class Torque
94
103
 
95
104
  @estimate = Integer(handle_nil(@estimate, html_hash["estimate"]))
96
105
  @project_id = Integer(handle_nil(@project_id, html_hash["project_id"]))
97
- @story_id = Integer(handle_nil(@story_id, html_hash["id"]))
106
+ @id = Integer(handle_nil(@id, html_hash["id"]))
98
107
 
99
108
  @labels = handle_nil(@labels, html_hash["labels"])
100
109
  @labels = @labels.split(",")
@@ -104,12 +113,14 @@ class Torque
104
113
  @date_accepted = Date.strptime(date_acceptedString, "%Y/%m/%d")
105
114
  end
106
115
 
107
- # Returns the generated story
116
+ # Returns the parsed story
117
+
108
118
  self
109
119
  end
110
120
 
111
121
  ##
112
- # Sorts a list of stories so that the most recent come first
122
+ # @param stories A list of stories
123
+ # @return The list of stories sorted from most to least recently accepted
113
124
  def self.sort_list(stories)
114
125
  sorted = stories.sort { |s1, s2| -(s1.date_accepted <=> s2.date_accepted) }
115
126
  sorted
@@ -21,6 +21,10 @@ class Torque
21
21
  # The email_to field (String or Array)
22
22
  attr_reader :email_to
23
23
 
24
+ ##
25
+ # The format string to use for the project
26
+ attr_reader :format
27
+
24
28
  ##
25
29
  # The project field (Fixnum)
26
30
  attr_reader :project
@@ -45,9 +49,10 @@ class Torque
45
49
  end
46
50
 
47
51
  ##
52
+ # @return The TorqueInfoParser (self)
53
+ #
48
54
  # Parses the file, storing the results as public instnance fields
49
55
  # Stores each field with no corresponding value in the file as 'nil'
50
- # Returns self
51
56
  def parse
52
57
 
53
58
  if !@fs.path_exist?(@file_path)
@@ -59,12 +64,13 @@ class Torque
59
64
  begin
60
65
  torque_info_hash = YAML::load(@fs.file_read(@file_path)) || {}
61
66
  rescue Psych::SyntaxError
62
- # If cannot parse, ignore contents
67
+ # TODO Implement custom error, raise/rescue paths to catch this problem
63
68
  end
64
69
 
65
70
  @email_address = torque_info_hash["email_address"]
66
71
  @email_password = torque_info_hash["email_password"]
67
72
  @email_to = torque_info_hash["email_to"]
73
+ @format = torque_info_hash["format"]
68
74
  @project = torque_info_hash["project"]
69
75
  @output_dir = torque_info_hash["output_dir"]
70
76
  @token = torque_info_hash["token"]
@@ -73,7 +79,8 @@ class Torque
73
79
  end
74
80
 
75
81
  ##
76
- # Sets the specified field to the specified value in the file on disk
82
+ # @param field The field to set
83
+ # @param value The value to set the field to
77
84
  def set(field, value)
78
85
  file_string = @fs.file_read(@file_path)
79
86
  new_file_string = set_string(field, value, file_string)
@@ -81,7 +88,8 @@ class Torque
81
88
  end
82
89
 
83
90
  ##
84
- # Adds a list of values to a sequence belonging to field on disk
91
+ # @param field The field to add to
92
+ # @param values A list of values to add to the field
85
93
  def add(field, values)
86
94
  file_string = @fs.file_read(@file_path)
87
95
  new_file_string = add_string(field, values, file_string)
@@ -89,8 +97,10 @@ class Torque
89
97
  end
90
98
 
91
99
  ##
92
- # Adds a list of values to a sequence belonging to field, eliminating duplicates, on disk
93
- # Returns a list of all values that were added (were not duplicates)
100
+ # @param field The field to add to
101
+ # @param values A list of values to add to the field
102
+ #
103
+ # @return A list of all values that were added (ie that were not duplicates)
94
104
  def add_no_duplicates(field, values)
95
105
  file_string = @fs.file_read(@file_path)
96
106
  values_copy = values.clone
@@ -101,8 +111,10 @@ class Torque
101
111
  end
102
112
 
103
113
  ##
104
- # Removes a field to a sequence of values on disk
105
- # Returns a list of the values that were removed (could be found)
114
+ # @param field The field to remove from
115
+ # @param values A list of values to remove from the field
116
+ #
117
+ # @return A list of the values that were removed (ie that could be found)
106
118
  def rm(field, values)
107
119
  file_string = @fs.file_read(@file_path)
108
120
  values_copy = values.clone
@@ -15,7 +15,7 @@ class Torque
15
15
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
16
16
 
17
17
  ##
18
- # The string representing the current version of Torque (eg "1.9.2")
18
+ # @return A string representing the current version of Torque (eg "1.9.2")
19
19
  def self.string
20
20
  STRING
21
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: torque
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nico Adams, Scrimmage
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-08 00:00:00.000000000 Z
11
+ date: 2013-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -92,6 +92,7 @@ extra_rdoc_files:
92
92
  files:
93
93
  - bin/config
94
94
  - bin/email
95
+ - bin/format
95
96
  - bin/project
96
97
  - bin/torque
97
98
  - lib/torque/date_settings.rb
@@ -104,6 +105,7 @@ files:
104
105
  - lib/torque/error/pivotal_api_error.rb
105
106
  - lib/torque/field_filter.rb
106
107
  - lib/torque/file_system.rb
108
+ - lib/torque/format_string.rb
107
109
  - lib/torque/iteration.rb
108
110
  - lib/torque/mailer.rb
109
111
  - lib/torque/pivotal.rb