app_store_connect 0.13.0 → 0.14.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
  SHA256:
3
- metadata.gz: 4dce1e8e34f1223902d271ca579ae0ecef46b49e1be8a782561412bcb97f26ff
4
- data.tar.gz: c8d4ac03735552d4a61dd458132adf3c611b25c40a7a99acf7d9d26c1e73eb5f
3
+ metadata.gz: a05ac5b04cfade9f4bd31173b13bc7ac094580f5f3bbb41f24a881bab79f49f0
4
+ data.tar.gz: 3407d48bc34490ab5f555ffe943962af3a83ab19b3a455d5aa0080fda40c9244
5
5
  SHA512:
6
- metadata.gz: 9e4d24c27e4f26074ae86e55dddd5ab57e196ac8a098cfdb39f63c7f6d1b64b73a30d5e9ad73cc03a3fdf4d6d03eb287b5ad143ab1f26a358706ef1c78bd0924
7
- data.tar.gz: 595f99a72d4997abe9bc01dae7d2bcff8b4c3d6629823eefa73d19f31841f526efacc605b0d18d06a856f9bd39d76a1df3a038b04b4b8e8c282d47f9edee3429
6
+ metadata.gz: 123b7f157a91802a23c04c0df89fdf490da6fa775c705baf3643ae47d88c113eacb3dc102fe1755396e9f38b31984ba62dcaf5031a497465c1361ce11c245e5c
7
+ data.tar.gz: 1ffa55020b42a3b55cb1a48e413eb89e5ec2851e3c457c70cec9538c6ccb2ccd26ff45c05074e4b0adf9b910f1c7ef19e86b7d9b678f859ef1b3149a1e46f7ea
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- app_store_connect (0.13.0)
5
- activesupport (>= 5.1.7, <= 5.2.3)
4
+ app_store_connect (0.14.0)
5
+ activesupport
6
6
  jwt (>= 1.4, <= 2.2.1)
7
7
  mixpanel-ruby (<= 2.2.0)
8
8
 
@@ -67,7 +67,6 @@ GEM
67
67
  method_source (~> 0.9.0)
68
68
  public_suffix (3.1.1)
69
69
  rainbow (3.0.0)
70
- rake (10.5.0)
71
70
  rb-fsevent (0.10.3)
72
71
  rb-inotify (0.10.0)
73
72
  ffi (~> 1.0)
@@ -120,7 +119,6 @@ DEPENDENCIES
120
119
  factory_bot (~> 5.0.2)
121
120
  guard-rspec (~> 4.7.3)
122
121
  pry (~> 0.12)
123
- rake (~> 10.0)
124
122
  rspec (~> 3.0)
125
123
  rubocop (~> 0.71.0)
126
124
  simplecov (~> 0.16.1)
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.require_paths = ['lib']
22
22
 
23
- spec.add_runtime_dependency 'activesupport', '>= 5.1.7', '<= 5.2.3'
23
+ spec.add_runtime_dependency 'activesupport'
24
24
  spec.add_runtime_dependency 'jwt', '>= 1.4', '<= 2.2.1'
25
25
  spec.add_runtime_dependency 'mixpanel-ruby', '<= 2.2.0'
26
26
 
@@ -28,7 +28,6 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency 'factory_bot', '~> 5.0.2'
29
29
  spec.add_development_dependency 'guard-rspec', '~> 4.7.3'
30
30
  spec.add_development_dependency 'pry', '~> 0.12'
31
- spec.add_development_dependency 'rake', '~> 10.0'
32
31
  spec.add_development_dependency 'rspec', '~> 3.0'
33
32
  spec.add_development_dependency 'rubocop', '~> 0.71.0'
