phone_gap-build 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eecaeb180ecb3f2c04f9dce4badb7857f7fe728d
4
- data.tar.gz: d9d37fdebe1f87bb45ad18c4fd2a1cccec011b66
3
+ metadata.gz: 12844dadae8e2b81b176ddcf2d7b3f28d18403b9
4
+ data.tar.gz: 0593bbe7132d9c502057e7d2a5bdbc046f8d68c5
5
5
  SHA512:
6
- metadata.gz: 8b794e509e9ef17ac0a028e21506fb4c7097c4a43fadc8b65472fbd5443ed9b87ec8ab0e9514e5292767c828603e71f89870061de5d4421298a630cdf8bbf883
7
- data.tar.gz: 9cbf50b934de26a896352d6a0b479f60872ae942ff2cb9dd374c86f8530555b8d2ddcb5f5a392e37cc178cc988ef6fdd34f7b9a00d84023555deb473a7ff375d
6
+ metadata.gz: 7baeb0e1accd202d53dd2f1f143fffc27b27801a38f7df9d9e81fabf731141f1e54702fb6afbe59edd547cde74594c628c7220fab186a95310bf0ded95e00e9f
7
+ data.tar.gz: b66b04811b0acbd665c740b60ec5048e8027349d0d72ef6c7eaf8617c269c5d31a38d9ebbd278bc9878db918f78fe5041f83f6c1dc97a46da61ae483a10e95c3
data/README.md CHANGED
@@ -26,8 +26,12 @@ Or install it yourself as:
26
26
 
27
27
  require 'phone_gap/build'
28
28
 
29
+ # manually set your api credentials
29
30
  PhoneGap::Build.credentials(token: 'my_api_token')
30
31
 
32
+ # credentials are autoloaded from config/phonegap.yml if it exists
33
+
34
+ # set what apps you got
31
35
  apps = PhoneGap::Build.apps
32
36
 
33
37
  # update an existing app
@@ -46,6 +50,12 @@ Or install it yourself as:
46
50
  # save/create the app
47
51
  app.save
48
52
 
53
+ # build the app
54
+ app.build
55
+
56
+ # check if the build is complete
57
+ app.build_complete?
58
+
49
59
  # delete it!
50
60
  app.destroy
51
61
 
@@ -27,6 +27,26 @@ module PhoneGap
27
27
  def build
28
28
  ApiRequest.new.post("#{PATH}/#{id}/build")
29
29
  end
30
+
31
+ def build_complete?(params = {})
32
+ complete = false
33
+ error = false
34
+ start_time = Time.now
35
+ time_limit = start_time + (params[:poll_time_limit] || poll_time_limit)
36
+ while !complete && (Time.now < time_limit) && !error
37
+ response = ApiRequest.new.get("#{PATH}/#{id}")
38
+ if response.success?
39
+ json_object = JSON.parse(response.body)
40
+ complete = json_object['status'].all? { |platform, status| status == 'complete' }
41
+ error = json_object['status'].any? { |platform, status| status == 'error' }
42
+ end
43
+ sleep (params[:poll_interval] || poll_interval) unless complete or error
44
+ end
45
+ raise BuildError.new('An error occurred building at least one of the apps.') if error
46
+ complete
47
+ end
30
48
  end
49
+
50
+ class BuildError < Exception ; end
31
51
  end
32
- end
52
+ end
@@ -1,4 +1,5 @@
1
1
  require 'phone_gap/build/creatable'
2
+ require 'phone_gap/build/base'
2
3
 
3
4
  module PhoneGap
4
5
  module Build
@@ -6,13 +7,24 @@ module PhoneGap
6
7
 
7
8
  include PhoneGap::Build::Creatable
8
9
  attr_reader :id
10
+ attr_accessor :poll_time_limit, :poll_interval
11
+ attr_writer :errors
12
+
13
+ def initialize(params = {})
14
+ @poll_time_limit = 120
15
+ @poll_interval = 5
16
+ super(params)
17
+ end
9
18
 
10
19
  def create
11
20
  response = ApiRequest.new.post(path, post_options)
12
21
  if response.success?
13
22
  populate_from_json(JSON.parse(response.body))
23
+ self
24
+ else
25
+ update_errors(JSON.parse(response.body))
26
+ false
14
27
  end
15
- self
16
28
  end
17
29
 
18
30
  def update
@@ -39,6 +51,10 @@ module PhoneGap
39
51
  params[:remove_nils] ? json.delete_if {|k, v| v.nil? } : json
40
52
  end
41
53
 
54
+ def errors
55
+ @errors ||= []
56
+ end
57
+
42
58
  private
43
59
 
44
60
  def post_options
@@ -62,6 +78,10 @@ module PhoneGap
62
78
  end
63
79
  end
64
80
  end
81
+
82
+ def update_errors(json)
83
+ errors << json['error']
84
+ end
65
85
  end
66
86
  end
67
87
  end
@@ -1,5 +1,5 @@
1
1
  module PhoneGap
2
2
  module Build
3
- VERSION = '0.4.0'
3
+ VERSION = '0.5.0'
4
4
  end
5
5
  end
