app-info 2.0.0.beta4 → 2.0.0.beta7

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
  SHA256:
3
- metadata.gz: 5d706f0c25f15d80690f57b9315fd3e2e1a08f4288d591a300d5d0d5a8a134f4
4
- data.tar.gz: 4259e76abf048e403f43ef99caa543b6f89ec4922f19188625b075d11786efa4
3
+ metadata.gz: 38ac4cbe16bdedd57c08eb1908f7fdd9789f9dfc4134ccf7ab8bbd823799c991
4
+ data.tar.gz: 075cc6aaafe184d7913a576d16e18e3469190fb6129d8debba0a07a098a7c8ac
5
5
  SHA512:
6
- metadata.gz: 9d67414e33f673066bfe14b277388a29eae8049b946c94a1e2a344e6ed5e992a7d05004140c7c58460074583e5811b3b064a1b8e37f6bb36c2ce8f6f04f02641
7
- data.tar.gz: 0a052dfd02187fcd03930359b1ecfcf840e75d881eb8687f84d607c047e36b26d0c169f55992f4649ba09b86f56790f33679e3df8625acfb8713db284625533f
6
+ metadata.gz: 2f1e75751e4495fabf29e2c289d2c4e3b312e64642477e233aff8622035f63232731dab40e86eb16a0f6092baf95c5c92a65827f44a34243e3faf225f571963e
7
+ data.tar.gz: 14933a76b8a3dcb8a4ed90a125144098fd8c6154fe6dcaa6ba9ed083054c524b2634860f990a575bcb40bb037690ae8b1b2958f8fbd52cd94b6e360d0ab5b8fa
@@ -17,9 +17,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
17
17
 
18
18
  ### Added
19
19
 
20
- - Added .dSYM.zip format support. #[8](https://github.com/icyleaf/app-info/issues/8)
20
+ - Added iOS .dSYM.zip format support. #[8](https://github.com/icyleaf/app-info/issues/8)
21
21
  - Added parse mobileprovision in Linux. #[10](https://github.com/icyleaf/app_info/pull/10)
22
22
  - Added `AppInfo.file_type` to detect file type.
23
+ - Added detect and simple parse Android proguard file support. #[15](https://github.com/icyleaf/app_info/pull/15)
23
24
 
24
25
  ## [1.1.2] (2019-09-19)
25
26
 
data/Rakefile CHANGED
@@ -6,3 +6,8 @@ require 'rspec/core/rake_task'
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
8
8
  task default: :spec
9
+
10
+ task :try do
11
+ a = AppInfo.parse('./spec/fixtures/proguards/full_mapping.zip')
12
+ puts a.uuid
13
+ end
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency 'ruby-macho', '~> 2.2.0'
26
26
  spec.add_dependency 'ruby_android', '~> 0.7.7'
27
27
  spec.add_dependency 'rubyzip', '>= 1.2', '< 3.0'
28
+ spec.add_dependency 'uuidtools', '~> 2.1.5'
28
29
 
29
30
  spec.add_development_dependency 'bundler', '>= 1.12'
30
31
  spec.add_development_dependency 'rake', '>= 10.0'
@@ -1,10 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'app_info/core_ext/object/try'
2
4
  require 'app_info/version'
3
5
  require 'app_info/ipa'
4
6
  require 'app_info/ipa/info_plist'
5
7
  require 'app_info/ipa/mobile_provision'
6
8
  require 'app_info/apk'
7
9
  require 'app_info/dsym'
10
+ require 'app_info/proguard'
8
11
 
9
12
  # AppInfo Module
10
13
  module AppInfo
@@ -17,6 +20,7 @@ module AppInfo
17
20
  IOS = 'iOS'
18
21
  ANDROID = 'Android'
19
22
  DSYM = 'dSYM'
23
+ PROGUARD = 'Proguard'
20
24
  end
21
25
 
22
26
  # Get a new parser for automatic
@@ -28,6 +32,7 @@ module AppInfo
28
32
  when :apk then APK.new(file)
29
33
  when :mobileprovision then MobileProvision.new(file)
30
34
  when :dsym then DSYM.new(file)
35
+ when :proguard then Proguard.new(file)
31
36
  else
32
37
  raise UnkownFileTypeError, "Sorry, AppInfo can not detect file type: #{file}"
33
38
  end
@@ -51,17 +56,20 @@ module AppInfo
51
56
  # :nodoc:
52
57
  def self.detect_zip_file(file)
53
58
  Zip.warn_invalid_date = false
