liftapp-client 0.0.2 → 0.0.3

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/README.md CHANGED
@@ -1,7 +1,9 @@
1
- # Liftapp::Client
1
+ # Liftapp::Client [![Build Status](https://travis-ci.org/jmaddi/liftapp-client.png)](https://travis-ci.org/jmaddi/liftapp-client)
2
2
 
3
3
  Ruby library to access the Lift.do API. Since there is not yet an official API, this library uses the undocumented mobile app API.
4
4
 
5
+ For an example of what you can build, see http://lift-export.herokuapp.com/
6
+
5
7
  ## Installation
6
8
 
7
9
  Add this line to your application's Gemfile:
@@ -20,24 +22,41 @@ Or install it yourself as:
20
22
 
21
23
  ##### Request your profile_hash
22
24
  ```ruby
23
- client = Liftapp::Client.new(email: 'neo@matrix.com', password: 'whiterabbit')
24
- data = client.login()
25
- puts data['profile_hash']
25
+ # Log in with your email/password
26
+ client = Liftapp::Client.new('neo@matrix.com', 'whiterabbit')
27
+ puts client.profile_hash
26
28
  ```
27
29
 
28
30
  ##### Request your subscribed habits
29
31
  ```ruby
30
- client = Liftapp::Client.new(email: 'neo@matrix.com', password: 'whiterabbit')
32
+ client = Liftapp::Client.new('neo@matrix.com', 'whiterabbit')
31
33
  data = client.dashboard
32
- puts data['subscriptions'].inspect
34
+ data['subscriptions'].each do |subscription|
35
+ puts subscription['habit']['name'] + ": " + subscription['habit']['id'].to_s
36
+ end
37
+
38
+ Nightly survey: 75655
39
+ Write: 3280
40
+ Test Lift: 2111
41
+ Keep in touch with friends: 2829
42
+ Organize social event: 71452
33
43
  ```
34
44
 
35
45
  ##### Request checkin data for your habit
36
46
  ```ruby
37
- client = Liftapp::Client.new(profile_hash: 'e7fcd2db926273e895ef')
47
+ client = Liftapp::Client.new('neo@matrix.com', 'whiterabbit')
38
48
  data = client.checkin_data('3280')
39
- puts data[:checkins].inspect
40
- puts data[:'habit-name']
49
+ puts data['checkins'].inspect
50
+ puts data['habit-name']
51
+ ```
52
+
53
+ ##### Checkin to a habit
54
+ ```ruby
55
+ client = Liftapp::Client.new('neo@matrix.com', 'whiterabbit')
56
+ data = client.dashboard
57
+ puts data['subscriptions'][1]['habit']['name']
58
+ habit_id = data['subscriptions'][0]['habit']['id']
59
+ client.checkin(habit_id)
41
60
  ```
42
61
 
43
62
 
data/Rakefile CHANGED
@@ -1,2 +1,7 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
+ require "rspec/core/rake_task"
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default => :spec
@@ -1,3 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gem 'sinatra'
4
+ gem 'coffee-script'
5
+ gem 'liftapp-client', '0.0.2'
6
+ gem 'haml'
@@ -1,4 +1,5 @@
1
1
  require 'sinatra'
2
+ require 'haml'
2
3
  require 'coffee-script'
3
4
  require 'liftapp-client'
4
5
 
@@ -20,8 +21,8 @@ get '/checkins/:user/:habit' do
20
21
  content_type :plain
21
22
  client = Liftapp::Client.new(profile_hash: params[:user])
22
23
  data = client.checkin_data(params[:habit])
23
- output = data[:checkins].map { |d| d.strftime('%Y-%m-%d') }
24
- output.unshift data[:'habit-name']
24
+ output = data['checkins'].map { |d| d.strftime('%Y-%m-%d') }
25
+ output.unshift data['habit-name']
25
26
  output.join("\n")
26
27
  end
27
28
 
@@ -1,5 +1,5 @@
1
1
  module Liftapp
