acuforce 0.3.0 → 0.4.0

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.
data/Gemfile CHANGED
@@ -3,7 +3,7 @@ source "http://rubygems.org"
3
3
  # Example:
4
4
  # gem "activesupport", ">= 2.3.5"
5
5
 
6
- #gem 'psych'
6
+ gem 'psych'
7
7
  gem 'mechanize'
8
8
 
9
9
  # Add dependencies to develop your gem here.
data/Rakefile CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'bundler'
5
+ require 'yaml'
6
+ YAML::ENGINE.yamler = 'syck'
5
7
  begin
6
8
  Bundler.setup(:default, :development)
7
9
  rescue Bundler::BundlerError => e
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
data/acuforce.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{acuforce}
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Harrison Strowd"]
12
- s.date = %q{2012-01-20}
12
+ s.date = %q{2012-02-11}
13
13
  s.description = %q{
14
14
  Provides an API for the following actions:
15
15
  * Logging in and Logging out
@@ -34,6 +34,7 @@ Provides an API for the following actions:
34
34
  "lib/acunote_connection.rb",
35
35
  "lib/acunote_project.rb",
36
36
  "lib/acunote_sprint.rb",
37
+ "lib/acunote_task.rb",
37
38
  "spec/acuforce_spec.rb",
38
39
  "spec/spec_helper.rb"
39
40
  ]
@@ -47,12 +48,14 @@ Provides an API for the following actions:
47
48
  s.specification_version = 3
48
49
 
49
50
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
+ s.add_runtime_dependency(%q<psych>, [">= 0"])
50
52
  s.add_runtime_dependency(%q<mechanize>, [">= 0"])
51
53
  s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
52
54
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
53
55
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
54
56
  s.add_development_dependency(%q<rcov>, [">= 0"])
55
57
  else
58
+ s.add_dependency(%q<psych>, [">= 0"])
56
59
  s.add_dependency(%q<mechanize>, [">= 0"])
57
60
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
58
61
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
@@ -60,6 +63,7 @@ Provides an API for the following actions:
60
63
  s.add_dependency(%q<rcov>, [">= 0"])
61
64
  end
62
65
  else
66
+ s.add_dependency(%q<psych>, [">= 0"])
63
67
  s.add_dependency(%q<mechanize>, [">= 0"])
64
68
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
65
69
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
data/lib/acuforce.rb CHANGED
@@ -10,6 +10,7 @@
10
10
  #Major modifications to transition from OmniPlan to Accunote
11
11
  #Notes there are a few gems required see directly below :)
12
12
 
13
+ require 'psych'
13
14
  require 'rubygems'
14
15
  require 'acunote_connection'
15
16
  require 'acunote_project'
@@ -19,6 +19,7 @@ class AcunoteConnection
19
19
 
20
20
  LOGIN_FIELDS = ['login[username]', 'login[password]'] unless defined? LOGIN_FIELDS
21
21
  LOGIN_FORM_NAME = "login_form" unless defined? LOGIN_FORM_NAME
22
+ DEBUG = false unless defined? DEBUG
22
23
 
23
24
  # The home_url must be set after the instance is first retrieved.
24
25
  def home_url
@@ -1,6 +1,6 @@
1
1
  require 'acunote_connection'
2
2
 
3
- # API for accessing Acunote projects.
3
+ # API for accessing Acunote sprints.
4
4
  class AcunoteSprint
5
5
  def self.acu_conn
6
6
  AcunoteConnection.instance
@@ -56,6 +56,35 @@ class AcunoteSprint
56
56
  sprints.links_with(:text => name).first if sprints
57
57
  end
58
58
 
