phone_gap-build 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: def3c1fe04ee9c71d97860ca06ada7b491b720e5
4
- data.tar.gz: 13040e4d4859a256fd9abecf9cd8a05c2a7256c1
3
+ metadata.gz: 899a79a1f62e5235bc0f9a1f216d3a9bbd72ca89
4
+ data.tar.gz: 704aaa02c1219ff6077c4fd37c7201a81ff15d7c
5
5
  SHA512:
6
- metadata.gz: 0b65111712fdfe2bed7ee68ad7cf3e7193c97920582011b9550f206a49338b5f5181d922bd0e3909fab29298a1761210ab0aadf8f95bf202476d5bc3e97d4d0a
7
- data.tar.gz: 3981955216cfa781999ce4130fea294520621d5206230236533719d13ecce85040d17d1ef7427762bddb401b6c8cecd92ea430ccca3041d4e97fc4420340e9a9
6
+ metadata.gz: 00e0094338041ae7785c8b943eea9747e259b9922a19407d5ca5f1fd2867aae0cb4ef98608d721ac43e4d80d8dc18d5dc03b914c2679efae4c1b9571c5e3103d
7
+ data.tar.gz: 2060ab63c6e1b05228f38ca2323b420100a41f01a6d709e7f52e4e6f3c64131091a79d3e0fc8df20ef140812486e7343a03373e52dc8a362f83957197c01402a
data/README.md CHANGED
@@ -24,11 +24,31 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
- require 'phone_gap/build'
27
+ require 'phone_gap/build'
28
28
 
29
- PhoneGap::Build.credentials(token: 'my_api_token')
29
+ PhoneGap::Build.credentials(token: 'my_api_token')
30
30
 