54
- Zip::File.open(file) do |zip_file|
55
- zip_file.each do |f|
56
- path = f.name
57
- name = File.basename(path)
59
+ zip_file = Zip::File.open(file)
60
+
61
+ return :proguard unless zip_file.glob('*mapping*.txt').empty?
62
+ return :apk unless zip_file.find_entry('AndroidManifest.xml').nil? &&
63
+ zip_file.find_entry('classes.dex').nil?
64
+
65
+ zip_file.each do |f|
66
+ path = f.name
58
67
 
59
- return :apk if name == 'AndroidManifest.xml'
60
- return :ipa if path.include?('Payload/') && name.end_with?('Info.plist')
61
- return :dsym if path.include?('/DWARF/')
62
- end
68
+ return :ipa if path.include?('Payload/') && path.end_with?('Info.plist')
69
+ return :dsym if path.include?('Contents/Resources/DWARF/')
63
70
  end
64
71
  end
72
+ private_class_method :detect_zip_file
65
73
 
66
74
  # :nodoc:
67
75
  def self.detect_mobileprovision(hex)
@@ -76,4 +84,5 @@ module AppInfo
76
84
  :mobileprovision
77
85
  end
78
86
  end
87
+ private_class_method :detect_mobileprovision
79
88
  end
@@ -33,23 +33,25 @@ module AppInfo
33
33
  end
34
34
  alias file_type os
35
35
 
36
- def build_version
37
- manifest.version_code.to_s
36
+ def version_name
37
+ manifest.version_name
38
38
  end
39
+ alias release_version version_name
39
40
 
40
- def release_version
41
- manifest.version_name
41
+ def version_code
42
+ manifest.version_code.to_s
42
43
  end
44
+ alias build_version version_code
43
45
 
44
46
  def name
45
47
  resource.find('@string/app_name')
46
48
  end
47
49
 
48
- def bundle_id
50
+ def package_name
49
51
  manifest.package_name
50
52
  end
51
- alias identifier bundle_id
52
- alias package_name bundle_id
53
+ alias identifier package_name
54
+ alias bundle_id package_name
53
55
 
54
56
  def device_type
