motion-steward 1.0.3 → 1.0.4

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: cda0106118203f96db193747e2f3f476fdf764d9
4
- data.tar.gz: d95ab39b1ef8ab55610faedfd848e1a0a2060b25
3
+ metadata.gz: d4baf404a06c1d862ec52721dbe7102d97fff4f1
4
+ data.tar.gz: c53cafba15b1bed39052eda9ff5dff5e4ad54840
5
5
  SHA512:
6
- metadata.gz: e743824cf2ba91f6947ceec82374f8c301f4af03813729ab90042bface5f26118472452cdc5589fff2d571c9031ef73371a49a4050d68c0c8f3ecd0bf22b5623
7
- data.tar.gz: 736a81c76f1187a3d0524cd30a3f0b1dfbd6f76221c3600f8496a4f6dd7184d38cc54780f60fda010484236a07688da04543352e838d78f5312f6c75c61c56e4
6
+ metadata.gz: baa98c59d8fe8246e6de1df050199e7f460432d1efde54c862380a9532d37906c98af0d3b8687bb580df8c1b0233b84a86c3ea8a28947a686cca4c84d041c743
7
+ data.tar.gz: 68b9d95ba8e76bb03388671e610c05c220964763c803ac31de98701d87195e4a5021d7365eb0b93520020d12872775a4317659979b18403d34fc4472fa04793f
data/bin/motion-steward CHANGED
@@ -4,7 +4,7 @@ require 'fastlane'
4
4
  require 'motion-steward'
5
5
 
6
6
  def options
7
- [:research]
7
+ [:research, :audit, :create_dev_profile, :add_device_to_profile, :download_dev_profile]
8
8
  end
9
9
 
10
10
  def list_apps
@@ -18,25 +18,6 @@ def go_to_apps
18
18
  system 'open https://developer.apple.com/account/ios/identifier/bundle/'
19
19
  end
20
20
 