34
33
  spec.add_development_dependency 'simplecov', '~> 0.16.1'
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'jwt'
4
+
5
+ module AppStoreConnect
6
+ class Client
7
+ class Authorization
8
+ OPTIONS = %i[key_id issuer_id private_key].freeze
9
+
10
+ AUDIENCE = 'appstoreconnect-v1'
11
+ ALGORITHM = 'ES256'
12
+
13
+ attr_reader(*OPTIONS)
14
+
15
+ def initialize(options)
16
+ @key_id = options.fetch(:key_id)
17
+ @issuer_id = options.fetch(:issuer_id)
18
+ @private_key = OpenSSL::PKey.read(options.fetch(:private_key))
19
+ end
20
+
21
+ def payload
22
+ {
23
+ exp: Time.now.to_i + 20 * 60,
24
+ iss: issuer_id,
25
+ aud: AUDIENCE
26
+ }
27
+ end
28
+
29
+ def header_fields
30
+ { kid: key_id }
31
+ end
32
+
33
+ def token
34
+ JWT.encode(payload, private_key, ALGORITHM, header_fields)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+
5
+ module AppStoreConnect
6
+ class Client
7
+ class Options < SimpleDelegator
8
+ attr_reader :kwargs, :config, :env
9
+
10
+ ENV_REGEXP = /APP_STORE_CONNECT_(?<suffix>[A-Z_]+)/.freeze
11
+ private_constant :ENV_REGEXP
12
+
13
+ def initialize(kwargs)
14
+ @kwargs = kwargs
15
+ @config = build_config
16
+ @env = build_env
17
+ options = @config.merge(kwargs.merge(@env))
18
+
19
+ super(options)
20
+ end
21
+
22
+ private
23
+
24
+ def build_config
25
+ AppStoreConnect.config.dup
26
+ end
27
+
28
+ def build_env
29
+ {}.tap do |hash|
30
+ ENV.each do |key, value|
31
+ match = key.match(ENV_REGEXP)
32
+
33
+ next unless match
34
+
35
+ hash[match[:suffix].downcase.to_sym] = value
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'delegate'
4
+
5
+ module AppStoreConnect
6
+ class Client
7
+ class Registry < SimpleDelegator
8
+ OPTIONS = %i[schema].freeze
9
+
10
+ def initialize(options = {})
11
+ super(options .fetch(:schema).web_service_endpoints.map { |s| [s.alias, s] }.to_h)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mixpanel-ruby'
4
+ require 'securerandom'
5
+
6
+ module AppStoreConnect
7
+ class Client
8
+ class Usage
9
+ OPTIONS = %i[analytics_enabled].freeze
10
+
11
+ MIXPANEL_PROJECT_TOKEN = '1213f2b88b9b10b13d321f4c67a55ca8'
12
+ private_constant :MIXPANEL_PROJECT_TOKEN
13
+
14
+ def initialize(options = {})
15
+ @enabled = options[:analytics_enabled].to_s == 'true'
16
+ @distinct_id = SecureRandom.uuid
17
+ @tracker = Mixpanel::Tracker.new(MIXPANEL_PROJECT_TOKEN)
18
+ end
19
+
20
+ def track
21
+ return false unless @enabled
22
+
23
+ @tracker.track(@distinct_id, 'usage')
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,30 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'active_support/all'
4
- require 'mixpanel-ruby'
5
- require 'securerandom'
6
4
 
7
5
  require 'app_store_connect/request'
8
- require 'app_store_connect/authorization'
9
6
  require 'app_store_connect/schema'
7
+ require 'app_store_connect/client/authorization'
8
+ require 'app_store_connect/client/options'
9
+ require 'app_store_connect/client/usage'
10
+ require 'app_store_connect/client/registry'
10
11
 
11
12
  module AppStoreConnect
12
13
  class Client
13
14
  def initialize(**kwargs)
14
- @options = options(**kwargs)
15
-
16
- @authorization = Authorization.new(
17
- private_key: @options[:private_key],
18
- key_id: @options[:key_id],
19
- issuer_id: @options[:issuer_id]
20
- )
21
- @web_service_endpoints_by_alias ||= @options
22
- .fetch(:schema)
23
- .web_service_endpoints
24
- .map { |s| [s.alias, s] }
25
- .to_h
26
- @distinct_id = SecureRandom.uuid
27
- @tracker = Mixpanel::Tracker.new('1213f2b88b9b10b13d321f4c67a55ca8')
15
+ @options = Options.new(kwargs)
16
+ @usage = Usage.new(@options.slice(*Usage::OPTIONS))
17
+ @authorization = Authorization.new(@options.slice(*Authorization::OPTIONS))
18
+ @registry = Registry.new(@options.slice(*Registry::OPTIONS))
28
19
  end
29
20
 
30
21
  def respond_to_missing?(method_name, include_private = false)
@@ -39,8 +30,14 @@ module AppStoreConnect
39
30
  call(web_service_endpoint, *kwargs)
40
31
  end
41
32
 
33
+ # :nocov:
34
+ def inspect
35
+ "#<#{self.class.name}:#{object_id}>"
36
+ end
37
+ # :nocov:
38
+
42
39
  def web_service_endpoint_aliases