@@ -0,0 +1,52 @@
1
+ {
2
+ "title": "PhoneGap: Getting Started",
3
+ "id": 2,
4
+ "package": "com.phonegap.getting.started",
5
+ "version": "1.0.0",
6
+ "repo": "https://github.com/phonegap/phonegap-start.git",
7
+ "description": "A template for getting started with PhoneGap development and build.phonegap.com",
8
+ "debug": false,
9
+ "private": true,
10
+ "link": "/api/v1/apps/2",
11
+ "build_count": 12,
12
+ "status": {
13
+ "android": "complete",
14
+ "ios": "complete",
15
+ "winphone": "complete"
16
+ },
17
+ "download": {
18
+ "android": "/api/v1/apps/1/android",
19
+ "ios": "/api/v1/apps/1/ios",
20
+ "winphone": "/api/v1/apps/1/winphone"
21
+ },
22
+ "error": {},
23
+ "icon": {
24
+ "filename": "big-icon.png",
25
+ "link": "/api/v1/apps/2/icon"
26
+ },
27
+ "role": "admin",
28
+ "keys": {},
29
+ "collaborators": {
30
+ "link": "/api/v1/apps/9/collaborators",
31
+ "active": [
32
+ {
33
+ "id": 9,
34
+ "person": "andrew.lunny@nitobi.com",
35
+ "role": "admin",
36
+ "link": "/api/v1/apps/9/collaborators/9"
37
+ },
38
+ {
39
+ "id": 13,
40
+ "person": "foo@bar.com",
41
+ "role": "developer",
42
+ "link": "/api/v1/apps/9/collaborators/13"
43
+ }
44
+ ],
45
+ "pending": [
46
+ {
47
+ "person": "nobody@nitobi.com",
48
+ "role": "tester"
49
+ }
50
+ ]
51
+ }
52
+ }
@@ -2,6 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  describe PhoneGap::Build::App do
4
4
 
5
+ let(:api_request) { double('PhoneGap::Build::ApiRequest') }
6
+
7
+ before do
8
+ PhoneGap::Build::ApiRequest.stub(:new).and_return api_request
9
+ end
10
+
5
11
  it 'has a PATH of "apps"' do
6
12
  expect(subject.class.const_get('PATH')).to eq '/apps'
7
13
  end
@@ -30,8 +36,8 @@ describe PhoneGap::Build::App do
30
36
 
31
37
  describe '#create' do
32
38
 
33
- let(:response) { double('response', :success? => false) }
34
39
  let(:api_request) { double('PhoneGap::Build::ApiRequest') }
40
+ let(:response) { double('response', :success? => false, body: '{"key":"value"}') }
35
41
 
36
42
  context 'when there are populated and non-populated creatable variables' do
37
43
 
@@ -66,16 +72,94 @@ describe PhoneGap::Build::App do
66
72
  end
67
73
  end
68
74
 
69
- describe '#build' do
75
+ context 'for an existing app' do
76
+
77
+ let(:id) { '1' }
78
+
79
+ before do
80
+ subject.instance_variable_set('@id',id)
81
+ end
82
+
83
+ describe '#build' do
84
+
85
+ context 'when the app has an id' do
86
+
87
+ let(:id) { 1 }
88
+ let(:api_request) { double('PhoneGap::Build::ApiRequest') }
89
+
90
+ before do
91
+ subject.instance_variable_set('@id', id)
92
+ end
93
+
94
+ it 'sends a POST request to build the app' do
95
+ expect(api_request).to receive(:post).with("/apps/#{subject.id}/build")
96
+ subject.build
97
+ end
98
+ end
99
+ end
70
100
 
71
- context 'when the app has an id' do
101
+ describe '#build_complete?' do
72
102
 
73
- let(:id) { 1 }
74
- let(:api_request) { double('PhoneGap::Build::ApiRequest') }
103
+ let(:http_response) { double('http response', success?: false) }
75
104
 
76
105
  before do
77
- subject.instance_variable_set('@id', id)
78
- PhoneGap::Build::ApiRequest.stub(:new).and_return api_request
106
+ api_request.stub(:get).with("/apps/#{id}").and_return http_response
107
+ subject.poll_time_limit = 0.1
108
+ subject.poll_interval = 0
109
+ end
110
+
111
+ it 'polls the api to see if the app has finished building' do
112
+ expect(api_request).to receive(:get).with("/apps/#{id}").and_return http_response
113
+ subject.build_complete?
114
+ end
115
+
116
+ context 'with a poll interval of 0.09 second' do
117
+
118
+ before do
119
+ subject.poll_interval = 0.09
120
+ end
121
+
122
+ context 'when not given a time limit' do
123
+
124
+ context 'with a poll interval of 0.1 seconds' do
125
+
126
+ before do
127
+ subject.poll_interval = 0.1
128
+ end
129
+
130
+ it 'checks every 0.09 seconds until the default time limit is exceeded' do
131
+ subject.poll_time_limit = 0.09
132
+ expect(api_request).to receive(:get).with("/apps/#{id}").exactly(1).times
133
+ subject.build_complete?
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'when supplied with a time limit' do
139
+
140
+ it 'checks every 0.1 seconds until the supplied time limit has exceeded' do
141
+ expect(api_request).to receive(:get).with("/apps/#{id}").exactly(1).times
142
+ subject.build_complete?(poll_time_limit: 0.09)
143
+ end
144
+
145
+ end
146
+ context 'when the build is complete' do
147
+
148
+ let(:http_response) { double('http response', success?: true, body: response_body_for('get-app') ) }
149
+
150
+ it 'returns true' do
151
+ expect(subject.build_complete?).to be_true
152
+ end
153
+ end
154
+
155
+ context 'when there was an error building' do
156
+
157
+ let(:http_response) { double('http response', success?: true, body: '{"status": { "ios": "error"}}') }
158
+
159
+ it 'returns throws an exception' do
160
+ expect{subject.build_complete?}.to raise_error PhoneGap::Build::BuildError
161
+ end
162
+ end
79
163
  end
