package_detector 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +51 -0
- data/Rakefile +1 -0
- data/lib/package_detector.rb +44 -0
- data/lib/package_detector/package.rb +18 -0
- data/lib/package_detector/package/android.rb +19 -0
- data/lib/package_detector/package/ios.rb +18 -0
- data/lib/package_detector/version.rb +3 -0
- data/lib/package_detector/visitor.rb +12 -0
- data/lib/package_detector/visitor/zip.rb +25 -0
- data/package_detector.gemspec +25 -0
- data/spec/fixtures/files/Sample.ipa +0 -0
- data/spec/package_detector/package/android_spec.rb +14 -0
- data/spec/package_detector/package/ios_spec.rb +13 -0
- data/spec/package_detector/package_spec.rb +19 -0
- data/spec/package_detector/visitor/zip_spec.rb +16 -0
- data/spec/package_detector/visitor_spec.rb +8 -0
- data/spec/package_detector_spec.rb +29 -0
- data/spec/spec_helper.rb +5 -0
- metadata +129 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 65ea1d0bbfc8f190acf637e2d897bf57e0bb7b57
|
4
|
+
data.tar.gz: da73de3241e93211b7af7784ec47145a50475c7d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 389634e4fe7285e0b4467a47bb927957ee5bb1f98c658d09dd15a2c5fc10da59e197d266a2a5c3c553735e5fedb2ea28a1dd0d5116d7875d6b39e93a09311c2f
|
7
|
+
data.tar.gz: 8ffd44be5b3c30ec2811f6198cc70182778cffe5a8182c82302156c3a597d8d04cb8c2be53f1521d21e9b0f8e53d4a5d0ec91147b75866942e987e19b621a4bb
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 kaz3439
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# PackageDetector
|
2
|
+
|
3
|
+
This gem lets you detect which kind of packages it is.
|
4
|
+
I implemented it based on "Visitor Pattern".
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
Add this line to your application's Gemfile:
|
9
|
+
|
10
|
+
gem 'package_detector'
|
11
|
+
|
12
|
+
And then execute:
|
13
|
+
|
14
|
+
$ bundle
|
15
|
+
|
16
|
+
Or install it yourself as:
|
17
|
+
|
18
|
+
$ gem install package_detector
|
19
|
+
|
20
|
+
## Usage
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
pd = PackageDetector.new(File.open('/path/to/your/app'))
|
24
|
+
case pd.detect
|
25
|
+
when PackageDetector::Package::Ios
|
26
|
+
puts 'It seems to be an ios app!'
|
27
|
+
when PackageDetector::Package::Android
|
28
|
+
puts 'It seems to be an android app!'
|
29
|
+
else
|
30
|
+
puts 'I cannot understand this app...'
|
31
|
+
end
|
32
|
+
|
33
|
+
res = pd.guess PackageDetector::Package::Ios
|
34
|
+
puts res
|
35
|
+
#=> true
|
36
|
+
|
37
|
+
pd.ios?
|
38
|
+
#=> true
|
39
|
+
|
40
|
+
pd.android?
|
41
|
+
#=> false
|
42
|
+
|
43
|
+
```
|
44
|
+
|
45
|
+
## Contributing
|
46
|
+
|
47
|
+
1. Fork it
|
48
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
49
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
50
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
51
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "package_detector/version"
|
2
|
+
require "package_detector/package"
|
3
|
+
require "package_detector/visitor"
|
4
|
+
|
5
|
+
class PackageDetector
|
6
|
+
ROOT_DIR = File.expand_path(File.join('..', 'package_detector', 'package', '*'), __FILE__)
|
7
|
+
attr_accessor :package
|
8
|
+
|
9
|
+
def initialize(package)
|
10
|
+
if package.kind_of? IO
|
11
|
+
@package = package
|
12
|
+
else
|
13
|
+
raise TypeError, "can't recieve an object except for IO object."
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def detect
|
18
|
+
package_types = Dir[ROOT_DIR].map{|n|
|
19
|
+
if File.file?(n)
|
20
|
+
package_type(File.basename(n, '.rb'))
|
21
|
+
end
|
22
|
+
}
|
23
|
+
package_types.detect{|type| self.guess(type.new)}
|
24
|
+
end
|
25
|
+
|
26
|
+
def guess(package_type)
|
27
|
+
package_type.accept(@package, package_type.file_type)
|
28
|
+
end
|
29
|
+
|
30
|
+
Dir[ROOT_DIR].each do |n|
|
31
|
+
if File.file?(n)
|
32
|
+
method_basename = File.basename(n, '.rb')
|
33
|
+
method_name = "#{method_basename}?"
|
34
|
+
define_method(method_name) { self.guess(package_type(method_basename).new) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def package_type(basename)
|
40
|
+
klass = basename.split("_").map {|s| s.capitalize }.join("")
|
41
|
+
Kernel.const_get('PackageDetector').const_get('Package').const_get(klass)
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class PackageDetector
|
2
|
+
class Package
|
3
|
+
def accept(package, visitor)
|
4
|
+
visitor.visit(package, self)
|
5
|
+
end
|
6
|
+
def file_type
|
7
|
+
raise NotImplementedError, 'you need to specify which composite is used'
|
8
|
+
end
|
9
|
+
def dir_struct
|
10
|
+
raise NotImplementedError, 'you need to specify directory structure'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
root_dir = File.expand_path(File.join('..', 'package', '*'), __FILE__)
|
16
|
+
Dir[root_dir].map{|fn|
|
17
|
+
require fn if File.file?(fn)
|
18
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class PackageDetector
|
2
|
+
class Package
|
3
|
+
class Android < Package
|
4
|
+
|
5
|
+
def file_type
|
6
|
+
PackageDetector::Visitor::Zip.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def dir_struct
|
10
|
+
[
|
11
|
+
'resources.arsc',
|
12
|
+
'classes.dex',
|
13
|
+
'AndroidManifest.xml',
|
14
|
+
]
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class PackageDetector
|
2
|
+
class Package
|
3
|
+
class Ios < Package
|
4
|
+
|
5
|
+
def file_type
|
6
|
+
PackageDetector::Visitor::Zip.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def dir_struct
|
10
|
+
[
|
11
|
+
File.join('Payload', '[^/]+.app', 'embedded.mobileprovision'),
|
12
|
+
File.join('Payload', '[^/]+.app', 'Info.plist')
|
13
|
+
]
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class PackageDetector
|
2
|
+
class Visitor
|
3
|
+
def visit(package)
|
4
|
+
raise NotImplementedError, 'you need to specify how to compose'
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
root_dir = File.expand_path(File.join('..', 'visitor', '*'), __FILE__)
|
10
|
+
Dir[root_dir].map{|fn|
|
11
|
+
require fn if File.file?(fn)
|
12
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'zip/zip'
|
2
|
+
require 'tempfile'
|
3
|
+
|
4
|
+
class PackageDetector
|
5
|
+
class Visitor
|
6
|
+
class Zip < Visitor
|
7
|
+
def visit(package, element)
|
8
|
+
paths = Hash[*element.dir_struct.zip(Array.new(element.dir_struct.count, false)).flatten]
|
9
|
+
::Zip::ZipFile.foreach(package.path) do |zipfile|
|
10
|
+
paths.keys.map { |file_path|
|
11
|
+
if zipfile.name =~ Regexp.new(file_path)
|
12
|
+
paths[file_path] = true
|
13
|
+
end
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
if paths.keys.select{|key| paths[key] == false }.empty?
|
18
|
+
true
|
19
|
+
else
|
20
|
+
false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'package_detector/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "package_detector"
|
8
|
+
spec.version = PackageDetector::VERSION
|
9
|
+
spec.authors = ["Kaz"]
|
10
|
+
spec.email = ["k.hayashi.info@gmail.com"]
|
11
|
+
spec.description = %q{Detect app package from the directory structure.}
|
12
|
+
spec.summary = %q{Detect App Package from the directory structure.}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_dependency "rubyzip"
|
25
|
+
end
|
Binary file
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PackageDetector::Package::Android do
|
4
|
+
subject { PackageDetector::Package::Android.new }
|
5
|
+
its(:file_type) { should be_instance_of PackageDetector::Visitor::Zip }
|
6
|
+
expected_dir_struct = [
|
7
|
+
'resources.arsc',
|
8
|
+
'classes.dex',
|
9
|
+
'AndroidManifest.xml',
|
10
|
+
]
|
11
|
+
its(:dir_struct) {
|
12
|
+
should eq expected_dir_struct
|
13
|
+
}
|
14
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PackageDetector::Package::Ios do
|
4
|
+
subject { PackageDetector::Package::Ios.new }
|
5
|
+
its(:file_type) { should be_instance_of PackageDetector::Visitor::Zip }
|
6
|
+
expected_dir_struct = [
|
7
|
+
File.join('Payload', '[^/]+.app', 'embedded.mobileprovision'),
|
8
|
+
File.join('Payload', '[^/]+.app', 'Info.plist')
|
9
|
+
]
|
10
|
+
its(:dir_struct) {
|
11
|
+
should eq expected_dir_struct
|
12
|
+
}
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PackageDetector::Package do
|
4
|
+
before(:all) do
|
5
|
+
@package_difinition = PackageDetector::Package.new
|
6
|
+
end
|
7
|
+
it 'should raise to file_type ' do
|
8
|
+
proc { @package_difinition.file_type }.should raise_error NotImplementedError
|
9
|
+
end
|
10
|
+
it 'should raise to file_type ' do
|
11
|
+
proc { @package_difinition.dir_struct }.should raise_error NotImplementedError
|
12
|
+
end
|
13
|
+
it 'should accept package and detector which has visit method' do
|
14
|
+
detector = double("PackageDetection::Detector")
|
15
|
+
detector.stub(:visit).with('package', @package_difinition).and_return(true)
|
16
|
+
expect(@package_difinition.accept('package', detector)).to be_true
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PackageDetector::Visitor::Zip do
|
4
|
+
context 'when receive correct file' do
|
5
|
+
it 'should return ture' do
|
6
|
+
package = double("PackageDetection::Package::Ios")
|
7
|
+
package.stub(:dir_struct).and_return([
|
8
|
+
File.join('Payload', '[^/]+.app', 'embedded.mobileprovision'),
|
9
|
+
File.join('Payload', '[^/]+.app', 'Info.plist')
|
10
|
+
])
|
11
|
+
sample_file_path = File.expand_path(File.join('..', '..', '..', 'fixtures', 'files', 'Sample.ipa'), __FILE__)
|
12
|
+
result = PackageDetector::Visitor::Zip.new.visit(File.new(sample_file_path), package)
|
13
|
+
expect(result).to be_true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PackageDetector do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@io = IO.open(0)
|
7
|
+
@pd = PackageDetector.new(@io)
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should start to visit with guess method' do
|
11
|
+
elem = double('Element')
|
12
|
+
elem.stub(:accept).with(@io, 'file_type').and_return true
|
13
|
+
elem.stub(:file_type).and_return 'file_type'
|
14
|
+
expect(@pd.guess(elem)).to be_true
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should start to visit all of package_type with detect method' do
|
18
|
+
ary = ['./test.rb']
|
19
|
+
Dir.stub('[]').and_return ary
|
20
|
+
Test = double()
|
21
|
+
Test.stub(:new).and_return('file_type')
|
22
|
+
ary.stub(:map).and_return([Test])
|
23
|
+
File.stub(:expand_path).and_return '.'
|
24
|
+
File.stub(:file?).and_return true
|
25
|
+
@pd.stub(:guess).with('file_type').and_return true
|
26
|
+
expect(@pd.detect).to be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: package_detector
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kaz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubyzip
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: Detect app package from the directory structure.
|
70
|
+
email:
|
71
|
+
- k.hayashi.info@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- .gitignore
|
77
|
+
- Gemfile
|
78
|
+
- LICENSE.txt
|
79
|
+
- README.md
|
80
|
+
- Rakefile
|
81
|
+
- lib/package_detector.rb
|
82
|
+
- lib/package_detector/package.rb
|
83
|
+
- lib/package_detector/package/android.rb
|
84
|
+
- lib/package_detector/package/ios.rb
|
85
|
+
- lib/package_detector/version.rb
|
86
|
+
- lib/package_detector/visitor.rb
|
87
|
+
- lib/package_detector/visitor/zip.rb
|
88
|
+
- package_detector.gemspec
|
89
|
+
- spec/fixtures/files/Sample.ipa
|
90
|
+
- spec/package_detector/package/android_spec.rb
|
91
|
+
- spec/package_detector/package/ios_spec.rb
|
92
|
+
- spec/package_detector/package_spec.rb
|
93
|
+
- spec/package_detector/visitor/zip_spec.rb
|
94
|
+
- spec/package_detector/visitor_spec.rb
|
95
|
+
- spec/package_detector_spec.rb
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
homepage: ''
|
98
|
+
licenses:
|
99
|
+
- MIT
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.1.9
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Detect App Package from the directory structure.
|
121
|
+
test_files:
|
122
|
+
- spec/fixtures/files/Sample.ipa
|
123
|
+
- spec/package_detector/package/android_spec.rb
|
124
|
+
- spec/package_detector/package/ios_spec.rb
|
125
|
+
- spec/package_detector/package_spec.rb
|
126
|
+
- spec/package_detector/visitor/zip_spec.rb
|
127
|
+
- spec/package_detector/visitor_spec.rb
|
128
|
+
- spec/package_detector_spec.rb
|
129
|
+
- spec/spec_helper.rb
|