43
- @web_service_endpoints_by_alias.keys
40
+ @registry.keys
44
41
  end
45
42
 
46
43
  private
@@ -50,7 +47,7 @@ module AppStoreConnect
50
47
 
51
48
  request = build_request(web_service_endpoint, **kwargs)
52
49
 
53
- @tracker.track(@distinct_id, web_service_endpoint.alias) if @options[:analytics_enabled]
50
+ @usage.track
54
51
  response = request.execute
55
52
 
56
53
  JSON.parse(response.body) if response.body
@@ -63,31 +60,7 @@ module AppStoreConnect
63
60
  end
64
61
 
65
62
  def web_service_endpoint_by(alias_sym)
66
- @web_service_endpoints_by_alias[alias_sym]
67
- end
68
-
69
- def env_options
70
- {}.tap do |hash|
71
- ENV.each do |key, value|
72
- match = key.match(/APP_STORE_CONNECT_(?<name>[A-Z_]+)/)
73
-
74
- next unless match
75
-
76
- hash[match[:name].downcase.to_sym] = value
77
- end
78
- end
79
- end
80
-
81
- def options(**kwargs)
82
- defaults = {
83
- analytics_enabled: true,
84
- schema: Schema.new(File.join(__dir__, '../config/schema.json'))
85
- }
86
- AppStoreConnect.config.merge(kwargs.merge(env_options.merge(defaults))).tap do |options|
87
- %i[key_id issuer_id private_key].each do |key|
88
- raise ArgumentError, "missing #{key}" unless options.keys.include?(key)
89
- end
90
- end
63
+ @registry[alias_sym]
91
64
  end
92
65
 
93
66
  def http_body(web_service_endpoint, **kwargs)
@@ -3,15 +3,13 @@
3
3
  require 'net/http'
4
4
 
5
5
  module AppStoreConnect
6
- attr_reader :uri
7
-
8
- class UnsupportedHTTPMethod < ArgumentError
9
- def initialize(http_method)
10
- super "Unsupported HTTP Method: #{http_method}"
6
+ class Request
7
+ class UnsupportedHTTPMethod < ArgumentError
8
+ def initialize(http_method)
9
+ super "Unsupported HTTP Method: #{http_method}"
10
+ end
11
11
  end
12
- end
13
12
 
14
- class Request
15
13
  def initialize(**options)
16
14
  @uri = options.fetch(:uri)
17
15
  @options = options
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module AppStoreConnect
4
+ class Schema
5
+ class Object
6
+ attr_reader :type, :properties
7
+
8
+ def initialize(options)
9
+ @type = options.fetch(:type)
10
+ @properties = options.fetch(:properties)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,16 +3,13 @@
3
3
  module AppStoreConnect
4
4
  class Schema
5
5
  class Type
6
- attr_reader :type, :options
6
+ attr_reader :type, :options, :values
7
7
 
8
- def initialize(**options)
8
+ def initialize(options)
9
9
  @type = options[:type]
10
+ @values = options[:values]
10
11
  @options = options
11
12
  end
12
-
13
- def values
14
- @options[:values]
15
- end
16
13
  end
17
14
  end
18
15
  end
@@ -3,7 +3,7 @@
3
3
  module AppStoreConnect
4
4
  class Schema
5
5
  class WebServiceEndpoint
6
- def initialize(**options)
6
+ def initialize(options)
7
7
  @options = options
8
8
  end
9
9
 
@@ -1,19 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'app_store_connect/schema/type'
4
+ require 'app_store_connect/schema/object'
4
5
  require 'app_store_connect/schema/web_service_endpoint'
5
6
 
6
7
  module AppStoreConnect
7
8
  class Schema
8
- attr_reader :types, :web_service_endpoints
9
+ attr_reader :types, :web_service_endpoints, :objects
9
10
 
10
11
  def initialize(path)
11
12
  schema = JSON.parse(File.read(path)).deep_symbolize_keys
12
13
  @types = schema[:types].map do |options|
13
- Type.new(**options)
14
+ Type.new(options)
14
15
  end
15
- @web_service_endpoints = schema[:web_service_endpoints].map do |s|
16
- WebServiceEndpoint.new(**s)
16
+ @web_service_endpoints = schema[:web_service_endpoints].map do |options|
17
+ WebServiceEndpoint.new(options)
18
+ end
19
+ @objects = schema[:objects].map do |options|
20
+ Object.new(options)
17
21
  end
