fatigue 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,23 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ fatigue (0.0.3)
5
+ mechanize (= 1.0.0)
6
+ nokogiri (>= 1.4.0)
7
+ ruby-progressbar (= 0.0.9)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ mechanize (1.0.0)
13
+ nokogiri (>= 1.2.1)
14
+ nokogiri (1.4.4)
15
+ rr (0.10.11)
16
+ ruby-progressbar (0.0.9)
17
+
18
+ PLATFORMS
19
+ ruby
20
+
21
+ DEPENDENCIES
22
+ fatigue!
23
+ rr (= 0.10.11)
data/fatigue.gemspec CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'fatigue'
16
- s.version = '0.0.3'
17
- s.date = '2010-12-02'
16
+ s.version = '0.0.4'
17
+ s.date = '2011-10-12'
18
18
  s.rubyforge_project = 'fatigue'
19
19
 
20
20
  ## Make sure your summary is short. The description may be as long
@@ -62,6 +62,8 @@ Gem::Specification.new do |s|
62
62
  ## THE MANIFEST COMMENTS, they are used as delimiters by the task.
63
63
  # = MANIFEST =
64
64
  s.files = %w[
65
+ Gemfile
66
+ Gemfile.lock
65
67
  Rakefile
66
68
  bin/fatigue
67
69
  fatigue.gemspec
data/lib/fatigue.rb CHANGED
@@ -8,5 +8,5 @@ require 'mechanize'
8
8
  require 'progressbar'
9
9
 
10
10
  module Fatigue
11
- VERSION = '0.0.3'
11
+ VERSION = '0.0.4'
12
12
  end
@@ -39,6 +39,25 @@ module Fatigue
39
39
  page.inspect =~ /aren't signed in/ ? true : false
40
40
  end
41
41
 
42
+ # Public: gets the number, time and date formats from the settings page
43
+ #
44
+ # IF the user has different settings from the default, the form may return
45
+ # errors when trying to post runs
46
+ #
47
+ def get_formats
48
+ page = @agent.get('http://connect.garmin.com/settings')
49
+ html = Nokogiri::HTML(page.body)
50
+ scr = html.css("script").select { |s| s.text =~ /(DATE_FORMAT)/ }.first.text
51
+
52
+ date_value = scr.match(/DATE_FORMAT = '(.+)'/)[1]
53
+ time_value = scr.match(/TIME_FORMAT = '(.+)'/)[1]
54
+ number_value = scr.match(/NUMBER_FORMAT = '(.+)'/)[1]
55
+
56
+ @date_format = date_value.gsub('yyyy', '%Y').gsub('dd', '%d').gsub('MM', '%m')
57
+ @time_format = (time_value == 'twenty_four' ? '%H:%M' : '%I:%M %p' )
58
+ @decimal_format = (number_value == 'decimal_comma' ? ',' : '.')
59
+ end
60
+
42
61
  # Public: posts a new Run to your logged-in Garmin account.
43
62
  #
44
63
  # run - A Fatigue::Run instance.
@@ -46,34 +65,43 @@ module Fatigue
46
65
  # Returns true if success, false if failure. Requires #login to be called
47
66
  # prior to execution.
48
67
  def post_run(run)
49
- manual_run = @agent.get('http://connect.garmin.com/activity/manual')
50
- form = manual_run.form('manualActivityForm')
51
- form.activityBeginDate = run.started_at.strftime('%m/%d/%Y')
52
- form.activityBeginTime = run.started_at.strftime('%I:%M %p')
53
- form.field_with(:name => 'activityTimeZoneDecoration:activityTimeZone').
54
- options.select { |option|
55
- # select option where our timezones are equal (-07:00, etc)
56
- zone = run.started_at.getlocal.strftime('%z').gsub('+','\+')
57
- option.text.gsub(':','') =~ /#{zone}/
58
- }.first.select
59
- form['activityNameDecoration:activityName'] = run.formatted_name
60
- form.field_with(:name => 'activityTypeDecoration:activityType').
61
- options.select { |option| option.value == 'running' }.
62
- first.select
63
- form['speedPaceContainer:activitySummarySumDuration'] = run.hours
64
- form['speedPaceContainer:activitySummarySumDurationMinute'] = run.minutes
65
- form['speedPaceContainer:activitySummarySumDurationSecond'] = run.seconds
66
- form['speedPaceContainer:activitySummarySumDistanceDecoration:activitySummarySumDistance'] = run.distance
67
- form.field_with(:name => 'speedPaceContainer:activitySummarySumDistanceDecoration:distanceUnit').
68
- options.select { |option| option.text == run.unit }.first.select
69
- form['descriptionDecoration:description'] = run.description
70
- form['calories'] = run.calories
71
- form['AJAXREQUEST'] = '_viewRoot'
72
- form['saveButton'] = 'saveButton'
68
+ begin
69
+ manual_run = @agent.get('http://connect.garmin.com/activity/manual')
70
+ form = manual_run.form('manualActivityForm')
71
+ form.activityBeginDate = run.started_at.strftime(@date_format)
72
+ form.activityBeginTime = run.started_at.strftime(@time_format)
73
+ form.field_with(:name => 'activityTimeZoneDecoration:activityTimeZone').
74
+ options.select { |option|
75
+ # select option where our timezones are equal (-07:00, etc)
76
+ zone = run.started_at.getlocal.strftime('%z').gsub('+','\+').gsub('0000', '\(GMT\)')
77
+ option.text.gsub(':','') =~ /#{zone}/
78
+ }.first.select
79
+ form['activityNameDecoration:activityName'] = run.formatted_name
80
+ form.field_with(:name => 'activityTypeDecoration:activityType').
81
+ options.select { |option| option.value == 'running' }.
82
+ first.select
83
+ form['speedPaceContainer:activitySummarySumDuration'] = run.hours
84
+ form['speedPaceContainer:activitySummarySumDurationMinute'] = run.minutes
85
+ form['speedPaceContainer:activitySummarySumDurationSecond'] = run.seconds
86
+ form['speedPaceContainer:activitySummarySumDistanceDecoration:activitySummarySumDistance'] = run.distance.to_s.gsub('.', @decimal_format)
87
+ form.field_with(:name => 'speedPaceContainer:activitySummarySumDistanceDecoration:distanceUnit').
88
+ options.select { |option| option.text == run.unit }.first.select
89
+ form['descriptionDecoration:description'] = run.description
90
+ form['calories'] = run.calories
91
+ form['AJAXREQUEST'] = '_viewRoot'
92
+ form['saveButton'] = 'saveButton'
73
93
 
74
- resp = @agent.submit(form, form.buttons_with(:name => 'saveButton').first)
75
-
76
- verify_response(resp.body)
94
+ resp = @agent.submit(form, form.buttons_with(:name => 'saveButton').first)
95
+ verify_response(resp.body)
96
+ rescue NoMethodError => e
97
+ puts "Darn!\nGarmin logged us out while attempting to post a run on #{run.started_at.strftime(@date_format)}. Logging back in!"
98
+ if login
99
+ post_run(run)
100
+ else
101
+ puts "Couldn't log back in. Aborting."
102
+ exit
103
+ end
104
+ end
77
105
  end
78
106
 
79
107
  # Public: Posts a collection of Runs to your logged-in Garmin account.
@@ -83,6 +111,7 @@ module Fatigue
83
111
  # Returns the number of runs successfully posted to the Garmin account.
84
112
  # Requires #login to be called prior to execution.
85
113
  def post_runs(runs)
114
+ get_formats
86
115
  progress = ProgressBar.new(" status", runs.size)
87
116
  runs.each do |run|
88
117
  post_run(run)
data/readme.markdown CHANGED
@@ -51,6 +51,11 @@ enter your Mac password when prompted. This will download the code to your
51
51
  machine. When it tells you "3 gems installed", type `fatigue` and enjoy the
52
52
  show.
53
53
 
54
+ NOTE: If you run into a problem during installation where it spits out `ERROR:
55
+ Failed to build gem native extension`, that means you need to install XCode.
56
+ It's available on your OS X install DVD or through the Mac App Store. We're
57
+ working on fixing this so you don't need to install XCode in the future.
58
+
54
59
  **For Windows Users**
55
60
 
56
61
  Microsoft makes everything harder since you'll have to install Ruby yourself.
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fatigue
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease: false
4
+ hash: 23
5
+ prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Zach Holman
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-02 00:00:00 -08:00
18
+ date: 2011-10-12 00:00:00 -07:00
19
19
  default_executable: fatigue
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -93,6 +93,8 @@ extensions: []
93
93
  extra_rdoc_files:
94
94
  - readme.markdown
95
95
  files:
96
+ - Gemfile
97
+ - Gemfile.lock
96
98
  - Rakefile
97
99
  - bin/fatigue
98
100
  - fatigue.gemspec
@@ -137,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
137
139
  requirements: []
138
140
 
139
141
  rubyforge_project: fatigue
140
- rubygems_version: 1.3.7
142
+ rubygems_version: 1.6.2
141
143
  signing_key:
142
144
  specification_version: 2
143
145
  summary: Import your Nike+ runs into Garmin Connect.