55
57
  if wear?
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true`
2
2
 
3
- require 'zip'
4
3
  require 'macho'
5
- require 'app_info/core_ext/object/try'
4
+ require 'app_info/util'
6
5
 
7
6
  module AppInfo
8
7
  # DSYM parser
@@ -82,13 +81,12 @@ module AppInfo
82
81
  if File.directory?(@file)
83
82
  @contents = @file
84
83
  else
85
- @contents = "#{Dir.mktmpdir}/AppInfo-dsym-#{SecureRandom.hex}"
86
84
  dsym_dir = nil
87
- Zip::File.open(@file) do |zip_file|
85
+ @contents = Util.unarchive(@file, path: 'dsym') do |path, zip_file|
88
86
  zip_file.each do |f|
89
87
  dsym_dir ||= f.name
90
88
 
91
- f_path = File.join(@contents, f.name)
89
+ f_path = File.join(path, f.name)
92
90
  zip_file.extract(f, f_path) unless File.exist?(f_path)
93
91
  end
94
92
  end
@@ -1,12 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'zip'
4
3
  require 'pngdefry'
5
4
  require 'fileutils'
6
- require 'securerandom'
7
5
  require 'cfpropertylist'
8
6
  require 'app_info/util'
9
- require 'app_info/core_ext/object/try'
10
7
 
11
8
  module AppInfo
12
9
  # IPA parser
@@ -199,18 +196,7 @@ module AppInfo
199
196
  private
200
197
 
201
198
  def contents
202
- # source: https://github.com/soffes/lagunitas/blob/master/lib/lagunitas/ipa.rb
203
- unless @contents
204
- @contents = "#{Dir.mktmpdir}/AppInfo-ios-#{SecureRandom.hex}"
205
- Zip::File.open(@file) do |zip_file|
206
- zip_file.each do |f|
207
- f_path = File.join(@contents, f.name)
208
- zip_file.extract(f, f_path) unless File.exist?(f_path)
209
- end
210
- end
211
- end
212
-
213
- @contents
199
+ @contents ||= Util.unarchive(@file, path: 'ios')
214
200
  end
215
201
 
216
202
  def icons_root_path
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uuidtools'
4
+ require 'rexml/document'
5
+ require 'app_info/util'
6
+
7
+ module AppInfo
8
+ # Proguard parser
9
+ class Proguard
10
+ NAMESPACE = UUIDTools::UUID.sha1_create(UUIDTools::UUID_DNS_NAMESPACE, 'icyleaf.com')
11
+
12
+ attr_reader :file
13
+
14
+ def initialize(file)
15
+ @file = file
16
+ end
17
+
18
+ def file_type
19
+ AppInfo::Platform::PROGUARD
20
+ end
21
+
22
+ def uuid
23
+ # Similar to https://docs.sentry.io/workflow/debug-files/#proguard-uuids
24
+ UUIDTools::UUID.sha1_create(NAMESPACE, File.read(mapping_path)).to_s
25
+ end
26
+ alias debug_id uuid
27
+
28
+ def mapping?
29
+ File.exist?(mapping_path)
30
+ end
31
+
32
+ def manifest?
33
+ File.exist?(manifest_path)
34
+ end
35
+
36
+ def symbol?
37
+ File.exist?(symbol_path)
38
+ end
39
+ alias resource? symbol?
40
+
41
+ def package_name
42
+ return unless manifest?
43
+
44
+ manifest.root.attributes['package']
45
+ end
46
+
47
+ def releasd_version
48
+ return unless manifest?
49
+
50
+ manifest.root.attributes['package']
51
+ end
52
+
53
+ def version_name
54
+ return unless manifest?
55
+
56
+ manifest.root.attributes['versionName']
57
+ end
58
+ alias release_version version_name
59
+
60
+ def version_code
61
+ return unless manifest?
62
+
63
+ manifest.root.attributes['versionCode']
64
+ end
65
+ alias build_version version_code
66
+
67
+ def manifest
68
+ return unless manifest?
69
+
70
+ @manifest ||= REXML::Document.new(File.new(manifest_path))
71
+ end
72
+
73
+ def mapping_path
74
+ @mapping_path ||= Dir.glob(File.join(contents, '*mapping*.txt')).first
75
+ end
76
+
77
+ def manifest_path
78
+ @manifest_path ||= File.join(contents, 'AndroidManifest.xml')
79
+ end
80
+
81
+ def symbol_path
82
+ @symbol_path ||= File.join(contents, 'R.txt')
83
+ end
84
+ alias resource_path symbol_path
85
+
86
+ def contents
87
+ @contents ||= Util.unarchive(@file, path: 'proguard')
88
+ end
89
+ end
90
+ end
@@ -1,5 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'zip'
4
+ require 'fileutils'
5
+ require 'securerandom'
6
+
3
7
  module AppInfo
4
8
  # AppInfo Util
5
9
  module Util
@@ -22,5 +26,26 @@ module AppInfo
22
26
 
23
27
  "#{number} #{FILE_SIZE_UNITS[exponent]}"
24
28
  end
29
+
30
+ # Unarchive zip file
31
+ #
32
+ # source: https://github.com/soffes/lagunitas/blob/master/lib/lagunitas/ipa.rb
33
+ def self.unarchive(file, path: nil)
34
+ path = path ? "#{path}-" : ''
35
+ root_path = "#{Dir.mktmpdir}/AppInfo-#{path}#{SecureRandom.hex}"
36
+ Zip::File.open(file) do |zip_file|
37
+ if block_given?
38
+ yield root_path, zip_file
39
+ else
40
+ zip_file.each do |f|
41
+ f_path = File.join(root_path, f.name)
42
+ FileUtils.mkdir_p(File.dirname(f_path))
43
+ zip_file.extract(f, f_path) unless File.exist?(f_path)
44
+ end
45
+ end
46
+ end
47
+
48
+ root_path
49
+ end
25
50
  end
26
51
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppInfo
4
- VERSION = '2.0.0.beta4'
4
+ VERSION = '2.0.0.beta7'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: app-info
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta4
4
+ version: 2.0.0.beta7
5
5
  platform: ruby
6
6
  authors:
7
7
  - icyleaf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-11 00:00:00.000000000 Z
11
+ date: 2019-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: CFPropertyList
@@ -112,6 +112,20 @@ dependencies:
112
112
  - - "<"
113
113
  - !ruby/object:Gem::Version
114
114
  version: '3.0'
115
+ - !ruby/object:Gem::Dependency
116
+ name: uuidtools
117
+ requirement: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - "~>"
120
+ - !ruby/object:Gem::Version
121
+ version: 2.1.5
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - "~>"
127
+ - !ruby/object:Gem::Version
128
+ version: 2.1.5
115
129
  - !ruby/object:Gem::Dependency
116
130
  name: bundler
117
131
  requirement: !ruby/object:Gem::Requirement
@@ -180,6 +194,7 @@ files:
180
194
  - lib/app_info/ipa.rb
181
195
  - lib/app_info/ipa/info_plist.rb
182
196
  - lib/app_info/ipa/mobile_provision.rb
197
+ - lib/app_info/proguard.rb
183
198
  - lib/app_info/util.rb
184
199
  - lib/app_info/version.rb
185
200
  homepage: http://github.com/icyleaf/app-info