21
- def get_udid_of_connected_devices
22
- script = <<~SCRIPT
23
- i=0
24
- for line in $(system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p' -e '/iPhone/,/Serial/p' | grep "Serial Number:" | awk -F ": " '{print $2}'); do
25
- UDID=${line}
26
- echo $UDID
27
- udid_array[i]=${line}
28
- i=$(($i+1))
29
- done
30
-
31
- cnt=${#udid_array[@]}
32
- for ((i=0;i<cnt;i++)); do
33
- echo ${udid_array[i]}
34
- done
35
- SCRIPT
36
-
37
- system script
38
- end
39
-
40
21
  def gets
41
22
  STDIN.gets.chomp
42
23
  end
@@ -47,12 +28,76 @@ def prompt_for_response message
47
28
  gets
48
29
  end
49
30
 
31
+ def download_dev_profile
32
+ login_if_needed
33
+ puts "Here are the apps I've found without development profiles:\n\n"
34
+
35
+ MotionSteward.development_profiles.each do |p|
36
+ puts "- #{p.app.name}: #{p.app.bundle_id}"
37
+ end
38
+
39
+ selected_app = prompt_for_response "\nWhich app do you want to download the profile for?"
40
+ to_path = 'development.mobileprovision'
41
+
42
+ MotionSteward.download_development_profile selected_app, to_path
43
+ puts "Development profile for #{selected_app} has been downloaded to #{to_path}.\n"
44
+ audit
45
+ end
46
+
50
47
  def research
51
48
  term = prompt_for_response "Enter a search term or app name, and I'll return what people will see when they search for that term in the App Store (along with some fancy data):"
52
49
  puts ''
53
50
  MotionSteward::AppStoreResearch.analyze(term)
54
51
  end
55
52
 
53
+ def create_dev_profile
54
+ login_if_needed
55
+ puts "Here are the apps I've found without development profiles:\n\n"
56
+
57
+ MotionSteward.apps_without_development_profiles.each do |p|
58
+ puts "- #{p.name}: #{p.bundle_id}"
59
+ end
60
+
61
+ selected_app = prompt_for_response "\nWhich app do you want to create a profile for?"
62
+
63
+ MotionSteward.create_development_profile selected_app
64
+ puts "\n"
65
+ audit
66
+ end
67
+
68
+ def add_device_to_profile
69
+ login_if_needed
70
+ puts "Here are the profiles I've found that do not have the currently connected device:\n\n"
71
+
72
+ MotionSteward.development_profiles_without_device(MotionSteward.udid_of_connected_device).each do |p|
73
+ puts " - #{p.app.name}'s development profile"
74
+ end
75
+
76
+ selected_app = prompt_for_response "\nWhich app's profile do you want to add the device to?"
77
+
78
+ MotionSteward.add_device_to_app selected_app, MotionSteward.udid_of_connected_device
79
+ puts "\n"
80
+ audit
81
+ end
82
+
83
+ def login_if_needed
84
+ stored_login = `cat ~/.motion-steward-login`.chomp
85
+ if stored_login.length.zero?
86
+ email = prompt_for_response 'First, we need to log into your Apple Developer account. I need your email:'
87
+ system "echo #{email} >> ~/.motion-steward-login"
88
+ else
89
+ email = stored_login
90
+ end
91
+
92
+ Spaceship.login email
93
+ end
94
+
95
+ def audit
96
+ login_if_needed
97
+ MotionSteward.audit_device
98
+ MotionSteward.audit_provisioning_profiles
99
+ end
100
+
56
101
  def help_with_certificates
57
102
  production = Spaceship.certificate.all.find_all { |c| c.is_a? Spaceship::Portal::Certificate::Production }.first
58
103
 
@@ -37,7 +37,7 @@ class MotionSteward::AppStoreResearch
37
37
  if user_rating_count < 99
38
38
  puts ' - App has very few ratings, which usually means very few downloads.'
39
39
  elsif user_rating_count < 300
40
- puts ' - App has a moderate number of reviews. If the app has been recently updated, then this is probably a new app.'
40
+ puts " - App has a moderate number of reviews (#{user_rating_count.commas}). If the app has been recently updated, then this is probably a new app."
41
41
  elsif user_rating_count > 10_000
42
42
  puts " - App has an astronomical number of reviews (#{user_rating_count.commas}). If your app is similar to this one, you probably shouldn't build yours because you have little to no chance of \"beating them\"."
43
43
  elsif user_rating_count > 5_000
@@ -18,6 +18,7 @@ class MotionSteward::AppStoreSearch
18
18
  def self.search_for_app term
19
19
  results = get 'search',
20
20
  media: 'software',
21
+ entity: 'software',
21
22
  term: URI.encode(term),
22
23
  country: 'us',
23
24
  limit: 15
@@ -1,16 +1,153 @@
1
+ # coding: utf-8
2
+ require 'fastlane'
3
+
1
4
  class MotionSteward
2
- def self.audit_provisioning_profiles
3
- apps = Spaceship.app.all
4
- profiles = Spaceship.provisioning_profile.all
5
- development_profiles = profiles.find_all { |p| p.is_a? Spaceship::Portal::ProvisioningProfile::Development }
6
- distribution_profiles = profiles.find_all { |p| p.is_a? Spaceship::Portal::ProvisioningProfile::AppStore }
5
+ def self.udid_of_connected_device
6
+ script = <<~SCRIPT
7
+ i=0
8
+ for line in $(system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p' -e '/iPhone/,/Serial/p' | grep "Serial Number:" | awk -F ": " '{print $2}'); do
9
+ UDID=${line}
10
+ echo $UDID
11
+ udid_array[i]=${line}
12
+ i=$(($i+1))
13
+ done
14
+
15
+ cnt=${#udid_array[@]}
16
+ for ((i=0;i<cnt;i++)); do
17
+ echo ${udid_array[i]}
18
+ done
19
+ SCRIPT
20
+
21
+ result = `#{script}`.chomp
22
+ return nil if result.chomp.length.zero?
23
+ result.split("\n").first.chomp
24
+ end
25
+
26
+ def self.invalidate_cache
27
+ @apps = nil
28
+ @profiles = nil
29
+ @development_profiles = nil
30
+ @distribution_profiles = nil
31
+ @development_certificates = nil
32
+ @production_certificates = nil
33
+ @devices = nil
34
+ end
35
+
36
+ def self.devices
37
+ @devices ||= Spaceship.device.all
38
+ end
39
+
40
+ def self.apps
41
+ @apps ||= Spaceship.app.all
42
+ end
43
+
44
+ def self.profiles
45
+ @profiles ||= Spaceship.provisioning_profile.all
46
+ end
7
47
 
8
- apps.find_all do |a|
48
+ def self.apps_without_development_profiles
49
+ apps.map do |a|
9
50
  {
10
51
  app: a,
11
52
  development_profile: development_profiles.find_all { |d| d.app.app_id == a.app_id },
12
53
  distribution_profile: distribution_profiles.find_all { |d| d.app.app_id == a.app_id }
13
54
  }
55
+ end.find_all do |a|
56
+ a[:development_profile].count.zero?
57
+ end.map { |a| a[:app] }
58
+ end
59
+
60
+ def self.development_profiles_without_device udid
61
+ development_profiles.find_all { |p| p.devices.none? { |d| d.udid == udid } }
62
+ end
63
+
64
+ def self.development_profiles
65
+ @development_profiles ||= profiles.find_all { |p| p.is_a? Spaceship::Portal::ProvisioningProfile::Development }
66
+ end
67
+
68
+ def self.distribution_profiles
69
+ @distribution_profiles ||= profiles.find_all { |p| p.is_a? Spaceship::Portal::ProvisioningProfile::AppStore }
70
+ end
71
+
72
+ def self.development_certificates
73
+ @development_certificates ||= Spaceship.certificate.all.find_all { |c| c.is_a? Spaceship::Portal::Certificate::Development }
74
+ end
75
+
76
+ def self.production_certificates
77
+ @production_certificates ||= Spaceship.certificate.all.find_all { |c| c.is_a? Spaceship::Portal::Certificate::Production }
78
+ end
79
+
80
+ def self.create_development_profile app_name_or_bundle_id
81
+ app = apps.find { |a| a.name == app_name_or_bundle_id || a.bundle_id == app_name_or_bundle_id }
82
+
83
+ unless app
84
+ puts "App/Bundle Id #{app_name_or_bundle_id} not found."
85
+ return
86
+ end
87
+
88
+ Spaceship::Portal::ProvisioningProfile::Development.create!(
89
+ name: "Development: #{app.name}",
90
+ bundle_id: app.bundle_id,
91
+ certificate: development_certificates.first,
92
+ devices: [],
93
+ mac: false,
94
+ sub_platform: nil
95
+ )
96
+
97
+ invalidate_cache
98
+ end
99
+
100
+ def self.download_development_profile app_name_or_bundle_id, to
101
+ profile = development_profiles.find { |p| p.app.name == app_name_or_bundle_id }
102
+ File.write(to, profile.download)
103
+ invalidate_cache
104
+ end
105
+
106
+ def self.add_device_to_app app_name_or_bundle_id, udid
107
+ profile = development_profiles_without_device(udid).find { |p| p.app.name == app_name_or_bundle_id }
108
+ profile.devices << devices.find { |d| d.udid == udid }
109
+ profile.update!
110
+ invalidate_cache
111
+ end
112
+
113
+ def self.audit_device
114
+ currently_connected_device = udid_of_connected_device
115
+
116
+ if devices.none? { |d| d.udid == currently_connected_device }
117
+ puts 'The currently connected device is not part of your developer account.'
118
+ end
119
+ end
120
+
121
+ def self.audit_provisioning_profiles
122
+ lookup = apps.map do |a|
123
+ {
124
+ app: a,
125
+ development_profile: development_profiles.find_all { |d| d.app.app_id == a.app_id },
126
+ distribution_profile: distribution_profiles.find_all { |d| d.app.app_id == a.app_id }
127
+ }
128
+ end
129
+
130
+ currently_connected_device = udid_of_connected_device
131
+
132
+ lookup.each do |a|
133
+ puts "#{a[:app].name}:"
134
+ if a[:development_profile].any?
135
+ if a[:development_profile].first.devices.none? { |d| d.udid == currently_connected_device }
136
+ if currently_connected_device
137
+ puts ' ✗ Development profile is missing the device that is currently connected.'
138
+ end
139
+ else
140
+ puts ' ✔ All is good with the development profile.'
141
+ end
142
+ else
143
+ puts ' ✗ Development profile missing.'
144
+ end
145
+
146
+ if a[:distribution_profile].any?
147
+ puts ' ✔ All is good with the distribution profile.'
148
+ else
149
+ puts ' ✗ Distribution profile missing.'
150
+ end
14
151
  end
15
152
  end
16
153
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motion-steward
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amir Rajan