18
22
  end
19
23
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppStoreConnect
4
- VERSION = '0.13.0'
4
+ VERSION = '0.14.0'
5
5
  end
@@ -14,7 +14,10 @@ require 'app_store_connect/user_invitation_create_request'
14
14
  require 'app_store_connect/profile_create_request'
15
15
 
16
16
  module AppStoreConnect
17
- @config = {}
17
+ @config = {
18
+ analytics_enabled: true,
19
+ schema: Schema.new(File.join(__dir__, 'config', 'schema.json'))
20
+ }
18
21
 
19
22
  class << self
20
23
  attr_accessor :config
@@ -1,4 +1,5 @@
1
1
  {
2
+ "objects": [],
2
3
  "web_service_endpoints": [
3
4
  {
4
5
  "http_method": "delete",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: app_store_connect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyle Decot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-13 00:00:00.000000000 Z
11
+ date: 2019-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,20 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.1.7
20
- - - "<="
21
- - !ruby/object:Gem::Version
22
- version: 5.2.3
19
+ version: '0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 5.1.7
30
- - - "<="
31
- - !ruby/object:Gem::Version
32
- version: 5.2.3
26
+ version: '0'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: jwt
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -120,20 +114,6 @@ dependencies:
120
114
  - - "~>"
121
115
  - !ruby/object:Gem::Version
122
116
  version: '0.12'
123
- - !ruby/object:Gem::Dependency
124
- name: rake
125
- requirement: !ruby/object:Gem::Requirement
126
- requirements:
127
- - - "~>"
128
- - !ruby/object:Gem::Version
129
- version: '10.0'
130
- type: :development
131
- prerelease: false
132
- version_requirements: !ruby/object:Gem::Requirement
133
- requirements:
134
- - - "~>"
135
- - !ruby/object:Gem::Version
136
- version: '10.0'
137
117
  - !ruby/object:Gem::Dependency
138
118
  name: rspec
139
119
  requirement: !ruby/object:Gem::Requirement
@@ -226,15 +206,17 @@ files:
226
206
  - Guardfile
227
207
  - LICENSE.txt
228
208
  - README.md
229
- - Rakefile
230
209
  - app_store_connect.gemspec
231
210
  - bin/console
232
211
  - bin/setup
233
212
  - lib/app_store_connect.rb
234
- - lib/app_store_connect/authorization.rb
235
213
  - lib/app_store_connect/bundle_id_create_request.rb
236
214
  - lib/app_store_connect/certificate_create_request.rb
237
215
  - lib/app_store_connect/client.rb
216
+ - lib/app_store_connect/client/authorization.rb
217
+ - lib/app_store_connect/client/options.rb
218
+ - lib/app_store_connect/client/registry.rb
219
+ - lib/app_store_connect/client/usage.rb
238
220
  - lib/app_store_connect/create_request.rb
239
221
  - lib/app_store_connect/device_create_request.rb
240
222
  - lib/app_store_connect/object/attributes.rb
@@ -244,6 +226,7 @@ files:
244
226
  - lib/app_store_connect/profile_create_request.rb
245
227
  - lib/app_store_connect/request.rb
246
228
  - lib/app_store_connect/schema.rb
229
+ - lib/app_store_connect/schema/object.rb
247
230
  - lib/app_store_connect/schema/type.rb
248
231
  - lib/app_store_connect/schema/web_service_endpoint.rb
249
232
  - lib/app_store_connect/user_invitation_create_request.rb
data/Rakefile DELETED
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task default: :spec
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'jwt'
4
-
5
- module AppStoreConnect
6
- class Authorization
7
- AUDIENCE = 'appstoreconnect-v1'
8
- ALGORITHM = 'ES256'
9
-
10
- attr_reader :key_id, :issuer_id, :private_key
11
-
12
- def initialize(key_id:, issuer_id:, private_key:)
13
- @key_id = key_id
14
- @issuer_id = issuer_id
15
- @private_key = OpenSSL::PKey.read(private_key)
16
- end
17
-
18
- def payload
19
- {
20
- exp: Time.now.to_i + 20 * 60,
21
- iss: issuer_id,
22
- aud: AUDIENCE
23
- }
24
- end
25
-
26
- def header_fields
27
- { kid: key_id }
28
- end
29
-
30
- def token
31
- JWT.encode(payload, private_key, ALGORITHM, header_fields)
32
- end
33
- end
34
- end