31
- apps = PhoneGap::Build.apps
31
+ apps = PhoneGap::Build.apps
32
+
33
+ # get the app you're interested in
34
+
35
+ app = apps.first
36
+
37
+ app.description = 'Fancy Pants App'
38
+
39
+ app.save (#save will update an existing app)
40
+
41
+ # create a new app
42
+
43
+ app = PhoneGap::Build::App.new
44
+
45
+ # add any required values (see http://docs.build.phonegap.com/en_US/3.3.0/developer_api_api.md.html#PhoneGap%20Build%20Developer%20API)
46
+
47
+ app.save (#save create a new app)
48
+
49
+ # delete it!
50
+
51
+ app.destroy
32
52
 
33
53
  ## Contributing
34
54
 
@@ -1,14 +1,15 @@
1
+ require 'phone_gap/build/rest_resource'
2
+ require 'httmultiparty'
3
+
1
4
  module PhoneGap
2
5
  module Build
3
- class App
4
-
5
- def initialize(params)
6
- params.each do |key, value|
7
- instance_variable_set("@#{key}", value)
8
- singleton_class.class_eval { attr_accessor key }
9
- end
10
- end
11
- end
6
+ class App < RestResource
7
+
8
+ PATH = '/apps'
9
+ attr_creatable :title, :create_method, :package, :version, :description, :debug, :keys, :private, :phonegap_version, :hydrates
10
+ attr_updatable :title, :package, :version, :description, :debug, :private, :phonegap_version
12
11
 
12
+
13
+ end
13
14
  end
14
15
  end
@@ -0,0 +1,41 @@
1
+ module PhoneGap
2
+ module Build
3
+ module Creatable
4
+
5
+ self.class_variable_set('@@creatable_attributes', {})
6
+ self.class_variable_set('@@updatable_attributes', {})
7
+
8
+ def self.included(base)
9
+ base.extend(ClassMethods)
10
+ end
11
+
12
+ def creatable_attributes
13
+ self.class.class_variable_get('@@creatable_attributes')[self.class]
14
+ end
15
+
16
+ def updatable_attributes
17
+ self.class.class_variable_get('@@updatable_attributes')[self.class]
18
+ end
19
+
20
+ module ClassMethods
21
+
22
+ def attr_creatable(*args)
23
+ args.each { |attribute| add_to_collection('@@creatable_attributes', attribute) }
24
+ end
25
+
26
+ def attr_updatable(*args)
27
+ args.each { |attribute| add_to_collection('@@updatable_attributes', attribute) }
28
+ end
29
+
30
+ def add_to_collection(collection_name, value)
31
+ if self.class_variable_get(collection_name)[self]
32
+ self.class_variable_get(collection_name)[self] << "@#{value}"
33
+ else
34
+ self.class_variable_get(collection_name)[self] = ["@#{value}"]
35
+ end
36
+ end
37
+ end
38
+
39
+ end
40
+ end
41
+ end
@@ -1,11 +1,19 @@
1
+ require 'singleton'
2
+
1
3
  module PhoneGap
2
4
  module Build
3
5
  class Credentials
4
6
 
7
+ include Singleton
8
+
5
9
  attr_reader :username, :password, :token
10
+ attr_writer :token
6
11
 
7
- def initialize(params)
8
- @username, @password, @token = params[:username], params[:password], params[:token]
12
+ def set(credentials)
13
+ @username = credentials[:username]
14
+ @password = credentials[:password]
15
+ @token = credentials[:token]
16
+ self
9
17
  end
10
18
  end
11
19
  end
@@ -0,0 +1,63 @@
1
+ require 'phone_gap/build/creatable'
2
+ require 'httmultiparty'
3
+
4
+ module PhoneGap
5
+ module Build
6
+ class RestResource
7
+
8
+ include PhoneGap::Build::Creatable
9
+ include HTTMultiParty
10
+ base_uri 'https://build.phonegap.com/api/v1'
11
+
12
+ def initialize(attributes = {})
13
+ attributes.each do |key, value|
14
+ instance_variable_set("@#{key}", value)
15
+ end
16
+ end
17
+
18
+ def create
19
+ response = self.class.post(path, query: {data: as_json(only: creatable_attributes)})
20
+ if response.success?
21
+ populate_from_json(JSON.parse(response.body))
22
+ end
23
+ end
24
+
25
+ def update
26
+ self.class.put(path, query: {data: as_json(only: updatable_attributes)})
27
+ end
28
+
29
+ def save
30
+ @id ? update : create
31
+ end
32
+
33
+ def destroy
34
+ self.class.delete(path)
35
+ end
36
+
37
+ def as_json(params = {})
38
+ if params[:only]
39
+ params[:only].inject({}) do | memo, attribute_name|
40
+ memo[attribute_name[1..-1].to_sym] = instance_variable_get(attribute_name)
41
+ memo
42
+ end
43
+ else
44
+ {}
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def path
51
+ @id ? "#{self.class.const_get('PATH')}/#{@id}?auth_token=#{token}" : "#{self.class.const_get('PATH')}?auth_token=#{token}"
52
+ end
53
+
54
+ def token
55
+ PhoneGap::Build::Credentials.instance.token
56
+ end
57
+
58
+ def populate_from_json(json)
59
+ self.class.new(json)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -1,5 +1,5 @@
1
1
  module PhoneGap
2
2
  module Build
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
@@ -2,6 +2,8 @@ require 'phone_gap/build/version'
2
2
  require 'phone_gap/build/credentials'
3
3
  require 'phone_gap/build/app_factory'
4
4
  require 'phone_gap/build/app'
5
+ require 'phone_gap/build/rest_resource'
6
+ require 'phone_gap/build/creatable'
5
7
 
6
8
  require 'httparty'
7
9
 
@@ -9,7 +11,7 @@ module PhoneGap
9
11
  module Build
10
12
 
11
13
  def self.credentials(credentials)
12
- @credentials = Credentials.new(credentials)
14
+ @credentials = Credentials.instance.set(credentials)
13
15
  end
14
16
 
15
17
  def self.apps
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'httparty'
21
+ spec.add_dependency 'httmultiparty'
22
22
 
23
23
  spec.add_development_dependency 'bundler'
24
24
  spec.add_development_dependency 'rake'
@@ -0,0 +1,46 @@
1
+ {
2
+ "keys": {
3
+ "ios": {
4
+ "title": "ios-key",
5
+ "default": true,
6
+ "id": 2,
7
+ "link": "/api/v1/keys/ios/2"
8
+ },
9
+ "android": {
10
+ "title": "release-key",
11
+ "default": true,
12
+ "id": 2,
13
+ "link": "/api/v1/keys/android/2"
14
+ }
15
+ },
16
+ "download": {},
17
+ "title": "API V1 App",
18
+ "repo": null,
19
+ "collaborators": [
20
+ {
21
+ "person": "andrew.lunny@nitobi.com",
22
+ "role": "admin"
23
+ }
24
+ ],
25
+ "role": "admin",
26
+ "id": 26486,
27
+ "icon": {
28
+ "filename": null,
29
+ "link": "/api/v1/apps/26486/icon"
30
+ },
31
+ "package": "com.alunny.apiv1",
32
+ "version": "0.1.0",
33
+ "description": null,
34
+ "debug": false,
35
+ "private": true,
36
+ "link": "/api/v1/apps/26486",
37
+ "status": {
38
+ "ios": "pending",
39
+ "android": "pending",
40
+ "winphone": "pending"
41
+ },
42
+ "error": {},
43
+ "phonegap_version": "2.9.0",
44
+ "hydrates": false,
45
+ "build_count": null
46
+ }
@@ -2,20 +2,28 @@ require 'spec_helper'
2
2
 
3
3
  describe PhoneGap::Build::App do
4
4
 
5
- describe 'upon instantiation' do
5
+ it 'has a PATH of "apps"' do
6
+ expect(subject.class.const_get('PATH')).to eq '/apps'
7
+ end
8
+
9
+ describe 'creatable attributes' do
6
10
 
7
- context 'when given parameters' do
11
+ subject { PhoneGap::Build::App }
8
12
 
9
- let(:params) do
10
- { name: 'Batman', title: 'Dark Knight', status: { height: 'tall', weight: 'heavy'} }
13
+ %w(title create_method package version description debug keys private phonegap_version hydrates).each do |attribute|
14
+ it "'#{attribute}' is updatable" do
15
+ expect(subject.class_variable_get('@@creatable_attributes')[subject]).to include "@#{attribute}"
11
16
  end
17
+ end
18
+ end
19
+
20
+ describe 'updatable attributes' do
12
21
 
13
- subject { PhoneGap::Build::App.new(params) }
22
+ subject { PhoneGap::Build::App }
14
23
 
15
- it 'makes an attribute of each parameter' do
16
- expect(subject.name).to eq 'Batman'
17
- expect(subject.title).to eq 'Dark Knight'
18
- expect(subject.status).to eq({height: 'tall', weight: 'heavy'})
24
+ %w(title package version description debug private phonegap_version).each do |attribute|
25
+ it "'#{attribute}' is updatable" do
26
+ expect(subject.class_variable_get('@@updatable_attributes')[subject]).to include "@#{attribute}"
19
27
  end
20
28
  end
21
29
  end
@@ -0,0 +1,186 @@
1
+ require 'spec_helper'
2
+
3
+ describe PhoneGap::Build::RestResource do
4
+
5
+ let(:base_uri) { 'https://build.phonegap.com/api/v1/' }
6
+
7
+ context 'when an authentication token is present' do
8
+
9
+ let(:token) { 'BATMAN' }
10
+
11
+ before do
12
+ PhoneGap::Build::Credentials.instance.token = token
13
+ end
14
+
15
+ context 'when used in a child class' do
16
+
17
+ class Child < PhoneGap::Build::RestResource
18
+
19
+ attr_accessor :id
20
+
21
+ PATH = 'users'
22
+
23
+ end
24
+
25
+ subject { Child.new }
26
+
27
+ describe '#create' do
28
+
29
+ let(:response) { double('response', success?: false) }
30
+
31
+ before do
32
+ subject.class.stub(:post).with("users?auth_token=#{token}", query: {data: subject.as_json}).and_return response
33
+ end
34
+
35
+ it 'sends POST request' do
36
+ expect(subject.class).to receive(:post).and_return response
37
+ subject.create
38
+ end
39
+
40
+ it 'uses the resource base as the path and includes the auth token in the request' do
41
+ expect(subject.class).to receive(:post).with("users?auth_token=#{token}", anything()).and_return response
42
+ subject.create
43
+ end
44
+
45
+ it 'sends a body containing all the json representation of the object' do
46
+ expect(subject.class).to receive(:post).with(anything(), query: {data: {}}).and_return response
47
+ subject.create
48
+ end
49
+
50
+ context 'after successful creation' do
51
+
52
+ let(:success_response) { double('response', success?: true, body: '{"title" : "Batman", "rating" : 5}') }
53
+
54
+ before do
55
+ subject.class.stub(:post).with("users?auth_token=#{token}", query: {data: {}}).and_return success_response
56
+ end
57
+
58
+ it 'updates the object with any response attributes' do
59
+ response = subject.create
60
+ expect(response).to be_kind_of Child
61
+ expect(response.instance_variable_get('@title')).to eq 'Batman'
62
+ expect(response.instance_variable_get('@rating')).to eq 5
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '#update' do
68
+
69
+ context 'when the object has an id' do
70
+
71
+ let(:id) { double('id') }
72
+
73
+ before do
74
+ subject.id = id
75
+ end
76
+
77
+ it 'sends PUT request' do
78
+ expect(subject.class).to receive(:put)
79
+ subject.update
80
+ end
81
+
82
+ it 'uses the resource base as the path and includes the auth token in the request' do
83
+ expect(subject.class).to receive(:put).with("users/#{id}?auth_token=#{token}", anything())
84
+ subject.update
85
+ end
86
+
87
+ it 'send a body containing all the json representation of the object' do
88
+ expect(subject.class).to receive(:put).with(anything(), query: {data: {}})
89
+ subject.update
90
+ end
91
+
92
+ context 'after successful update' do
93
+
94
+ it 'returns the populated object'
95
+
96
+ end
97
+ end
98
+ end
99
+
100
+ describe '#save' do
101
+
102
+ context 'when the child object has an id attribute' do
103
+
104
+ before do
105
+ subject.id = 69
106
+ end
107
+
108
+ it 'attempts to update an existing item' do
109
+ expect(subject.class).to receive(:put)
110
+ subject.save
111
+ end
112
+ end
113
+
114
+ context 'when the child object doesn\'t have an id attribute' do
115
+
116
+ let(:http_response) { double('response', success?: false) }
117
+
118
+ before do
119
+ subject.id = nil
120
+ subject.class.stub(:post).and_return http_response
121
+ end
122
+
123
+ it 'attempts to create a new item' do
124
+ expect(subject.class).to receive(:post)
125
+ subject.save
126
+ end
127
+ end
128
+ end
129
+
130
+ describe '#destroy' do
131
+
132
+ context 'when the object has an id' do
133
+
134
+ let(:id) { double('id') }
135
+
136
+ before do
137
+ subject.id = id
138
+ end
139
+
140
+ it 'sends DELETE request' do
141
+ expect(subject.class).to receive(:delete)
142
+ subject.destroy
143
+ end
144
+
145
+ it 'includes the auth token in the request' do
146
+ expect(subject.class).to receive(:delete).with("users/#{id}?auth_token=#{token}")
147
+ subject.destroy
148
+ end
149
+
150
+ context 'upon successful deletion' do
151
+
152
+ it 'does something'
153
+
154
+ end
155
+ end
156
+
157
+ context 'when the object does not have an id' do
158
+
159
+ it 'returns an error'
160
+
161
+ end
162
+ end
163
+
164
+ describe '#as_json' do
165
+
166
+ context 'when there are instance variables' do
167
+
168
+ before do
169
+ subject.instance_variable_set('@superman', 'superman')
170
+ subject.instance_variable_set('@spiderman', 'spiderman')
171
+ subject.instance_variable_set('@batman', 'batman')
172
+ end
173
+
174
+ context 'when given a list of variables to use' do
175
+
176
+ let(:attributes) { ['@superman', '@spiderman'] }
177
+
178
+ it 'returns a hash of the given attributes and their values' do
179
+ expect(subject.as_json(only: attributes)).to eq({superman: 'superman', spiderman: 'spiderman'})
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
185
+ end
186
+ end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phone_gap-build
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.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-10 00:00:00.000000000 Z
11
+ date: 2014-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: httparty
14
+ name: httmultiparty
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -95,11 +95,15 @@ files:
95
95
  - lib/phone_gap/build.rb
96
96
  - lib/phone_gap/build/app.rb
97
97
  - lib/phone_gap/build/app_factory.rb
98
+ - lib/phone_gap/build/creatable.rb
98
99
  - lib/phone_gap/build/credentials.rb
100
+ - lib/phone_gap/build/rest_resource.rb
99
101
  - lib/phone_gap/build/version.rb
100
102
  - phone_gap-build.gemspec
101
103
  - spec/fixtures/api_responses/get-apps.json
104
+ - spec/fixtures/api_responses/rest-resource-create.json
102
105
  - spec/phone_gap/build/app_spec.rb
106
+ - spec/phone_gap/build/rest_resource_spec.rb
103
107
  - spec/phone_gap/build_spec.rb
104
108
  - spec/spec_helper.rb
105
109
  - spec/support/fixtures.rb
@@ -129,7 +133,9 @@ specification_version: 4
129
133
  summary: PhoneGap Build Api gem
130
134
  test_files:
131
135
  - spec/fixtures/api_responses/get-apps.json
136
+ - spec/fixtures/api_responses/rest-resource-create.json
132
137
  - spec/phone_gap/build/app_spec.rb
138
+ - spec/phone_gap/build/rest_resource_spec.rb
133
139
  - spec/phone_gap/build_spec.rb
134
140
  - spec/spec_helper.rb
135
141
  - spec/support/fixtures.rb