59
+ # Note: This is extremely brittle to the structure of the acunote sprint page, but I
60
+ # couldn't find any other way to do it.
61
+ def self.find_task_id_by_name(proj_id, sprint_id, task_name)
62
+ sprint_page = acu_conn.get_page(url(proj_id,sprint_id)+'/show')
63
+ all_tasks = sprint_page.parser.search('span.descr_edit')
64
+ matches = all_tasks.select { |task_node| task_node.text.match(task_name) }
65
+ STDOUT.puts("Found #{all_tasks.size} tasks in this sprint. Out of those #{matches.size} matched the task name provided.") if DEBUG
66
+ if matches.size == 1
67
+ STDOUT.puts("Found match: #{matches[0]}") if DEBUG
68
+ prop = matches[0].search('span.task_properties')[0]
69
+ prop_id_str = prop.attribute('id').text
70
+ STDOUT.puts("Found a properties span with: #{prop_id_str}") if DEBUG
71
+ if prop_id_str =~ /^task_propertires_([0-9]*)$/
72
+ task_prop = $1
73
+ links = sprint_page.links_with(:id => "issue_number_for_#{task_prop}")
74
+ STDOUT.puts "Found the following links matching the property for this task: #{links.inspect}" if DEBUG
75
+ if links.size == 1
76
+ links[0].text
77
+ else
78
+ nil
79
+ end
80
+ else
81
+ nil
82
+ end
83
+ else
84
+ nil
85
+ end
86
+ end
87
+
59
88
  def self.upload_csv(proj_id, sprint_id, raw_data)
60
89
  import_page = acu_conn.get_page(url(proj_id,sprint_id)+"/import")
61
90
  import_form = import_page.form_with({:name => 'import_form'})
@@ -0,0 +1,23 @@
1
+ require 'acunote_connection'
2
+
3
+ # API for accessing Acunote tasks.
4
+ class AcunoteTask
5
+ def self.acu_conn
6
+ AcunoteConnection.instance
7
+ end
8
+
9
+ def self.url(proj_id, task_id)
10
+ "#{acu_conn.home_url}/projects/#{proj_id}/tasks/#{task_id}"
11
+ end
12
+
13
+ def self.mark_complete(proj_id, task_id)
14
+ task_page = acu_conn.get_page(url(proj_id,task_id))
15
+ if task_page.root.to_s =~ /FORM_AUTH_TOKEN = '(.*=)';/
16
+ form_auth_token = $1
17
+ acu_conn.mech.post("#{acu_conn.home_url}/issues/update", {'number'=>task_id,'field'=>'status','view'=>'task_details','value'=>'In Progress','old_value'=>'Not Started','authenticity_token'=>form_auth_token,'project_id'=>proj_id,'_method'=>'post'})
18
+ true
19
+ else
20
+ nil
21
+ end
22
+ end
23
+ end
metadata CHANGED
@@ -1,94 +1,100 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: acuforce
3
- version: !ruby/object:Gem::Version
4
- version: 0.3.0
3
+ version: !ruby/object:Gem::Version
5
4
  prerelease:
5
+ version: 0.4.0
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Harrison Strowd
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-20 00:00:00.000000000 -06:00
12
+
13
+ date: 2012-02-11 00:00:00 -06:00
13
14
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: psych
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
16
28
  name: mechanize
17
- requirement: &2173490020 !ruby/object:Gem::Requirement
29
+ requirement: &id002 !ruby/object:Gem::Requirement
18
30
  none: false
19
- requirements:
20
- - - ! '>='
21
- - !ruby/object:Gem::Version
22
- version: '0'
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
23
35
  type: :runtime
24
36
  prerelease: false
25
- version_requirements: *2173490020
26
- - !ruby/object:Gem::Dependency
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
27
39
  name: rspec
28
- requirement: &2173489540 !ruby/object:Gem::Requirement
40
+ requirement: &id003 !ruby/object:Gem::Requirement
29
41
  none: false
30
- requirements:
42
+ requirements:
31
43
  - - ~>
32
- - !ruby/object:Gem::Version
44
+ - !ruby/object:Gem::Version
33
45
  version: 2.3.0
34
46
  type: :development
35
47
  prerelease: false
36
- version_requirements: *2173489540
37
- - !ruby/object:Gem::Dependency
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
38
50
  name: bundler
39
- requirement: &2173489060 !ruby/object:Gem::Requirement
51
+ requirement: &id004 !ruby/object:Gem::Requirement
40
52
  none: false
