fastlane-plugin-polidea 0.1.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.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +52 -0
  4. data/lib/fastlane/plugin/polidea.rb +16 -0
  5. data/lib/fastlane/plugin/polidea/actions/extract_app_icon.rb +155 -0
  6. data/lib/fastlane/plugin/polidea/actions/extract_app_name.rb +91 -0
  7. data/lib/fastlane/plugin/polidea/actions/extract_version.rb +96 -0
  8. data/lib/fastlane/plugin/polidea/actions/get_binary_size.rb +53 -0
  9. data/lib/fastlane/plugin/polidea/actions/mailgun.rb +173 -0
  10. data/lib/fastlane/plugin/polidea/actions/polidea_store_action.rb +248 -0
  11. data/lib/fastlane/plugin/polidea/actions/qr_generator.rb +76 -0
  12. data/lib/fastlane/plugin/polidea/actions/s3.rb +551 -0
  13. data/lib/fastlane/plugin/polidea/helper/polidea_helper.rb +12 -0
  14. data/lib/fastlane/plugin/polidea/templates/images/icon-placeholder.png +0 -0
  15. data/lib/fastlane/plugin/polidea/templates/images/logo.png +0 -0
  16. data/lib/fastlane/plugin/polidea/templates/images/polidea-facebook-icon.png +0 -0
  17. data/lib/fastlane/plugin/polidea/templates/images/polidea-github-icon.png +0 -0
  18. data/lib/fastlane/plugin/polidea/templates/images/polidea-logo.png +0 -0
  19. data/lib/fastlane/plugin/polidea/templates/images/polidea-twitter-icon.png +0 -0
  20. data/lib/fastlane/plugin/polidea/templates/installation-page/css/installation-page.css +3142 -0
  21. data/lib/fastlane/plugin/polidea/templates/installation-page/css/installation-page.css.map +7 -0
  22. data/lib/fastlane/plugin/polidea/templates/installation-page/img/bg.png +0 -0
  23. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg.jpg +0 -0
  24. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1024.jpg +0 -0
  25. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1280.jpg +0 -0
  26. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1360.jpg +0 -0
  27. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1440.jpg +0 -0
  28. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_1680.jpg +0 -0
  29. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_768.jpg +0 -0
  30. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_ipad_1024.jpg +0 -0
  31. data/lib/fastlane/plugin/polidea/templates/installation-page/img/jenkins_bg_ipad_768.jpg +0 -0
  32. data/lib/fastlane/plugin/polidea/templates/installation-page/img/logo.svg +32 -0
  33. data/lib/fastlane/plugin/polidea/templates/installation-page/img/logo_square.svg +12 -0
  34. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation.min.js +10 -0
  35. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.abide.js +294 -0
  36. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.accordion.js +65 -0
  37. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.alert.js +43 -0
  38. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.clearing.js +558 -0
  39. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.dropdown.js +313 -0
  40. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.equalizer.js +74 -0
  41. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.interchange.js +344 -0
  42. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.joyride.js +915 -0
  43. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.js +625 -0
  44. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.magellan.js +189 -0
  45. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.offcanvas.js +139 -0
  46. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.orbit.js +472 -0
  47. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.reveal.js +443 -0
  48. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.slider.js +231 -0
  49. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.tab.js +167 -0
  50. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.tooltip.js +298 -0
  51. data/lib/fastlane/plugin/polidea/templates/installation-page/js/foundation/foundation.topbar.js +436 -0
  52. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/aes.js +35 -0
  53. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/enc-base64-min.js +8 -0
  54. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/fastclick.js +9 -0
  55. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/jquery.cookie.js +8 -0
  56. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/jquery.js +26 -0
  57. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/modernizr.js +8 -0
  58. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/pbkdf2.js +19 -0
  59. data/lib/fastlane/plugin/polidea/templates/installation-page/js/vendor/placeholder.js +2 -0
  60. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/fonts.scss +64 -0
  61. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation.scss +45 -0
  62. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/_functions.scss +101 -0
  63. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/_settings.scss +1441 -0
  64. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_accordion.scss +156 -0
  65. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_alert-boxes.scss +126 -0
  66. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_block-grid.scss +132 -0
  67. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_breadcrumbs.scss +132 -0
  68. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_button-groups.scss +200 -0
  69. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_buttons.scss +252 -0
  70. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_clearing.scss +247 -0
  71. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_dropdown-buttons.scss +129 -0
  72. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_dropdown.scss +248 -0
  73. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_flex-video.scss +51 -0
  74. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_forms.scss +570 -0
  75. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_global.scss +447 -0
  76. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_grid.scss +275 -0
  77. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_icon-bar.scss +293 -0
  78. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_inline-lists.scss +57 -0
  79. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_joyride.scss +222 -0
  80. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_keystrokes.scss +61 -0
  81. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_labels.scss +105 -0
  82. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_magellan.scss +34 -0
  83. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_offcanvas.scss +510 -0
  84. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_orbit.scss +368 -0
  85. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_pagination.scss +162 -0
  86. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_panels.scss +93 -0
  87. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_pricing-tables.scss +150 -0
  88. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_progress-bars.scss +79 -0
  89. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_range-slider.scss +168 -0
  90. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_reveal.scss +220 -0
  91. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_side-nav.scss +116 -0
  92. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_split-buttons.scss +191 -0
  93. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_sub-nav.scss +125 -0
  94. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_switches.scss +226 -0
  95. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tables.scss +135 -0
  96. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tabs.scss +123 -0
  97. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_thumbs.scss +66 -0
  98. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_toolbar.scss +70 -0
  99. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_tooltips.scss +142 -0
  100. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_top-bar.scss +676 -0
  101. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_type.scss +523 -0
  102. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/foundation/components/_visibility.scss +408 -0
  103. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/installation-page.scss +171 -0
  104. data/lib/fastlane/plugin/polidea/templates/installation-page/sass/normalize.scss +425 -0
  105. data/lib/fastlane/plugin/polidea/templates/installation_template.erb +58 -0
  106. data/lib/fastlane/plugin/polidea/templates/mailgun_template.erb +1225 -0
  107. data/lib/fastlane/plugin/polidea/version.rb +5 -0
  108. metadata +323 -0