2
2
  class Client
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -1,38 +1,48 @@
1
1
  require 'httparty'
2
2
  require 'json'
3
3
  require 'nokogiri'
4
+ require 'date'
5
+ require 'pry'
4
6
 
5
7
  require "liftapp-client/version"
6
8
 
7
9
  module Liftapp
10
+
8
11
  class Client
9
12
  attr_accessor :profile_hash
10
13
 
11
- def initialize(args)
12
- @email = args[:email] if args[:email]
13
- @password = args[:password] if args[:password]
14
- @profile_hash = args[:profile_hash] if args[:profile_hash]
15
- if (@email && @password)
16
- @auth_options = {basic_auth: {username: @email, password: @password}}
17
- end
18
- end
14
+ def initialize(email, password)
15
+ @user_agent = 'Lift/0.27.1779 CFNetwork/609.1.4 Darwin/13.0.0'
19
16
 
20
- def login
21
- response = HTTParty.get('https://www.lift.do/i/0/users/current', @auth_options)
17
+ @auth_options = {basic_auth: {username: email, password: password}}
18
+
19
+ @options = {}
20
+ @options.merge!(@auth_options)
21
+ @options.merge!({headers: {'User-Agent' => @user_agent}})
22
+
23
+ response = HTTParty.get('https://www.lift.do/i/0/users/current', @options)
22
24
  @profile_hash = response['profile_hash']
23
- response
24
25
  end
25
26
 
26
27
  def dashboard
27
- HTTParty.get('https://www.lift.do/api/v2/dashboard', @auth_options)
28
+ HTTParty.get('https://www.lift.do/api/v2/dashboard', @options)
29
+ end
30
+
31
+ def checkin(habit_id, time=DateTime.now)
32
+ data = {body: {habit_id: habit_id, date: time.to_s}}
33
+ HTTParty.post('https://www.lift.do/api/v1/checkins', @options.merge(data))
34
+ end
35
+
36
+ def checkout(checkin_id)
37
+ HTTParty.delete('https://www.lift.do/api/v1/checkins/%d' % checkin_id)
28
38
  end
29
39
 
30
40
  def habit_activity(habit_id)
31
- HTTParty.get('https://www.lift.do/api/v2/habits/' + habit_id + '/activity', @auth_options)
41
+ HTTParty.get('https://www.lift.do/api/v2/habits/%d/activity' % habit_id, @options)
32
42
  end
33
43
 
34
44
  def checkin_data(habit_id)
35
- response = HTTParty.get('https://www.lift.do/users/' + @profile_hash + '/' + habit_id)
45
+ response = HTTParty.get('https://www.lift.do/users/%s/%d' % [@profile_hash, habit_id])
36
46
 
37
47
  doc = Nokogiri::HTML(response.body)
38
48
 
@@ -49,14 +59,10 @@ module Liftapp
49
59
  end
50
60
  end
51
61
  {
52
- :'habit-name' => doc.search('.profile-habit-name').first.content,
53
- :checkins => checkins.sort
62
+ 'habit-name' => doc.search('.profile-habit-name').first.content,
63
+ 'checkins' => checkins.sort
54
64
  }
55
65
  end
56
-
57
- def to_s
58
- "Liftapp (#@email)"
59
- end
60
-
61
66
  end
67
+
62
68
  end
@@ -17,5 +17,8 @@ Gem::Specification.new do |gem|
17
17
 
18
18
  gem.add_dependency 'httparty'
19
19
  gem.add_dependency 'nokogiri'
20
- gem.add_dependency 'webmock'
20
+
21
+ gem.add_development_dependency 'webmock'
22
+ gem.add_development_dependency 'rake'
23
+ gem.add_development_dependency 'rspec'
21
24
  end
data/spec/lift_spec.rb CHANGED
@@ -7,27 +7,41 @@ describe Liftapp::Client do
7
7
  stub_request(:get, "https://neo@matrix.com:whiterabbit@www.lift.do/i/0/users/current").