41
- requirements:
53
+ requirements:
42
54
  - - ~>
43
- - !ruby/object:Gem::Version
55
+ - !ruby/object:Gem::Version
44
56
  version: 1.0.0
45
57
  type: :development
46
58
  prerelease: false
47
- version_requirements: *2173489060
48
- - !ruby/object:Gem::Dependency
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
49
61
  name: jeweler
50
- requirement: &2173488580 !ruby/object:Gem::Requirement
62
+ requirement: &id005 !ruby/object:Gem::Requirement
51
63
  none: false
52
- requirements:
64
+ requirements:
53
65
  - - ~>
54
- - !ruby/object:Gem::Version
66
+ - !ruby/object:Gem::Version
55
67
  version: 1.6.4
56
68
  type: :development
57
69
  prerelease: false
58
- version_requirements: *2173488580
59
- - !ruby/object:Gem::Dependency
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
60
72
  name: rcov
61
- requirement: &2173505220 !ruby/object:Gem::Requirement
73
+ requirement: &id006 !ruby/object:Gem::Requirement
62
74
  none: false
63
- requirements:
64
- - - ! '>='
65
- - !ruby/object:Gem::Version
66
- version: '0'
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
67
79
  type: :development
68
80
  prerelease: false
69
- version_requirements: *2173505220
70
- description: ! '
71
-
72
- Provides an API for the following actions:
73
-
74
- * Logging in and Logging out
75
-
76
- * Creating a sprint
77
-
78
- * Finding a sprint
79
-
80
- * Uploading tasks to a sprint from a CSV file
81
-
82
- * Exporting tasks in a sprint to a CSV file
83
-
84
- '
81
+ version_requirements: *id006
82
+ description: "\n\
83
+ Provides an API for the following actions:\n\
84
+ * Logging in and Logging out\n\
85
+ * Creating a sprint\n\
86
+ * Finding a sprint\n\
87
+ * Uploading tasks to a sprint from a CSV file\n\
88
+ * Exporting tasks in a sprint to a CSV file\n"
85
89
  email: hstrowd@gmail.com
86
90
  executables: []
91
+
87
92
  extensions: []
88
- extra_rdoc_files:
93
+
94
+ extra_rdoc_files:
89
95
  - LICENSE.txt
90
96
  - README.rdoc
91
- files:
97
+ files:
92
98
  - Gemfile
93
99
  - LICENSE.txt
94
100
  - README.rdoc
@@ -99,35 +105,39 @@ files:
99
105
  - lib/acunote_connection.rb
100
106
  - lib/acunote_project.rb
101
107
  - lib/acunote_sprint.rb
108
+ - lib/acunote_task.rb
102
109
  - spec/acuforce_spec.rb
103
110
  - spec/spec_helper.rb
104
111
  has_rdoc: true
105
112
  homepage: http://github.com/hstrowd/AcuForce
106
- licenses:
113
+ licenses:
107
114
  - MIT
108
115
  post_install_message:
109
116
  rdoc_options: []
110
- require_paths:
117
+
118
+ require_paths:
111
119
  - lib
112
- required_ruby_version: !ruby/object:Gem::Requirement
120
+ required_ruby_version: !ruby/object:Gem::Requirement
113
121
  none: false
114
- requirements:
115
- - - ! '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- segments:
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ hash: -616021078157183817
126
+ segments:
119
127
  - 0
120
- hash: 393877045666801415
121
- required_rubygems_version: !ruby/object:Gem::Requirement
128
+ version: "0"
129
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
130
  none: false
123
- requirements:
124
- - - ! '>='
125
- - !ruby/object:Gem::Version
126
- version: '0'
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: "0"
127
135
  requirements: []
136
+
128
137
  rubyforge_project:
129
138
  rubygems_version: 1.6.2
130
139
  signing_key:
131
140
  specification_version: 3
132
141
  summary: Client API for performing actions on an Acunote site.
133
142
  test_files: []
143
+