80
164
 
81
165
  it 'sends a POST request to build the app' do
@@ -9,6 +9,14 @@ describe PhoneGap::Build::RestResource do
9
9
  PhoneGap::Build::ApiRequest.stub(:new).and_return api_request
10
10
  end
11
11
 
12
+ it 'has a default poll_time_limit of 120' do
13
+ expect(subject.poll_time_limit).to eq 120
14
+ end
15
+
16
+ it 'has a default poll_interval of 5' do
17
+ expect(subject.poll_interval).to eq 5
18
+ end
19
+
12
20
  context 'when an authentication token is present' do
13
21
 
14
22
  let(:token) { 'BATMAN' }
@@ -31,10 +39,10 @@ describe PhoneGap::Build::RestResource do
31
39
 
32
40
  describe '#create' do
33
41
 
34
- let(:response) { double('response', success?: false) }
42
+ let(:response) { double('response', success?: false, body: '{"key": "value"}') }
35
43
 
36
44
  before do
37
- # api_request.stub(:post).with('users', query: {data: subject.as_json}).and_return response
45
+ api_request.stub(:post).with('users', query: {data: subject.as_json}).and_return response
38
46
  end
39
47
 
40
48
  it 'sends POST request' do
@@ -69,9 +77,9 @@ describe PhoneGap::Build::RestResource do
69
77
  end
70
78
  end
71
79
 
72
- context 'after successful creation' do
80
+ context 'when creation is successful' do
73
81
 
74
- let(:success_response) { double('response', success?: true, body: '{"title" : "Batman", "rating" : 5}') }
82
+ let(:success_response) { double('response', success?: true, body: '{"id" : 1, "title" : "Batman", "rating" : 5}') }
75
83
 
76
84
  before do
77
85
  api_request.stub(:post).with('users', query: {data: {}}).and_return success_response
@@ -80,10 +88,25 @@ describe PhoneGap::Build::RestResource do
80
88
  it 'updates the object with any response attributes' do
81
89
  response = subject.create
82
90
  expect(response.object_id).to be subject.object_id
91
+ expect(response.instance_variable_get('@id')).to eq 1
83
92
  expect(response.instance_variable_get('@title')).to eq 'Batman'
84
93
  expect(response.instance_variable_get('@rating')).to eq 5
85
94
  end
86
95
  end
96
+
97
+ context 'when creation is unsuccessful' do
98
+
99
+ let(:response) { double('response', success?: false, body: "{\"error\":\"Error: upload failed; please try again\"}\n") }
100
+
101
+ it 'returns false' do
102
+ expect(subject.create).to eq false
103
+ end
104
+
105
+ it 'updates the object with the errors' do
106
+ subject.create
107
+ expect(subject.errors).to eq ['Error: upload failed; please try again']
108
+ end
109
+ end
87
110
  end
88
111
 
89
112
  describe '#update' do
@@ -135,7 +158,7 @@ describe PhoneGap::Build::RestResource do
135
158
 
136
159
  context 'when the child object doesn\'t have an id attribute' do
137
160
 
138
- let(:http_response) { double('response', success?: false) }
161
+ let(:http_response) { double('response', success?: false, body: '{"key":"value"}') }
139
162
 
140
163
  before do
141
164
  subject.id = nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phone_gap-build
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seb Glazebrook
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-20 00:00:00.000000000 Z
11
+ date: 2014-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httmultiparty
@@ -104,6 +104,7 @@ files:
104
104
  - lib/phone_gap/build/rest_resource.rb
105
105
  - lib/phone_gap/build/version.rb
106
106
  - phone_gap-build.gemspec
107
+ - spec/fixtures/api_responses/get-app.json
107
108
  - spec/fixtures/api_responses/get-apps.json
108
109
  - spec/fixtures/api_responses/rest-resource-create.json
109
110
  - spec/fixtures/index.html
@@ -139,6 +140,7 @@ signing_key:
139
140
  specification_version: 4
140
141
  summary: PhoneGap Build Api gem
141
142
  test_files:
143
+ - spec/fixtures/api_responses/get-app.json
142
144
  - spec/fixtures/api_responses/get-apps.json
143
145
  - spec/fixtures/api_responses/rest-resource-create.json
144
146
  - spec/fixtures/index.html