motion-sparkle-sandbox 2.0.0 → 2.0.1
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 +4 -4
- data/.gitignore +4 -0
- data/.rspec +2 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +183 -0
- data/.ruby-version +1 -0
- data/.travis.yml +37 -0
- data/Gemfile +13 -3
- data/README.md +73 -71
- data/Rakefile +2 -7
- data/bin/bundle +103 -0
- data/bin/byebug +29 -0
- data/bin/coderay +29 -0
- data/bin/fuzzy_match +29 -0
- data/bin/htmldiff +29 -0
- data/bin/httpclient +29 -0
- data/bin/ldiff +29 -0
- data/bin/pod +29 -0
- data/bin/pry +29 -0
- data/bin/rake +29 -0
- data/bin/rspec +29 -0
- data/bin/rubocop +29 -0
- data/bin/ruby-parse +29 -0
- data/bin/ruby-rewrite +29 -0
- data/bin/sandbox-pod +29 -0
- data/bin/xcodeproj +29 -0
- data/lib/motion/project/appcast.rb +177 -104
- data/lib/motion/project/indent_string.rb +18 -0
- data/lib/motion/project/install.rb +22 -66
- data/lib/motion/project/package.rb +52 -36
- data/lib/motion/project/project.rb +41 -51
- data/lib/motion/project/rake_tasks.rb +28 -32
- data/lib/motion/project/setup.rb +67 -73
- data/lib/motion/project/sparkle.rb +244 -148
- data/lib/motion/project/templates.rb +24 -22
- data/lib/motion-sparkle-sandbox/version.rb +5 -0
- data/lib/motion-sparkle-sandbox.rb +19 -3
- data/motion-sparkle-sandbox.gemspec +26 -16
- data/sample-app/.gitignore +9 -0
- data/sample-app/Gemfile +8 -0
- data/sample-app/README.md +87 -0
- data/sample-app/Rakefile +44 -0
- data/sample-app/app/app_delegate.rb +15 -0
- data/sample-app/app/menu.rb +155 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/1024x1024.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Contents.json +68 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_128x128.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_128x128@2x.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_16x16.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_16x16@2x.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_256x256.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_256x256@2x.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_32x32.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_32x32@2x.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_512x512.png +0 -0
- data/sample-app/resources/Assets.xcassets/AppIcon.appiconset/Icon_512x512@2x.png +0 -0
- data/sample-app/resources/Assets.xcassets/Contents.json +6 -0
- data/sample-app/resources/Credits.rtf +29 -0
- data/sample-app/spec/main_spec.rb +11 -0
- data/spec/setup_spec.rb +67 -0
- data/spec/sparkle_spec.rb +113 -65
- data/spec/spec_helper.rb +94 -29
- data/spec/spec_utils.rb +32 -0
- data/vendor/.git_keep +0 -0
- metadata +78 -14
- data/vendor/README.md +0 -34
- data/vendor/Sparkle.zip +0 -0
- data/vendor/codesign_embedded_executable +0 -46
- data/vendor/generate_appcast +0 -0
@@ -1,189 +1,285 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Motion
|
4
|
+
module Project
|
5
|
+
# rubocop:disable Metrics/ClassLength
|
6
|
+
class Sparkle
|
7
|
+
SPARKLE_ROOT = 'sparkle'
|
8
|
+
CONFIG_PATH = "#{SPARKLE_ROOT}/config"
|
9
|
+
RELEASE_PATH = "#{SPARKLE_ROOT}/release"
|
10
|
+
EDDSA_PRIV_KEY = 'eddsa_priv.key'
|
11
|
+
DSA_PRIV_KEY = 'dsa_priv.pem'
|
12
|
+
|
13
|
+
def initialize(config)
|
14
|
+
@config = config
|
15
|
+
# verify_installation
|
16
|
+
end
|
3
17
|
|
4
|
-
|
5
|
-
|
6
|
-
|
18
|
+
def appcast
|
19
|
+
@appcast ||= Appcast.new
|
20
|
+
end
|
7
21
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
22
|
+
def publish(key, value)
|
23
|
+
case key
|
24
|
+
when :public_key
|
25
|
+
self.public_EdDSA_key = value
|
26
|
+
when :base_url
|
27
|
+
appcast.base_url = value
|
28
|
+
self.feed_url = appcast.feed_url
|
29
|
+
when :feed_base_url
|
30
|
+
appcast.feed_base_url = value
|
31
|
+
self.feed_url = appcast.feed_url
|
32
|
+
when :feed_filename
|
33
|
+
appcast.feed_filename = value
|
34
|
+
self.feed_url = appcast.feed_url
|
35
|
+
when :version
|
36
|
+
version value
|
37
|
+
when :package_base_url, :package_filename, :notes_base_url, :notes_filename, :use_exported_private_key
|
38
|
+
appcast.send "#{key}=", value
|
39
|
+
when :archive_folder
|
40
|
+
appcast.archive_folder = value
|
41
|
+
else
|
42
|
+
raise "Unknown Sparkle config option #{key}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
alias release publish
|
13
46
|
|
14
|
-
|
15
|
-
|
16
|
-
|
47
|
+
def version(vstring)
|
48
|
+
@config.version = vstring.to_s
|
49
|
+
@config.short_version = vstring.to_s
|
50
|
+
end
|
17
51
|
|
18
|
-
|
19
|
-
|
20
|
-
when :public_key
|
21
|
-
public_key value
|
22
|
-
when :base_url
|
23
|
-
appcast.base_url = value
|
24
|
-
feed_url appcast.feed_url
|
25
|
-
when :feed_base_url
|
26
|
-
appcast.feed_base_url = value
|
27
|
-
feed_url appcast.feed_url
|
28
|
-
when :feed_filename
|
29
|
-
appcast.feed_filename = value
|
30
|
-
feed_url appcast.feed_url
|
31
|
-
when :version
|
32
|
-
version value
|
33
|
-
when :notes_base_url, :package_base_url, :notes_filename, :package_filename
|
34
|
-
appcast.send "#{key}=", value
|
35
|
-
when :archive_folder
|
36
|
-
appcast.archive_folder = value
|
37
|
-
else
|
38
|
-
raise "Unknown Sparkle config option #{key}"
|
52
|
+
def version_string
|
53
|
+
"#{@config.short_version} (#{@config.version})"
|
39
54
|
end
|
40
|
-
end
|
41
|
-
alias_method :release, :publish
|
42
55
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
56
|
+
def feed_url
|
57
|
+
@config.info_plist['SUFeedURL']
|
58
|
+
end
|
47
59
|
|
48
|
-
|
49
|
-
|
50
|
-
|
60
|
+
def feed_url=(url)
|
61
|
+
@config.info_plist['SUFeedURL'] = url
|
62
|
+
end
|
51
63
|
|
52
|
-
|
53
|
-
|
54
|
-
|
64
|
+
# rubocop:disable Naming/MethodName
|
65
|
+
def public_EdDSA_key
|
66
|
+
@config.info_plist['SUPublicEDKey']
|
67
|
+
end
|
55
68
|
|
56
|
-
|
57
|
-
|
58
|
-
|
69
|
+
def public_EdDSA_key=(key)
|
70
|
+
@config.info_plist['SUPublicEDKey'] = key
|
71
|
+
end
|
72
|
+
# rubocop:enable Naming/MethodName
|
73
|
+
|
74
|
+
# File manipulation and certificates
|
59
75
|
|
60
|
-
|
76
|
+
def add_to_gitignore
|
77
|
+
@ignorable = ['sparkle/release', 'sparkle/release/*', private_key_path]
|
78
|
+
return unless File.exist?(gitignore_path)
|
61
79
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
80
|
+
File.open(gitignore_path, 'r') do |f|
|
81
|
+
f.each_line do |line|
|
82
|
+
@ignorable.delete(line) if @ignorable.include?(line)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
if @ignorable.any?
|
86
|
+
File.open(gitignore_path, 'a') do |f|
|
87
|
+
@ignorable.each do |i|
|
88
|
+
f << "#{i}\n"
|
89
|
+
end
|
90
|
+
end
|
68
91
|
end
|
92
|
+
`cat #{gitignore_path}`
|
93
|
+
end
|
94
|
+
|
95
|
+
def create_sparkle_folder
|
96
|
+
create_config_folder
|
97
|
+
create_release_folder
|
69
98
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
99
|
+
|
100
|
+
def generate_keys_app
|
101
|
+
"#{vendored_sparkle_path}/bin/generate_keys"
|
102
|
+
end
|
103
|
+
|
104
|
+
# rubocop:disable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
105
|
+
def generate_keys
|
106
|
+
return false unless config_ok?
|
107
|
+
|
108
|
+
FileUtils.mkdir_p sparkle_config_path unless File.exist?(sparkle_config_path)
|
109
|
+
|
110
|
+
if appcast.use_exported_private_key && File.exist?(private_key_path)
|
111
|
+
App.info 'Sparkle', "Private key already exported at `#{private_key_path}` and will be used."
|
112
|
+
if public_EdDSA_key.present?
|
113
|
+
App.info '', <<~EXISTS
|
114
|
+
SUPublicEDKey already set
|
115
|
+
|
116
|
+
Be careful not to override or lose your certificates.
|
117
|
+
Delete this file if you're sure.
|
118
|
+
Aborting (no action performed)
|
119
|
+
EXISTS
|
120
|
+
.indent(11, skip_first_line: true)
|
121
|
+
else
|
122
|
+
App.info '', <<~EXISTS
|
123
|
+
SUPublicEDKey NOT SET
|
124
|
+
|
125
|
+
You can easily add the `SUPublicEDKey` by publishing the key in your Rakefile:
|
126
|
+
|
127
|
+
app.sparkle do
|
128
|
+
...
|
129
|
+
publish :public_key, 'PUBLIC_KEY'
|
130
|
+
end
|
131
|
+
|
132
|
+
Be careful not to override or lose your certificates.
|
133
|
+
Delete this file if you're sure.
|
134
|
+
Aborting (no action performed)
|
135
|
+
EXISTS
|
136
|
+
.indent(11, skip_first_line: true)
|
137
|
+
end
|
138
|
+
|
139
|
+
return
|
73
140
|
end
|
74
|
-
end if @ignorable.any?
|
75
|
-
`cat #{gitignore_path}`
|
76
|
-
end
|
77
141
|
|
78
|
-
|
79
|
-
create_config_folder
|
80
|
-
create_release_folder
|
81
|
-
end
|
142
|
+
results, status = Open3.capture2e(generate_keys_app, '-p')
|
82
143
|
|
83
|
-
|
84
|
-
|
85
|
-
end
|
144
|
+
if status.success?
|
145
|
+
App.info 'Sparkle', 'Public/private keys found in the keychain'
|
86
146
|
|
87
|
-
|
88
|
-
|
89
|
-
|
147
|
+
if results.strip == public_EdDSA_key
|
148
|
+
App.info 'Sparkle', 'Keychain public key matches `SUPublicEDKey`'
|
149
|
+
|
150
|
+
if appcast.use_exported_private_key && !File.exist?(private_key_path)
|
151
|
+
# export the private key from the keychain
|
152
|
+
end
|
153
|
+
else
|
154
|
+
App.fail <<~NOT_MATCHED
|
155
|
+
Keychain public key DOES NOT match `SUPublicEDKey`
|
156
|
+
|
157
|
+
Keychain public key: #{results.strip}
|
158
|
+
SUPublicEDKey public key: #{public_EdDSA_key}
|
159
|
+
|
160
|
+
NOT_MATCHED
|
161
|
+
.indent(11, skip_first_line: true)
|
162
|
+
end
|
90
163
|
|
91
|
-
def generate_keys
|
92
|
-
return false unless config_ok?
|
93
|
-
unless File.exist?(sparkle_config_path)
|
94
|
-
FileUtils.mkdir_p sparkle_config_path
|
95
|
-
end
|
96
|
-
[dsa_param_path, private_key_path, public_key_path].each do |file|
|
97
|
-
if File.exist? file
|
98
|
-
App.info "Sparkle", "Error: file exists.
|
99
|
-
There's already a '#{file}'. Be careful not to override or lose your certificates. \n
|
100
|
-
Delete this file if you're sure. \n
|
101
|
-
Aborting (no action performed)
|
102
|
-
"
|
103
164
|
return
|
104
165
|
end
|
166
|
+
|
167
|
+
create_private_key
|
168
|
+
export_private_key if appcast.use_exported_private_key
|
105
169
|
end
|
106
|
-
|
107
|
-
`#{openssl} gendsa #{dsa_param_path} -out #{private_key_path}`
|
108
|
-
generate_public_key
|
109
|
-
`rm #{dsa_param_path}`
|
110
|
-
App.info "Sparkle", "Generated private and public certificates.
|
111
|
-
Details:
|
112
|
-
* Private certificate: ./#{private_key_path}
|
113
|
-
* Public certificate: ./#{public_key_path}
|
114
|
-
Warning:
|
115
|
-
ADD YOUR PRIVATE CERTIFICATE TO YOUR `.gitignore` OR EQUIVALENT AND BACK IT UP!
|
116
|
-
KEEP IT PRIVATE AND SAFE!
|
117
|
-
If you lose it, your users will be unable to upgrade.
|
118
|
-
"
|
119
|
-
end
|
170
|
+
# rubocop:enable Metrics/PerceivedComplexity, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
120
171
|
|
121
|
-
|
122
|
-
|
123
|
-
|
172
|
+
# Create the private key in the keychain
|
173
|
+
def create_private_key
|
174
|
+
App.info 'Sparkle',
|
175
|
+
'Generating a new signing key into the Keychain. This may take a moment, depending on your machine.'
|
176
|
+
results, status = Open3.capture2e(generate_keys_app)
|
124
177
|
|
125
|
-
|
178
|
+
App.fail 'Sparkle could not generate keys' unless status.success?
|
126
179
|
|
127
|
-
|
128
|
-
|
129
|
-
end
|
180
|
+
puts
|
181
|
+
puts results.lines[1..].join.indent(11)
|
130
182
|
|
131
|
-
|
132
|
-
|
133
|
-
end
|
183
|
+
# Extract the public key so we can use it in message
|
184
|
+
results, status = Open3.capture2e(generate_keys_app, '-p')
|
134
185
|
|
135
|
-
|
136
|
-
@vendor_path ||= Pathname.new(project_path + 'vendor/')
|
137
|
-
end
|
186
|
+
App.fail 'Unable to read public key' unless status.success?
|
138
187
|
|
139
|
-
|
140
|
-
|
141
|
-
end
|
188
|
+
puts <<~KEYS
|
189
|
+
You can easily add the `SUPublicEDKey` by publishing the key in your Rakefile:
|
142
190
|
|
143
|
-
|
144
|
-
|
145
|
-
|
191
|
+
app.sparkle do
|
192
|
+
...
|
193
|
+
publish :public_key, '#{results.strip}'
|
194
|
+
end
|
146
195
|
|
147
|
-
|
148
|
-
|
149
|
-
|
196
|
+
KEYS
|
197
|
+
.indent(11)
|
198
|
+
end
|
150
199
|
|
151
|
-
|
152
|
-
|
153
|
-
|
200
|
+
# Export the private key from the keychain
|
201
|
+
def export_private_key
|
202
|
+
_results, status = Open3.capture2e(generate_keys_app, '-x', private_key_path.to_s)
|
154
203
|
|
155
|
-
|
156
|
-
sparkle_config_path + "dsa_priv.pem"
|
157
|
-
end
|
204
|
+
App.fail 'Unable to export private key' unless status.success?
|
158
205
|
|
159
|
-
|
160
|
-
|
161
|
-
project_path + "resources/#{pub_key_file}"
|
162
|
-
end
|
206
|
+
App.info 'Sparkle', 'Private key has been exported from the keychain into the file:'
|
207
|
+
puts <<~KEYS
|
163
208
|
|
164
|
-
|
165
|
-
Pathname.new @config.app_bundle_raw('MacOSX')
|
166
|
-
end
|
209
|
+
./#{private_key_path}
|
167
210
|
|
168
|
-
|
169
|
-
|
170
|
-
|
211
|
+
ADD THIS PRIVATE KEY TO YOUR `.gitignore` OR EQUIVALENT AND BACK IT UP!
|
212
|
+
KEEP IT PRIVATE AND SAFE!
|
213
|
+
If you lose it, your users will be unable to upgrade, unless you used Apple code signing.
|
214
|
+
See https://sparkle-project.org/documentation/ for details
|
215
|
+
KEYS
|
216
|
+
.indent(11)
|
217
|
+
end
|
171
218
|
|
172
|
-
|
173
|
-
File.basename(app_bundle_path, '.app')
|
174
|
-
end
|
219
|
+
# A few helpers
|
175
220
|
|
176
|
-
|
177
|
-
|
178
|
-
|
221
|
+
def project_path
|
222
|
+
@project_path ||= Pathname.new(@config.project_dir)
|
223
|
+
end
|
179
224
|
|
180
|
-
|
181
|
-
|
182
|
-
|
225
|
+
def vendor_path
|
226
|
+
@vendor_path ||= project_path.join('vendor')
|
227
|
+
end
|
183
228
|
|
184
|
-
|
185
|
-
|
186
|
-
|
229
|
+
def gitignore_path
|
230
|
+
project_path.join('.gitignore')
|
231
|
+
end
|
232
|
+
|
233
|
+
def sparkle_release_path
|
234
|
+
project_path.join(RELEASE_PATH)
|
235
|
+
end
|
236
|
+
|
237
|
+
def sparkle_config_path
|
238
|
+
project_path.join(CONFIG_PATH)
|
239
|
+
end
|
240
|
+
|
241
|
+
def private_key_path
|
242
|
+
sparkle_config_path.join(EDDSA_PRIV_KEY)
|
243
|
+
end
|
244
|
+
|
245
|
+
def legacy_private_key_path
|
246
|
+
sparkle_config_path.join(DSA_PRIV_KEY)
|
247
|
+
end
|
248
|
+
|
249
|
+
def app_bundle_path
|
250
|
+
Pathname.new(@config.app_bundle_raw('MacOSX'))
|
251
|
+
end
|
252
|
+
|
253
|
+
def app_release_path
|
254
|
+
app_bundle_path.parent.to_s
|
255
|
+
end
|
256
|
+
|
257
|
+
def app_name
|
258
|
+
File.basename(app_bundle_path, '.app')
|
259
|
+
end
|
260
|
+
|
261
|
+
def zip_file
|
262
|
+
appcast.package_filename || "#{app_name}.#{@config.short_version}.zip"
|
263
|
+
end
|
264
|
+
|
265
|
+
def archive_folder
|
266
|
+
appcast.archive_folder
|
267
|
+
end
|
268
|
+
|
269
|
+
def app_file
|
270
|
+
"#{app_name}.app"
|
271
|
+
end
|
187
272
|
|
273
|
+
private
|
274
|
+
|
275
|
+
def create_config_folder
|
276
|
+
FileUtils.mkdir_p(sparkle_config_path) unless File.exist?(sparkle_config_path)
|
277
|
+
end
|
278
|
+
|
279
|
+
def create_release_folder
|
280
|
+
FileUtils.mkdir_p(sparkle_release_path) unless File.exist?(sparkle_release_path)
|
281
|
+
end
|
282
|
+
end
|
283
|
+
# rubocop:enable Metrics/ClassLength
|
188
284
|
end
|
189
285
|
end
|
@@ -1,34 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'erb'
|
2
4
|
require 'rexml/document'
|
3
5
|
|
4
|
-
module Motion
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
module Motion
|
7
|
+
module Project
|
8
|
+
class Sparkle
|
9
|
+
TEMPLATE_PATHS = [
|
10
|
+
File.expand_path(File.join(__FILE__, '../appcast'))
|
11
|
+
].freeze
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
def all_templates
|
14
|
+
@all_templates ||= begin
|
15
|
+
templates = {}
|
16
|
+
TEMPLATE_PATHS.map { |path| Dir.glob("#{path}/*") }.flatten.each do |template_path|
|
17
|
+
templates[File.basename(template_path)] = template_path
|
18
|
+
end
|
19
|
+
templates
|
16
20
|
end
|
17
|
-
templates
|
18
21
|
end
|
19
|
-
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
def copy_templates(force = false)
|
24
|
+
all_templates.each_pair do |tmpl, path|
|
25
|
+
result = "#{sparkle_config_path}/#{tmpl}"
|
26
|
+
if File.exist?(result) && !force
|
27
|
+
App.info 'Exists', result
|
28
|
+
else
|
29
|
+
FileUtils.cp(path, "#{sparkle_config_path}/")
|
30
|
+
App.info 'Create', "./#{sparkle_config_path}/#{tmpl}"
|
31
|
+
end
|
29
32
|
end
|
30
33
|
end
|
31
34
|
end
|
32
|
-
|
33
35
|
end
|
34
36
|
end
|
@@ -1,6 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
raise 'This file must be required within a RubyMotion project Rakefile.' unless defined?(Motion::Project::Config)
|
4
|
+
|
5
|
+
require 'motion-cocoapods'
|
4
6
|
|
5
7
|
require 'motion/project/sparkle'
|
6
8
|
require 'motion/project/install'
|
@@ -10,3 +12,17 @@ require 'motion/project/templates'
|
|
10
12
|
require 'motion/project/appcast'
|
11
13
|
require 'motion/project/project'
|
12
14
|
require 'motion/project/rake_tasks'
|
15
|
+
require 'motion/project/indent_string'
|
16
|
+
|
17
|
+
lib_dir_path = File.dirname(File.expand_path(__FILE__))
|
18
|
+
|
19
|
+
POD_VERSION = '~> 2.0.0'
|
20
|
+
|
21
|
+
unless @running_specs
|
22
|
+
Motion::Project::App.setup do |app|
|
23
|
+
app.files.unshift(Dir.glob(File.join(lib_dir_path, 'motion-sparkle-sandbox/**/*.rb')))
|
24
|
+
app.pods do
|
25
|
+
pod 'Sparkle', POD_VERSION
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,21 +1,31 @@
|
|
1
|
-
#
|
2
|
-
module ::Motion; module Project; class Config
|
3
|
-
def self.variable(*); end
|
4
|
-
end; end; end
|
1
|
+
# frozen_string_literal: true
|
5
2
|
|
6
|
-
|
7
|
-
|
3
|
+
module Motion
|
4
|
+
module Project
|
5
|
+
# This is just so that the source file can be loaded
|
6
|
+
class Config
|
7
|
+
def self.variable(*); end
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# require 'date'
|
13
|
+
# $:.unshift File.expand_path('../lib', __FILE__)
|
14
|
+
require File.expand_path('lib/motion-sparkle-sandbox/version.rb', __dir__)
|
8
15
|
|
9
16
|
Gem::Specification.new do |spec|
|
10
|
-
spec.name
|
11
|
-
spec.version
|
12
|
-
spec.
|
13
|
-
spec.
|
14
|
-
spec.
|
15
|
-
spec.
|
16
|
-
spec.
|
17
|
-
spec.
|
18
|
-
|
19
|
-
spec.files
|
17
|
+
spec.name = 'motion-sparkle-sandbox'
|
18
|
+
spec.version = MotionSparkleSandbox::VERSION
|
19
|
+
spec.authors = ['Brett Walker', 'Alexandre L. Solleiro']
|
20
|
+
spec.email = ['github@digitalmoksha.com', 'alex@webcracy.org']
|
21
|
+
spec.summary = 'Sparkle (sandboxed) integration for Rubymotion projects'
|
22
|
+
spec.description = 'motion-sparkle-sandbox makes it easy to use the sandboxed version of Sparkle in your RubyMotion macOS apps'
|
23
|
+
spec.homepage = 'https://github.com/digitalmoksha/motion-sparkle-sandbox'
|
24
|
+
spec.license = 'MIT'
|
25
|
+
|
26
|
+
spec.files = `git ls-files`.split("\n")
|
27
|
+
spec.test_files = Dir.glob('spec/**/*.rb')
|
20
28
|
spec.require_paths = ['lib']
|
29
|
+
|
30
|
+
spec.add_dependency 'motion-cocoapods'
|
21
31
|
end
|