@@ -0,0 +1,53 @@
1
+ module Fastlane
2
+ module Actions
3
+ module SharedValues
4
+ BINARY_SIZE = :BINARY_SIZE
5
+ end
6
+
7
+ class GetBinarySizeAction < Action
8
+ def self.run(config)
9
+ binary_file = config[:binary]
10
+
11
+ UI.user_error!("No IPA or APK file path given, pass using `binary: 'ipa or apk path'`") unless binary_file.to_s.length > 0
12
+
13
+ binary_size = File.open(binary_file).size
14
+ binary_size_in_mb = (binary_size / 1024.0 / 1024.0).round(2)
15
+
16
+ Actions.lane_context[SharedValues::BINARY_SIZE] = binary_size
17
+ ENV[SharedValues::BINARY_SIZE.to_s] = binary_size.to_s
18
+
19
+ UI.success("Size of #{binary_file} is #{binary_size_in_mb} MB (#{binary_size} bytes)")
20
+
21
+ binary_size
22
+ end
23
+
24
+ def self.description
25
+ "Measures binary size in bytes"
26
+ end
27
+
28
+ def self.available_options
29
+ [
30
+ FastlaneCore::ConfigItem.new(key: :binary,
31
+ env_name: "",
32
+ description: ".ipa or .apk file from the build ",
33
+ optional: true,
34
+ default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] || Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH])
35
+ ]
36
+ end
37
+
38
+ def self.output
39
+ [
40
+ ['BINARY_SIZE', 'Size of .ipa/.apk in bytes']
41
+ ]
42
+ end
43
+
44
+ def self.author
45
+ "Piotrek Dubiel"
46
+ end
47
+
48
+ def self.is_supported?(platform)
49
+ [:ios, :android].include? platform
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,173 @@
1
+ # rubocop:disable Metrics/MethodLength
2
+ require 'fastlane/erb_template_helper'
3
+
4
+ module Fastlane
5
+ module Actions
6
+ class MailgunAction < Action
7
+ def self.is_supported?(platform)
8
+ true
9
+ end
10
+
11
+ def self.run(options)
12
+ Actions.verify_gem!('rest-client')
13
+ Actions.verify_gem!('premailer')
14
+ require 'rest-client'
15
+ require 'premailer'
16
+ inline_images(options)
17
+ mailgunit(options)
18
+ end
19
+
20
+ def self.description
21
+ "Send a success/error message to an email group"
22
+ end
23
+
24
+ def self.available_options
25
+ [
26
+ FastlaneCore::ConfigItem.new(key: :postmaster,
27
+ env_name: "MAILGUN_SANDBOX_POSTMASTER",
28
+ description: "Mailgun sandbox domain postmaster for your mail"),
29
+ FastlaneCore::ConfigItem.new(key: :apikey,
30
+ env_name: "MAILGUN_APIKEY",
31
+ description: "Mailgun apikey for your mail"),
32
+ FastlaneCore::ConfigItem.new(key: :to,
33
+ env_name: "MAILGUN_TO",
34
+ description: "Destination of your mail"),
35
+ FastlaneCore::ConfigItem.new(key: :from,
36
+ env_name: "MAILGUN_FROM",
37
+ optional: true,
38
+ description: "Mailgun sender name",
39
+ default_value: "Mailgun Sandbox"),
40
+ FastlaneCore::ConfigItem.new(key: :success,
41
+ env_name: "MAILGUN_SUCCESS",
42
+ description: "Was this build successful? (true/false)",
43
+ optional: true,
44
+ default_value: true,
45
+ is_string: false),
46
+ FastlaneCore::ConfigItem.new(key: :ci_build_link,
47
+ env_name: "MAILGUN_CI_BUILD_LINK",
48
+ description: "CI Build Link",
49
+ optional: true,
50
+ is_string: true),
51
+ FastlaneCore::ConfigItem.new(key: :template_path,
52
+ env_name: "MAILGUN_TEMPLATE_PATH",
53
+ description: "Mail HTML template",
54
+ optional: true,
55
+ is_string: true),
56
+ FastlaneCore::ConfigItem.new(key: :app_icon,
57
+ env_name: "MAILGUN_APP_ICON",
58
+ description: "Path to app icon file",
59
+ is_string: true,
60
+ optional: true,
61
+ default_value: Actions.lane_context[SharedValues::ICON_OUTPUT_PATH]),
62
+ FastlaneCore::ConfigItem.new(key: :app_name,
63
+ env_name: "MAILGUN_APP_NAME",
64
+ description: "Application name",
65
+ is_string: true,
66
+ default_value: Actions.lane_context[SharedValues::APP_NAME]),
67
+ FastlaneCore::ConfigItem.new(key: :app_version,
68
+ env_name: "MAILGUN_APP_VERSION",
69
+ description: "Application version",
70
+ is_string: true,
71
+ default_value: Actions.lane_context[SharedValues::APP_VERSION]),
72
+ FastlaneCore::ConfigItem.new(key: :build_number,
73
+ env_name: "MAILGUN_BUILD_NUMBER",
74
+ description: "Build number",
75
+ default_value: Actions.lane_context[SharedValues::BUILD_NUMBER]),
76
+ FastlaneCore::ConfigItem.new(key: :installation_link,
77
+ env_name: "MAILGUN_INSTALLATION_LINK",
78
+ description: "Link to installation page",
79
+ is_string: true,
80
+ default_value: Actions.lane_context[SharedValues::S3_HTML_OUTPUT_PATH]),
81
+ FastlaneCore::ConfigItem.new(key: :release_notes,
82
+ env_name: "MAILGUN_RELEASE_NOTES",
83
+ description: "Release notes",
84
+ type: Array,
85
+ optional: true,
86
+ default_value: []),
87
+ FastlaneCore::ConfigItem.new(key: :binary_size,
88
+ env_name: "MAILGUN_BINARY_SIZE",
89
+ description: "Binary size",
90
+ type: Fixnum,
91
+ default_value: Actions.lane_context[SharedValues::BINARY_SIZE]),
92
+ FastlaneCore::ConfigItem.new(key: :inline,
93
+ type: Array,
94
+ optional: true,
95
+ default_value: [])
96
+ ]
97
+ end
98
+
99
+ def self.author
100
+ "thiagolioy"
101
+ end
102
+
103
+ def self.inline_images(options)
104
+ base_path = "#{__dir__}/../templates/images"
105
+ options[:inline] = [
106
+ qr_code(options[:installation_link]),
107
+ File.new(options[:app_icon])
108
+ ]
109
+ images = [
110
+ "polidea-facebook-icon.png",
111
+ "polidea-github-icon.png",
112
+ "polidea-logo.png",
113
+ "polidea-twitter-icon.png"
114
+ ]
115
+ images << "icon-placeholder.png" unless options[:app_icon]
116
+ options[:inline].concat(images.map { |image| File.new("#{base_path}/#{image}") })
117
+ end
118
+
119
+ def self.qr_code(installation_link)
120
+ qr_code_path = "/tmp/qr_code.png"
121
+ QRGenerator.new(installation_link, false, ::ChunkyPNG::Color.rgb(103, 103, 103)).generate(qr_code_path)
122
+ File.new(qr_code_path)
123
+ end
124
+
125
+ def self.mailgunit(options)
126
+ sandbox_domain = options[:postmaster].split("@").last
127
+ body = mail_template(options)
128
+ RestClient.post "https://api:#{options[:apikey]}@api.mailgun.net/v3/#{sandbox_domain}/messages",
129
+ from: "#{options[:from]}<#{options[:postmaster]}>",
130
+ to: (options[:to]).to_s,
131
+ subject: "#{options[:app_name]} #{options[:app_version]} (#{options[:build_number]}) for #{Actions.lane_context[Actions::SharedValues::PLATFORM_NAME]} is ready to install",
132
+ html: body,
133
+ inline: options[:inline]
134
+ return body
135
+ end
136
+
137
+ def self.mail_template(options)
138
+ hash = {
139
+ author: Actions.git_author_email,
140
+ last_commit: Actions.last_git_commit_message,
141
+ is_android: Actions.lane_context[Actions::SharedValues::PLATFORM_NAME] == :android,
142
+ app_icon: File.basename(options[:app_icon]),
143
+ app_name: options[:app_name],
144
+ app_version: options[:app_version],
145
+ build_number: options[:build_number],
146
+ installation_link: options[:installation_link],
147
+ release_notes: options[:release_notes],
148
+ platform: Actions.lane_context[Actions::SharedValues::PLATFORM_NAME],
149
+ release_date: DateTime.now.strftime('%b %d, %Y'),
150
+ binary_size: (options[:binary_size] / 1024.0 / 1024.0).round(2).to_s
151
+ }
152
+ hash[:success] = options[:success]
153
+ hash[:ci_build_link] = options[:ci_build_link]
154
+
155
+ # grabs module
156
+ eth = Fastlane::ErbTemplateHelper
157
+ # create html from template
158
+ html_template_path = options[:template_path]
159
+ if html_template_path && File.exist?(html_template_path)
160
+ html_template = eth.load_from_path(html_template_path)
161
+ else
162
+ html_template = eth.load_from_path("#{__dir__}/../templates/mailgun_template.erb")
163
+ end
164
+ premailer = Premailer.new(
165
+ eth.render(html_template, hash),
166
+ { warn_level: Premailer::Warnings::SAFE, with_html_string: true }
167
+ )
168
+ premailer.to_inline_css
169
+ end
170
+ end
171
+ end
172
+ end
173
+ # rubocop:enable Metrics/MethodLength
@@ -0,0 +1,248 @@
1
+ # rubocop:disable Metrics/MethodLength
2
+
3
+ require 'net/http'
4
+ require 'uri'
5
+ require 'json'
6
+
7
+ module Fastlane
8
+ module Actions
9
+ class PolideaStoreAction < Action
10
+ def self.run(params)
11
+ platform = Actions.lane_context[Actions::SharedValues::PLATFORM_NAME].to_sym
12
+ validate(platform, params)
13
+ config = get_config(platform, params)
14
+ app_name, app_identifier, version = notify(platform, config)
15
+
16
+ UI.success("Successfully uploaded #{app_name} (#{app_identifier})")
17
+ UI.success("version: #{version}")
18
+ UI.success("using icon from #{params[:icon_url]}")
19
+ UI.success("using plist from #{params[:plist_url]}") if platform == :ios
20
+ UI.success("with release notes: #{params[:release_notes]}") if params[:release_notes]
21
+ end
22
+
23
+ #####################################################
24
+ # @!group Documentation
25
+ #####################################################
26
+
27
+ def self.description
28
+ "Polidea Store upload action"
29
+ end
30
+
31
+ def self.details
32
+ "Notify Polidea Store about new app version"
33
+ end
34
+
35
+ def self.author
36
+ ["Piotrek Dubiel"]
37
+ end
38
+
39
+ def self.available_options
40
+ [
41
+ FastlaneCore::ConfigItem.new(key: :api_token,
42
+ env_name: "POLIDEA_STORE_API_TOKEN",
43
+ description: "API Token for Polidea Store",
44
+ verify_block: proc do |value|
45
+ UI.user_error!("No API token for Polidea Store given, pass using `api_token: 'token'`") unless value and !value.empty?
46
+ end),
47
+ FastlaneCore::ConfigItem.new(key: :ipa,
48
+ env_name: "",
49
+ description: ".ipa file for the build ",
50
+ optional: true,
51
+ default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH]),
52
+ FastlaneCore::ConfigItem.new(key: :apk,
53
+ env_name: "",
54
+ description: ".apk file for the build ",
55
+ optional: true,
56
+ default_value: Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH]),
57
+ FastlaneCore::ConfigItem.new(key: :plist_url,
58
+ env_name: "POLIDEA_STORE_PLIST_URL",
59
+ description: "Url to uploaded plist",
60
+ default_value: Actions.lane_context[SharedValues::S3_PLIST_OUTPUT_PATH],
61
+ verify_block: proc do |value|
62
+ UI.user_error!("No plist url given, pass using `plist_url: 'url'` or make sure s3 action succeded and exposed S3_PLIST_OUTPUT_PATH shared value") unless value and !value.empty?
63
+ end),
64
+ FastlaneCore::ConfigItem.new(key: :apk_url,
65
+ env_name: "POLIDEA_STORE_APK_URL",
66
+ description: "Url to uploaded apk",
67
+ default_value: Actions.lane_context[SharedValues::S3_APK_OUTPUT_PATH],
68
+ verify_block: proc do |value|
69
+ UI.user_error!("No apk url given, pass using `apk_url: 'url'` or make sure s3 action succeded and exposed S3_APK_OUTPUT_PATH shared value") unless value and !value.empty?
70
+ end),
71
+ FastlaneCore::ConfigItem.new(key: :icon_url,
72
+ env_name: "POLIDEA_STORE_ICON_URL",
73
+ description: "Url to uploaded app icon",
74
+ default_value: Actions.lane_context[SharedValues::S3_ICON_OUTPUT_PATH],
75
+ verify_block: proc do |value|
76
+ UI.user_error!("No icon url given, pass using `icon_url: 'url'` or make sure s3 action succeded and exposed S3_ICON_OUTPUT_PATH shared value") unless value and !value.empty?
77
+ end),
78
+ FastlaneCore::ConfigItem.new(key: :release_notes,
79
+ env_name: "POLIDEA_STORE_RELEASE_NOTES",
80
+ description: "Release notes to be attached to uploaded version",
81
+ is_string: true,
82
+ optional: true),
83
+ FastlaneCore::ConfigItem.new(key: :app_name,
84
+ env_name: "",
85
+ description: "Application name (defaults to bundle name on iOS)", # TODO: edit for Android
86
+ is_string: true,
87
+ optional: true),
88
+ FastlaneCore::ConfigItem.new(key: :bundle_id,
89
+ env_name: "",
90
+ description: "Bundle id",
91
+ is_string: true,
92
+ optional: true),
93
+ FastlaneCore::ConfigItem.new(key: :bundle_version,
94
+ env_name: "",
95
+ description: "Bundle version", # TODO: edit for Android
96
+ is_string: true,
97
+ optional: true),
98
+ FastlaneCore::ConfigItem.new(key: :package_name,
99
+ env_name: "",
100
+ description: "Package name",
101
+ is_string: true,
102
+ optional: true),
103
+ FastlaneCore::ConfigItem.new(key: :version_name,
104
+ env_name: "",
105
+ description: "Version name",
106
+ is_string: true,
107
+ optional: true),
108
+ FastlaneCore::ConfigItem.new(key: :version_code,
109
+ env_name: "",
110
+ description: "Version code",
111
+ type: Fixnum,
112
+ optional: true),
113
+ FastlaneCore::ConfigItem.new(key: :binary_size,
114
+ env_name: "POLIDEA_STORE_RELESASE_NOTES",
115
+ description: ".ipa/.apk binary size in bytes",
116
+ type: Fixnum,
117
+ optional: true)
118
+ ]
119
+ end
120
+
121
+ def self.is_supported?(platform)
122
+ [:ios, :android].include? platform
123
+ end
124
+
125
+ def self.validate(platform, params)
126
+ binary_size = params[:binary_size] || Actions.lane_context[Actions::SharedValues::BINARY_SIZE]
127
+ UI.user_error!("No binary size given, pass using `binary_size: bytes` or make sure get_binary_size action succeded and exposed BINARY_SIZE shared value") unless binary_size and !binary_size.nil?
128
+
129
+ case platform
130
+ when :android
131
+ UI.user_error!("No .apk file given, pass using `apk: 'apk path'` or make sure gradle action succeded and exposed GRADLE_APK_OUTPUT_PATH shared value") unless params[:apk] and !params[:apk].empty?
132
+ when :ios
133
+ UI.user_error!("No .ipa file given, pass using `ipa: 'ipa path'` or make sure gym action succeded and exposed IPA_OUTPUT_PATH shared value") unless params[:ipa] and !params[:ipa].empty?
134
+ end
135
+ end
136
+
137
+ def self.get_config(platform, params)
138
+ binary_size = params[:binary_size] || Actions.lane_context[Actions::SharedValues::BINARY_SIZE]
139
+
140
+ case platform
141
+ when :ios
142
+ info = FastlaneCore::IpaFileAnalyser.fetch_info_plist_file(params[:ipa])
143
+ app_name = params[:app_name] || info['CFBundleName']
144
+ app_identifier = params[:bundle_id] || info['CFBundleIdentifier']
145
+ version = params[:bundle_version] || info['CFBundleShortVersionString']
146
+ href = params[:plist_url]
147
+ url_scheme = get_url_scheme(info)
148
+ when :android
149
+ manifest = Android::Apk.new(params[:apk]).manifest
150
+ app_name = params[:app_name] || manifest.label
151
+ app_identifier = params[:package_name] || manifest.package_name
152
+ version = params[:version_name] || manifest.version_name
153
+ version_code = params[:version_code] || manifest.version_code
154
+ href = params[:apk_url]
155
+ end
156
+
157
+ config = {
158
+ api_token: params[:api_token],
159
+ app_name: app_name,
160
+ app_identifier: app_identifier,
161
+ version: version,
162
+ version_code: version_code,
163
+ icon_url: params[:icon_url],
164
+ href: href,
165
+ release_notes: params[:release_notes],
166
+ binary_size: binary_size,
167
+ url_scheme: url_scheme
168
+ }
169
+
170
+ return config
171
+ end
172
+
173
+ def self.notify(platform, params)
174
+ uri = URI.parse(url(platform, params[:app_identifier]))
175
+
176
+ version = {
177
+ version: params[:version],
178
+ releaseNotes: params[:release_notes],
179
+ href: params[:href],
180
+ bytes: params[:binary_size]
181
+ }
182
+
183
+ version[:prefixSchema] = params[:url_scheme] if platform == :ios
184
+ version[:versionCode] = params[:version_code] if platform == :android
185
+
186
+ http = Net::HTTP.new(uri.host, uri.port)
187
+ http.use_ssl = true
188
+
189
+ req = create_request(uri, params[:api_token], {
190
+ name: params[:app_name],
191
+ icon: {
192
+ href: params[:icon_url]
193
+ },
194
+ versions: [version]
195
+ })
196
+
197
+ response = http.request(req)
198
+ unless response.code == "204"
199
+ UI.user_error! "Polidea Store backend responded with [#{response.code}] #{response.body}"
200
+ end
201
+
202
+ return params[:app_name], params[:app_identifier], params[:version]
203
+ end
204
+ private_class_method :notify
205
+
206
+ def self.url(platform, app_identifier)
207
+ "#{base_url}/#{platform}/apps/#{app_identifier}/versions"
208
+ end
209
+ private_class_method :url
210
+
211
+ def self.base_url
212
+ "https://polideastore.herokuapp.com"
213
+ # "https://polideastore-staging.herokuapp.com"
214
+ end
215
+ private_class_method :base_url
216
+
217
+ def self.create_request(uri, upload_token, params)
218
+ req = Net::HTTP::Post.new(uri.request_uri)
219
+ req['Content-Type'] = 'application/json'
220
+ req['Upload-Token'] = upload_token
221
+ req.body = JSON.generate(params)
222
+ req
223
+ end
224
+ private_class_method :create_request
225
+
226
+ def self.itms_href(plist_url)
227
+ "itms-services://?action=download-manifest&url=#{plist_url}"
228
+ end
229
+ private_class_method :itms_href
230
+
231
+ def self.get_url_scheme(plist)
232
+ url_scheme = nil
233
+ url_types = plist['CFBundleURLTypes']
234
+ unless url_types.nil?
235
+ url_type = url_types[0]
236
+ url_schemes = url_type['CFBundleURLSchemes']
237
+ unless url_schemes.nil?
238
+ url_scheme = url_schemes[0]
239
+ end
240
+ end
241
+ url_scheme
242
+ end
243
+ private_class_method :get_url_scheme
244
+ end
245
+ end
246
+ end
247
+
248
+ # rubocop:enable Metrics/MethodLength