8
8
  to_return(File.new(File.expand_path File.dirname(__FILE__) + '/fixtures/current'))
9
9
 
10
- client = Liftapp::Client.new(email: 'neo@matrix.com', password: 'whiterabbit')
11
- expect(client.login['profile_hash']).to eq 'e7fcd2db926273e895ef'
10
+ client = Liftapp::Client.new('neo@matrix.com', 'whiterabbit')
12
11
  expect(client.profile_hash).to eq 'e7fcd2db926273e895ef'
13
12
  end
14
13
 
15
14
  it 'returns habit list' do
15
+ stub_request(:get, "https://neo@matrix.com:whiterabbit@www.lift.do/i/0/users/current").
16
+ to_return(File.new(File.expand_path File.dirname(__FILE__) + '/fixtures/current'))
16
17
  stub_request(:get, "https://neo@matrix.com:whiterabbit@www.lift.do/api/v2/dashboard").
17
18
  to_return(File.new(File.expand_path File.dirname(__FILE__) + '/fixtures/dashboard'))
18
19
 
19
- client = Liftapp::Client.new(email: 'neo@matrix.com', password: 'whiterabbit')
20
+ client = Liftapp::Client.new('neo@matrix.com', 'whiterabbit')
20
21
  expect(client.dashboard['subscriptions'].length).to eq 7
21
22
  end
22
23
 
23
24
  it 'returns checkin data' do
25
+ stub_request(:get, "https://neo@matrix.com:whiterabbit@www.lift.do/i/0/users/current").
26
+ to_return(File.new(File.expand_path File.dirname(__FILE__) + '/fixtures/current'))
24
27
  stub_request(:get, "https://www.lift.do/users/e7fcd2db926273e895ef/3280").
25
28
  to_return(File.new(File.expand_path File.dirname(__FILE__) + '/fixtures/3280'))
26
29
 
27
- client = Liftapp::Client.new(profile_hash: 'e7fcd2db926273e895ef')
30
+ client = Liftapp::Client.new('neo@matrix.com', 'whiterabbit')
28
31
  data = client.checkin_data('3280')
29
- data[:checkins].length.should be > 10
30
- data[:'habit-name'].should eq 'Write'
32
+ data['checkins'].length.should be > 10
33
+ data['habit-name'].should eq 'Write'
34
+ end
35
+
36
+ it 'returns successful checkin' do
37
+ stub_request(:get, "https://neo@matrix.com:whiterabbit@www.lift.do/i/0/users/current").
38
+ to_return(File.new(File.expand_path File.dirname(__FILE__) + '/fixtures/current'))
39
+ stub_request(:post, 'https://neo@matrix.com:whiterabbit@www.lift.do/api/v1/checkins').
40
+ to_return(File.new(File.expand_path File.dirname(__FILE__) + '/fixtures/checkin'))
41
+
42
+ client = Liftapp::Client.new('neo@matrix.com', 'whiterabbit')
43
+ data = client.checkin('2111')
44
+ data['checkin']['id'].should be > 0
31
45
  end
32
46
 
33
47
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liftapp-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-15 00:00:00.000000000 Z
12
+ date: 2013-02-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: httparty
@@ -51,7 +51,39 @@ dependencies:
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
- type: :runtime
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rake
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
55
87
  prerelease: false
56
88
  version_requirements: !ruby/object:Gem::Requirement
57
89
  none: false
@@ -104,12 +136,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
136
  - - ! '>='
105
137
  - !ruby/object:Gem::Version
106
138
  version: '0'
139
+ segments:
140
+ - 0
141
+ hash: -3304321220084016818
107
142
  required_rubygems_version: !ruby/object:Gem::Requirement
108
143
  none: false
109
144
  requirements:
110
145
  - - ! '>='
111
146
  - !ruby/object:Gem::Version
112
147
  version: '0'
148
+ segments:
149
+ - 0
150
+ hash: -3304321220084016818
113
151
  requirements: []
114
152
  rubyforge_project:
115
153
  rubygems_version: 1.8.21