natives 0.5.5 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile +0 -1
- data/README.md +78 -65
- data/VERSION +1 -1
- data/Vagrantfile +2 -2
- data/catalogs/rubygems.yaml +28 -47
- data/catalogs_test/bin/test_catalog +7 -5
- data/lib/natives/catalog.rb +1 -1
- data/lib/natives/catalog/normalizer.rb +77 -0
- data/lib/natives/catalog/selector.rb +21 -62
- data/lib/natives/errors.rb +5 -0
- data/lib/natives/gemfile_viewer.rb +2 -2
- data/natives.gemspec +7 -7
- data/spec/fixtures/dir_with_matching_files/invalid1.yml +5 -4
- data/spec/fixtures/dir_with_matching_files/valid1.yaml +23 -18
- data/spec/natives/catalog/normalizer_spec.rb +128 -0
- data/spec/natives/catalog/selector_spec.rb +36 -109
- data/spec/natives/catalog_spec.rb +9 -5
- metadata +6 -18
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YzQxZTNmYjcyMGI5MGIxNjUzYWZiYjExYmE1MWUxMDQ3YjU2NWExNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZjI4MTc0NzY1OTdjMGUyM2Q5MzJiOGU4NmRiNjEzMzc0YWZiZDViNQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NmM1NGVmZGM0YWUzZThmMDc4NGQ3Njc2YTFiZjAyOTJmOGEzYzIwYzExNDY2
|
10
|
+
ZmM2Nzg2MjY0ODQzYjY4NjE1YzA2OGVjNDEyN2JmYTgzYWQ4ZDYxMjdkYjdh
|
11
|
+
NzcwOWVkMTM4MTI1MWZkYTMwMzkyY2Q2OGJhZmNlYjdhMmU1ZDE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjkzOThmY2M0OGU5NzI1NWMwMzQ2ZTMxNjllMDQwNjUwZGE4MWY4NTIwYWYx
|
14
|
+
OGFiYzVlMGIyOWRiNGU1YWY1NTVlZDY3NDM3MjI2ODM1NzY0MDkxNmI3ZmZj
|
15
|
+
MDcxODVlNmI2MWQ2M2YxNWFlMjhmNWI1M2M3ZGY4NDhhMzAxZTE=
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/natives.png)](http://badge.fury.io/rb/natives)
|
4
4
|
[![Code Climate](https://codeclimate.com/github/teohm/natives.png)](https://codeclimate.com/github/teohm/natives)
|
5
5
|
[![Build Status](https://travis-ci.org/teohm/natives.png)](https://travis-ci.org/teohm/natives)
|
6
|
+
[![Dependency Status](https://gemnasium.com/teohm/natives.png)](https://gemnasium.com/teohm/natives)
|
6
7
|
|
7
8
|
List native packages required by ruby gems on your machine.
|
8
9
|
|
@@ -59,10 +60,12 @@ $ cd rails_app1
|
|
59
60
|
$ cat natives-catalogs/catalog1.yaml
|
60
61
|
rubygems:
|
61
62
|
my_gem:
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
63
|
+
homebrew:
|
64
|
+
mac_os_x:
|
65
|
+
- package1
|
66
|
+
apt:
|
67
|
+
default:
|
68
|
+
- package2
|
66
69
|
|
67
70
|
$ natives list my_gem # runs on mac os x
|
68
71
|
package1
|
@@ -84,16 +87,17 @@ It loads YAML files (.yaml, .yml) from the following paths in this order:
|
|
84
87
|
|
85
88
|
When there are multiple YAML files in a path, they are **sorted by filename** and loaded in that order.
|
86
89
|
|
87
|
-
### Catalog
|
90
|
+
### Catalog YAML format
|
88
91
|
|
89
92
|
A catalog file is written in YAML, based on this format:
|
90
93
|
|
91
94
|
```
|
92
95
|
catalog_name:
|
93
96
|
entry_name:
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
+
package_provider:
|
98
|
+
platform:
|
99
|
+
platform_version:
|
100
|
+
- package_name
|
97
101
|
```
|
98
102
|
|
99
103
|
For example,
|
@@ -101,9 +105,10 @@ For example,
|
|
101
105
|
```
|
102
106
|
rubygems:
|
103
107
|
capybara-webkit:
|
104
|
-
|
105
|
-
|
106
|
-
|
108
|
+
homebrew:
|
109
|
+
mac_os_x:
|
110
|
+
10.7.5:
|
111
|
+
- libqtwebkit-dev
|
107
112
|
```
|
108
113
|
|
109
114
|
#### Use `default` when apply to all platforms
|
@@ -111,79 +116,87 @@ rubygems:
|
|
111
116
|
```
|
112
117
|
rubygems:
|
113
118
|
curb:
|
114
|
-
|
115
|
-
- curl
|
116
|
-
```
|
117
|
-
|
118
|
-
#### Use `default` when apply to all versions
|
119
|
-
|
120
|
-
```
|
121
|
-
rubygems:
|
122
|
-
capybara-webkit:
|
123
|
-
mac_os_x/homebrew:
|
119
|
+
apt:
|
124
120
|
default:
|
125
|
-
-
|
121
|
+
- libcurl4-openssl-dev
|
122
|
+
|
126
123
|
```
|
127
124
|
|
128
|
-
#### Use
|
125
|
+
#### Use `default` when apply to all platform versions
|
129
126
|
|
130
127
|
```
|
131
128
|
rubygems:
|
132
129
|
capybara-webkit:
|
133
|
-
|
134
|
-
|
135
|
-
|
130
|
+
homebrew:
|
131
|
+
mac_os_x:
|
132
|
+
default:
|
133
|
+
- libqtwebkit-dev
|
136
134
|
```
|
137
135
|
|
138
|
-
#### Use array to group versions
|
139
|
-
|
140
|
-
|
136
|
+
#### Use array to group platform versions
|
141
137
|
|
142
138
|
```
|
143
139
|
rubygems:
|
144
140
|
capybara-webkit:
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
141
|
+
apt:
|
142
|
+
ubuntu:
|
143
|
+
[10.04, 10.04.1, 10.04.2, 10.04.3, 10.04.4]:
|
144
|
+
- libqt4-dev
|
145
|
+
default:
|
146
|
+
- libqtwebkit-dev
|
150
147
|
```
|
151
148
|
|
152
149
|
|
153
|
-
#### Supported values for
|
150
|
+
#### Supported values for platforms and package providers
|
154
151
|
|
155
152
|
Not in the list? No worry, submit a PR to patch [`host_detection/package_provider.rb`](https://github.com/teohm/natives/blob/master/lib/natives/host_detection/package_provider.rb).
|
156
153
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
154
|
+
##### Package providers
|
155
|
+
```
|
156
|
+
aix
|
157
|
+
yum
|
158
|
+
packman
|
159
|
+
apt
|
160
|
+
feebsd
|
161
|
+
portage
|
162
|
+
homebrew
|
163
|
+
macports
|
164
|
+
solaris
|
165
|
+
ips
|
166
|
+
zypper
|
167
|
+
smartos
|
168
|
+
```
|
169
|
+
|
170
|
+
##### Platforms
|
171
|
+
```
|
172
|
+
aix
|
173
|
+
amazon
|
174
|
+
arch
|
175
|
+
centos
|
176
|
+
debian
|
177
|
+
fedora
|
178
|
+
freebsd
|
179
|
+
gcel
|
180
|
+
gentoo
|
181
|
+
linaro
|
182
|
+
linuxmint
|
183
|
+
mac_os_x
|
184
|
+
mac_os_x_server
|
185
|
+
nexentacore
|
186
|
+
omnios
|
187
|
+
openindiana
|
188
|
+
opensolaris
|
189
|
+
opensuse
|
190
|
+
oracle
|
191
|
+
raspbian
|
192
|
+
redhat
|
193
|
+
scientific
|
194
|
+
smartos
|
195
|
+
solaris2
|
196
|
+
suse
|
197
|
+
ubuntu
|
198
|
+
xcp
|
199
|
+
xenserver
|
187
200
|
```
|
188
201
|
|
189
202
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/Vagrantfile
CHANGED
@@ -18,10 +18,10 @@ Vagrant::Config.run do |config|
|
|
18
18
|
# Provision docker and new kernel if deployment was not done.
|
19
19
|
# It is assumed Vagrant can successfully launch the provider instance.
|
20
20
|
if Dir.glob("#{File.dirname(__FILE__)}/.vagrant/machines/default/*/id").empty?
|
21
|
-
# Add lxc-docker package
|
21
|
+
# Add lxc-docker and parallel package
|
22
22
|
pkg_cmd = "wget -q -O - https://get.docker.io/gpg | apt-key add -;" \
|
23
23
|
"echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list;" \
|
24
|
-
"apt-get update -qq; apt-get install -q -y --force-yes lxc-docker; "
|
24
|
+
"apt-get update -qq; apt-get install -q -y --force-yes lxc-docker parallel; "
|
25
25
|
# Add Ubuntu raring backported kernel
|
26
26
|
pkg_cmd << "apt-get update -qq; apt-get install -q -y linux-image-generic-lts-raring; "
|
27
27
|
# Add guest additions if local vbox VM. As virtualbox is the default provider,
|
data/catalogs/rubygems.yaml
CHANGED
@@ -1,74 +1,55 @@
|
|
1
1
|
rubygems:
|
2
2
|
capybara-webkit:
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
ubuntu/apt:
|
3
|
+
macports:
|
4
|
+
mac_os_x:
|
5
|
+
default:
|
6
|
+
- qt4-mac-devel
|
7
|
+
homebrew:
|
8
|
+
mac_os_x:
|
9
|
+
default:
|
10
|
+
- qt
|
11
|
+
apt:
|
13
12
|
default:
|
14
13
|
- libqtwebkit-dev
|
15
14
|
curb:
|
16
|
-
|
17
|
-
default:
|
18
|
-
- libcurl4-openssl-dev
|
19
|
-
ubuntu/apt:
|
15
|
+
apt:
|
20
16
|
default:
|
21
17
|
- libcurl4-openssl-dev
|
22
18
|
nokogiri:
|
23
|
-
|
24
|
-
default:
|
25
|
-
- libxslt-dev
|
26
|
-
- libxml2-dev
|
27
|
-
ubuntu/apt:
|
19
|
+
apt:
|
28
20
|
default:
|
29
21
|
- libxslt-dev
|
30
22
|
- libxml2-dev
|
31
23
|
pg:
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
- libpq-dev
|
38
|
-
ubuntu/apt:
|
24
|
+
homebrew:
|
25
|
+
mac_os_x:
|
26
|
+
default:
|
27
|
+
- postgres
|
28
|
+
apt:
|
39
29
|
default:
|
40
30
|
- libpq-dev
|
41
31
|
rmagick:
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
- imagemagick
|
48
|
-
- libmagickwand-dev
|
49
|
-
ubuntu/apt:
|
32
|
+
homebrew:
|
33
|
+
mac_os_x:
|
34
|
+
default:
|
35
|
+
- imagemagick
|
36
|
+
apt:
|
50
37
|
default:
|
51
38
|
- imagemagick
|
52
39
|
- libmagickwand-dev
|
53
40
|
tesseract-ocr:
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
- libtesseract-dev
|
60
|
-
- libleptonica-dev
|
61
|
-
ubuntu/apt:
|
41
|
+
homebrew:
|
42
|
+
mac_os_x:
|
43
|
+
default:
|
44
|
+
- tesseract
|
45
|
+
apt:
|
62
46
|
default:
|
63
47
|
- libtesseract-dev
|
64
48
|
- libleptonica-dev
|
65
49
|
sqlite3:
|
66
|
-
|
67
|
-
default:
|
68
|
-
- libsqlite3-dev
|
69
|
-
ubuntu/apt:
|
50
|
+
apt:
|
70
51
|
default:
|
71
52
|
- libsqlite3-dev
|
72
|
-
|
53
|
+
yum:
|
73
54
|
default:
|
74
55
|
- sqlite-devel
|
@@ -16,9 +16,11 @@ done
|
|
16
16
|
|
17
17
|
gems="$( $BIN_HOME/list_all )"
|
18
18
|
|
19
|
-
for image_name in $image_names; do
|
20
|
-
for gem in $gems; do
|
21
|
-
|
22
|
-
done
|
23
|
-
done
|
19
|
+
#for image_name in $image_names; do
|
20
|
+
#for gem in $gems; do
|
21
|
+
#$BIN_HOME/test_entry $image_name $gem
|
22
|
+
#done
|
23
|
+
#done
|
24
24
|
|
25
|
+
# Experimental: run test in parallel
|
26
|
+
parallel --gnu -j+0 $BIN_HOME/test_entry ::: $image_names ::: $gems
|
data/lib/natives/catalog.rb
CHANGED
@@ -38,7 +38,7 @@ module Natives
|
|
38
38
|
def native_packages_for(*entry_names)
|
39
39
|
packages = Array(entry_names).flatten.map do |entry_name|
|
40
40
|
Selector.new(self.to_hash.fetch(entry_name, {})).
|
41
|
-
|
41
|
+
values_for(@package_provider, @platform, @platform_version)
|
42
42
|
end
|
43
43
|
packages.flatten.compact
|
44
44
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'natives/errors'
|
2
|
+
|
3
|
+
module Natives
|
4
|
+
class Catalog
|
5
|
+
class Normalizer
|
6
|
+
|
7
|
+
def normalize(hash)
|
8
|
+
normalize_package_provider_hash(hash)
|
9
|
+
end
|
10
|
+
|
11
|
+
protected
|
12
|
+
|
13
|
+
def default?(str)
|
14
|
+
'default' == str
|
15
|
+
end
|
16
|
+
|
17
|
+
def convert_to_hash(hash)
|
18
|
+
return hash.to_h if hash.respond_to?(:to_h)
|
19
|
+
return hash.to_hash if hash.respond_to?(:to_hash)
|
20
|
+
if block_given?
|
21
|
+
yield
|
22
|
+
else
|
23
|
+
raise InvalidCatalogFormat
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def normalize_package_provider_hash(hash)
|
28
|
+
hash = convert_to_hash(hash) do
|
29
|
+
raise InvalidCatalogFormat,
|
30
|
+
"expected a hash of package providers, but got: #{hash.inspect}"
|
31
|
+
end
|
32
|
+
|
33
|
+
hash.inject({}) do |normalized_hash, (k, v)|
|
34
|
+
normalized_hash[k.to_s] = normalize_platform_hash(v)
|
35
|
+
normalized_hash
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def normalize_platform_hash(hash)
|
40
|
+
hash = convert_to_hash(hash) do
|
41
|
+
raise InvalidCatalogFormat,
|
42
|
+
"expected a hash of platforms, but got: #{hash.inspect}"
|
43
|
+
end
|
44
|
+
|
45
|
+
hash.inject({}) do |normalized_hash, (k, v)|
|
46
|
+
platform = k.to_s
|
47
|
+
value = if default?(platform)
|
48
|
+
normalize_native_package_list(v)
|
49
|
+
else
|
50
|
+
normalize_version_hash(v)
|
51
|
+
end
|
52
|
+
normalized_hash[platform] = value
|
53
|
+
normalized_hash
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def normalize_version_hash(hash)
|
58
|
+
hash = convert_to_hash(hash) do
|
59
|
+
raise InvalidCatalogFormat,
|
60
|
+
"expected a hash of versions, but got: #{hash.inspect}"
|
61
|
+
end
|
62
|
+
|
63
|
+
hash.inject({}) do |normalized_hash, (k, v)|
|
64
|
+
versions = Array(k)
|
65
|
+
versions.each do |version|
|
66
|
+
normalized_hash[version.to_s] = normalize_native_package_list(v)
|
67
|
+
end
|
68
|
+
normalized_hash
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def normalize_native_package_list(list)
|
73
|
+
Array(list)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -1,77 +1,36 @@
|
|
1
|
+
require 'natives/catalog/normalizer'
|
2
|
+
|
1
3
|
module Natives
|
2
4
|
class Catalog
|
3
5
|
class Selector
|
4
|
-
def initialize(
|
5
|
-
|
6
|
-
@values = normalize_platform_hash(platform_hash)
|
6
|
+
def initialize(hash)
|
7
|
+
@values = normalize(hash)
|
7
8
|
end
|
8
9
|
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
protected
|
23
|
-
|
24
|
-
def normalize_platform_hash(platform_hash)
|
25
|
-
normalized_hash = {}
|
26
|
-
platform_hash.each do |keys, value|
|
27
|
-
if keys.to_s == 'default'
|
28
|
-
normalized_hash['default'] = value
|
10
|
+
def values_for(package_provider, platform, platform_version)
|
11
|
+
package_provider = package_provider.to_s
|
12
|
+
platform = platform.to_s
|
13
|
+
platform_version = platform_version.to_s
|
14
|
+
|
15
|
+
values = nil
|
16
|
+
platforms = @values.fetch(package_provider, nil)
|
17
|
+
if platforms
|
18
|
+
versions = platforms.fetch(platform, nil)
|
19
|
+
if versions
|
20
|
+
values = versions.fetch(platform_version, nil) ||
|
21
|
+
versions.fetch('default', nil)
|
29
22
|
else
|
30
|
-
|
31
|
-
normalized_hash[key.to_s] = normalize_keys(value)
|
32
|
-
end
|
23
|
+
values = platforms.fetch('default', nil)
|
33
24
|
end
|
34
25
|
end
|
35
|
-
normalized_hash
|
36
|
-
end
|
37
26
|
|
38
|
-
|
39
|
-
normalized_hash = {}
|
40
|
-
hash.each do |keys, value|
|
41
|
-
Array(keys).each do |key|
|
42
|
-
normalized_hash[key.to_s] = value
|
43
|
-
end
|
44
|
-
end
|
45
|
-
normalized_hash
|
27
|
+
Array(values)
|
46
28
|
end
|
47
29
|
|
48
|
-
|
49
|
-
unless platform_hash.kind_of? Hash
|
50
|
-
raise ArgumentError, 'catalog entry should be a hash'
|
51
|
-
end
|
30
|
+
private
|
52
31
|
|
53
|
-
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def assert_valid_key_and_value(platforms, value)
|
59
|
-
return if platforms.to_s == 'default'
|
60
|
-
|
61
|
-
keys = platforms.kind_of?(Array) ? platforms : [platforms]
|
62
|
-
keys.each do |key|
|
63
|
-
if (%r{\A.+/.+\Z} =~ key.to_s) == nil && key.to_s != 'default'
|
64
|
-
msg = "Found an invalid key: #{key.inspect}. "
|
65
|
-
msg << "A valid key should be in this format: 'platform/package_provider'."
|
66
|
-
raise ArgumentError, msg
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
unless value.kind_of? Hash
|
71
|
-
msg = "Found an invalid value: #{value.inspect} "
|
72
|
-
msg << "for key: #{platforms.inspect}. The value should be a Hash."
|
73
|
-
raise ArgumentError, msg
|
74
|
-
end
|
32
|
+
def normalize(hash)
|
33
|
+
Normalizer.new.normalize(hash)
|
75
34
|
end
|
76
35
|
|
77
36
|
end
|
@@ -3,8 +3,8 @@ require 'bundler'
|
|
3
3
|
module Natives
|
4
4
|
class GemfileViewer
|
5
5
|
def initialize(gemfile_path)
|
6
|
-
@gemfile_path = gemfile_path
|
7
|
-
@lockfile_path = "#{gemfile_path}.lock"
|
6
|
+
@gemfile_path = File.expand_path(gemfile_path)
|
7
|
+
@lockfile_path = "#{@gemfile_path}.lock"
|
8
8
|
end
|
9
9
|
|
10
10
|
def gem_names
|
data/natives.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: natives 0.
|
5
|
+
# stub: natives 0.6.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "natives"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.6.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.authors = ["Huiming Teo"]
|
13
|
-
s.date = "2013-11-
|
13
|
+
s.date = "2013-11-18"
|
14
14
|
s.description = "Lookup native package dependencies required by gems on your machine."
|
15
15
|
s.email = "teohuiming@gmail.com"
|
16
16
|
s.executables = ["natives"]
|
@@ -52,9 +52,11 @@ Gem::Specification.new do |s|
|
|
52
52
|
"lib/natives/catalog.rb",
|
53
53
|
"lib/natives/catalog/loader.rb",
|
54
54
|
"lib/natives/catalog/merger.rb",
|
55
|
+
"lib/natives/catalog/normalizer.rb",
|
55
56
|
"lib/natives/catalog/selector.rb",
|
56
57
|
"lib/natives/catalog/validator.rb",
|
57
58
|
"lib/natives/cli.rb",
|
59
|
+
"lib/natives/errors.rb",
|
58
60
|
"lib/natives/gemfile_viewer.rb",
|
59
61
|
"lib/natives/host_detection.rb",
|
60
62
|
"lib/natives/host_detection/package_provider.rb",
|
@@ -74,6 +76,7 @@ Gem::Specification.new do |s|
|
|
74
76
|
"spec/natives/apps/list_spec.rb",
|
75
77
|
"spec/natives/catalog/loader_spec.rb",
|
76
78
|
"spec/natives/catalog/merger_spec.rb",
|
79
|
+
"spec/natives/catalog/normalizer_spec.rb",
|
77
80
|
"spec/natives/catalog/selector_spec.rb",
|
78
81
|
"spec/natives/catalog/validator_spec.rb",
|
79
82
|
"spec/natives/catalog_spec.rb",
|
@@ -86,7 +89,7 @@ Gem::Specification.new do |s|
|
|
86
89
|
s.homepage = "http://github.com/teohm/natives"
|
87
90
|
s.licenses = ["MIT"]
|
88
91
|
s.require_paths = ["lib"]
|
89
|
-
s.rubygems_version = "2.1.
|
92
|
+
s.rubygems_version = "2.1.11"
|
90
93
|
s.summary = "Lookup native packages required by gems."
|
91
94
|
|
92
95
|
if s.respond_to? :specification_version then
|
@@ -99,7 +102,6 @@ Gem::Specification.new do |s|
|
|
99
102
|
s.add_development_dependency(%q<rspec>, [">= 0"])
|
100
103
|
s.add_development_dependency(%q<yard>, [">= 0"])
|
101
104
|
s.add_development_dependency(%q<rdoc>, [">= 0"])
|
102
|
-
s.add_development_dependency(%q<bundler>, [">= 0"])
|
103
105
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
104
106
|
s.add_development_dependency(%q<debugger>, [">= 0"])
|
105
107
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
@@ -110,7 +112,6 @@ Gem::Specification.new do |s|
|
|
110
112
|
s.add_dependency(%q<rspec>, [">= 0"])
|
111
113
|
s.add_dependency(%q<yard>, [">= 0"])
|
112
114
|
s.add_dependency(%q<rdoc>, [">= 0"])
|
113
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
114
115
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
115
116
|
s.add_dependency(%q<debugger>, [">= 0"])
|
116
117
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
@@ -122,7 +123,6 @@ Gem::Specification.new do |s|
|
|
122
123
|
s.add_dependency(%q<rspec>, [">= 0"])
|
123
124
|
s.add_dependency(%q<yard>, [">= 0"])
|
124
125
|
s.add_dependency(%q<rdoc>, [">= 0"])
|
125
|
-
s.add_dependency(%q<bundler>, [">= 0"])
|
126
126
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
127
127
|
s.add_dependency(%q<debugger>, [">= 0"])
|
128
128
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
@@ -1,21 +1,26 @@
|
|
1
1
|
rubygems:
|
2
2
|
capybara-webkit:
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
3
|
+
macports:
|
4
|
+
mac_os_x:
|
5
|
+
default:
|
6
|
+
- qt4-mac-devel
|
7
|
+
homebrew:
|
8
|
+
mac_os_x:
|
9
|
+
default:
|
10
|
+
- qt
|
11
|
+
apt:
|
12
|
+
ubuntu:
|
13
|
+
default:
|
14
|
+
- libqtwebkit-dev
|
15
|
+
[10.04,10.04.1,10.04.2,10.04.3,10.04.4]:
|
16
|
+
- libqt4-dev
|
14
17
|
rmagick:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
homebrew:
|
19
|
+
mac_os_x:
|
20
|
+
default:
|
21
|
+
- imagemagick
|
22
|
+
apt:
|
23
|
+
ubuntu:
|
24
|
+
default:
|
25
|
+
- imagemagick
|
26
|
+
- libmagick9-dev
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'natives/catalog/normalizer'
|
3
|
+
|
4
|
+
describe "Catalog Normalizer" do
|
5
|
+
let(:normalizer) { Natives::Catalog::Normalizer.new }
|
6
|
+
|
7
|
+
context "Given valid hash input" do
|
8
|
+
it "converts package provider, platform, platform version to string" do
|
9
|
+
hash = normalizer.normalize({
|
10
|
+
:macports => {
|
11
|
+
:mac_os_x => {
|
12
|
+
:default => ['foo'],
|
13
|
+
:"10.1.2" => ['bar']
|
14
|
+
}
|
15
|
+
}
|
16
|
+
})
|
17
|
+
|
18
|
+
expect(hash).to eq({
|
19
|
+
'macports' => {
|
20
|
+
'mac_os_x' => {
|
21
|
+
'default' => ['foo'],
|
22
|
+
'10.1.2' => ['bar']
|
23
|
+
}
|
24
|
+
}
|
25
|
+
})
|
26
|
+
end
|
27
|
+
|
28
|
+
it "supports default platform" do
|
29
|
+
hash = normalizer.normalize({
|
30
|
+
apt: {
|
31
|
+
default: ['foo'],
|
32
|
+
ubuntu: {
|
33
|
+
default: ['bar']
|
34
|
+
}
|
35
|
+
}
|
36
|
+
})
|
37
|
+
|
38
|
+
expect(hash).to eq({
|
39
|
+
'apt' => {
|
40
|
+
'default' => ['foo'],
|
41
|
+
'ubuntu' => {
|
42
|
+
'default' => ['bar']
|
43
|
+
}
|
44
|
+
}
|
45
|
+
})
|
46
|
+
end
|
47
|
+
|
48
|
+
it "normalizes version list" do
|
49
|
+
hash = normalizer.normalize({
|
50
|
+
apt: {
|
51
|
+
ubuntu: {
|
52
|
+
:default => ['bar'],
|
53
|
+
'13' => ['top'],
|
54
|
+
['11','12','13'] => ['foo'],
|
55
|
+
'11' => ['bottom']
|
56
|
+
}
|
57
|
+
}
|
58
|
+
})
|
59
|
+
|
60
|
+
expect(hash).to eq({
|
61
|
+
'apt' => {
|
62
|
+
'ubuntu' => {
|
63
|
+
'default' => ['bar'],
|
64
|
+
'13' => ['foo'],
|
65
|
+
'11' => ['bottom'],
|
66
|
+
'12' => ['foo']
|
67
|
+
}
|
68
|
+
}
|
69
|
+
})
|
70
|
+
end
|
71
|
+
|
72
|
+
it "ensures native packages is a list" do
|
73
|
+
hash = normalizer.normalize({
|
74
|
+
apt: {
|
75
|
+
default: 'defaultfoo',
|
76
|
+
ubuntu: {
|
77
|
+
:default => 'bar',
|
78
|
+
'14' => 'top',
|
79
|
+
['11','12','13'] => 'foo',
|
80
|
+
}
|
81
|
+
}
|
82
|
+
})
|
83
|
+
|
84
|
+
expect(hash).to eq({
|
85
|
+
'apt' => {
|
86
|
+
'default' => ['defaultfoo'],
|
87
|
+
'ubuntu' => {
|
88
|
+
'default' => ['bar'],
|
89
|
+
'14' => ['top'],
|
90
|
+
'11' => ['foo'],
|
91
|
+
'12' => ['foo'],
|
92
|
+
'13' => ['foo']
|
93
|
+
}
|
94
|
+
}
|
95
|
+
})
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
context "Invalid input" do
|
101
|
+
|
102
|
+
it "raises error when package provider hash is not a hash" do
|
103
|
+
expect {
|
104
|
+
normalizer.normalize("invalid")
|
105
|
+
}.to raise_error Natives::InvalidCatalogFormat
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
it "raises error when platform hash is not a hash" do
|
110
|
+
expect {
|
111
|
+
normalizer.normalize({
|
112
|
+
"macports" => "invalid"
|
113
|
+
})
|
114
|
+
}.to raise_error Natives::InvalidCatalogFormat
|
115
|
+
end
|
116
|
+
|
117
|
+
it "raises error when version hash is not a hash" do
|
118
|
+
expect {
|
119
|
+
normalizer.normalize({
|
120
|
+
"macports" => {
|
121
|
+
"ubuntu" => nil
|
122
|
+
}
|
123
|
+
})
|
124
|
+
}.to raise_error Natives::InvalidCatalogFormat
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
@@ -2,123 +2,50 @@ require 'spec_helper'
|
|
2
2
|
require 'natives/catalog/selector'
|
3
3
|
|
4
4
|
describe Natives::Catalog::Selector do
|
5
|
-
describe "#new" do
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
Natives::Catalog::Selector.new({
|
17
|
-
"mac_os_x/homebrew" => {"default" => "value"},
|
18
|
-
"ubuntu" => {"default" => "value"},
|
19
|
-
"debian" => {"default" => "value"}
|
20
|
-
})
|
21
|
-
}.to raise_error ArgumentError, /Found an invalid key: "ubuntu"/
|
22
|
-
end
|
23
|
-
|
24
|
-
it "raises error when found an invalid array as hash key" do
|
25
|
-
expect {
|
26
|
-
Natives::Catalog::Selector.new({
|
27
|
-
["fedora/yum", "redhat/yum"] => {"default" => "value"},
|
28
|
-
["centos/yum", "oracle"] => {"default" => "value"},
|
29
|
-
})
|
30
|
-
}.to raise_error ArgumentError, /Found an invalid key: "oracle"/
|
31
|
-
end
|
32
|
-
|
33
|
-
it "raises error if platform hash's value is not a hash" do
|
34
|
-
expect {
|
35
|
-
Natives::Catalog::Selector.new({
|
36
|
-
"ubuntu/apt" => "value",
|
37
|
-
"mac_os_x/homebrew" => {"default" => "value"},
|
38
|
-
})
|
39
|
-
}.to raise_error ArgumentError, /Found an invalid value: "value"/
|
40
|
-
end
|
41
|
-
|
42
|
-
it "accepts default platform value" do
|
43
|
-
expect {
|
44
|
-
Natives::Catalog::Selector.new({
|
45
|
-
"default" => "value"
|
46
|
-
})
|
47
|
-
}.not_to raise_error
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe "normalize platform hash" do
|
52
|
-
class ProxySelector < Natives::Catalog::Selector
|
53
|
-
def normalized_values
|
54
|
-
@values
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
it "expand platform array" do
|
59
|
-
expect(ProxySelector.new({
|
60
|
-
"mac_os_x/homebrew" => {"default" => "value1"},
|
61
|
-
["ubuntu/apt", "debian/apt"] => {"default" => "value2"}
|
62
|
-
}).normalized_values).to eq({
|
63
|
-
"mac_os_x/homebrew" => {"default" => "value1"},
|
64
|
-
"ubuntu/apt" => {"default" => "value2"},
|
65
|
-
"debian/apt" => {"default" => "value2"}
|
66
|
-
})
|
67
|
-
end
|
68
|
-
|
69
|
-
it "expand version array" do
|
70
|
-
expect(ProxySelector.new({
|
71
|
-
"mac_os_x/homebrew" => {
|
72
|
-
"default" => "value1",
|
73
|
-
["v1", "v2"] => "value2"
|
6
|
+
describe "#value_for" do
|
7
|
+
let(:selector) do
|
8
|
+
Natives::Catalog::Selector.new({
|
9
|
+
apt: {
|
10
|
+
default: 'apt-default',
|
11
|
+
ubuntu: {
|
12
|
+
'12.10' => 'ubuntu-12.10',
|
13
|
+
%w(10.10 10.10.1 10.10.2) => %w(ubuntu-10.10s),
|
14
|
+
'default' => %w(ubuntu-default1 ubuntu-default2)
|
74
15
|
}
|
75
|
-
}
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
"v2" => "value2"
|
16
|
+
},
|
17
|
+
homebrew: {
|
18
|
+
mac_os_x: {
|
19
|
+
'10' => 'foo'
|
80
20
|
}
|
81
|
-
}
|
82
|
-
|
21
|
+
}
|
22
|
+
})
|
83
23
|
end
|
84
|
-
end
|
85
24
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
Natives::Catalog::Selector.new({
|
90
|
-
"ubuntu/apt" => {"default" => "libcurl"},
|
91
|
-
"default" => "curl"
|
92
|
-
}).value_for('mac_os_x', '10.7.5', 'homebrew')
|
93
|
-
).to eq('curl')
|
25
|
+
it "returns values for a specific platform version" do
|
26
|
+
expect(selector.values_for(:apt, :ubuntu, :'12.10')).to eq(
|
27
|
+
['ubuntu-12.10'])
|
94
28
|
end
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
Natives::Catalog::Selector.new({
|
99
|
-
["mac_os_x/homebrew", "mac_os_x/macports"] => {
|
100
|
-
"10.7.5" => "curl", "default" => "foo"},
|
101
|
-
"default" => "bar"
|
102
|
-
}).value_for('mac_os_x', '10.7.5', 'homebrew')
|
103
|
-
).to eq('curl')
|
29
|
+
it "returns a value for a specific platform version in version group" do
|
30
|
+
expect(selector.values_for(:apt, :ubuntu, :'10.10.1')).to eq(
|
31
|
+
['ubuntu-10.10s'])
|
104
32
|
end
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
Natives::Catalog::Selector.new({
|
109
|
-
"mac_os_x/homebrew" => {
|
110
|
-
"10.7.5" => "curl", "default" => "foo"},
|
111
|
-
"default" => "bar"
|
112
|
-
}).value_for('mac_os_x', '10.8.0', 'homebrew')
|
113
|
-
).to eq('foo')
|
33
|
+
it "returns default version values when no matching platform version" do
|
34
|
+
expect(selector.values_for('apt', 'ubuntu', '13')).to eq(
|
35
|
+
['ubuntu-default1', 'ubuntu-default2'])
|
114
36
|
end
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
37
|
+
it "returns default value when not matching platform" do
|
38
|
+
expect(selector.values_for(:apt, :foo, :'13')).to eq(
|
39
|
+
['apt-default'])
|
40
|
+
end
|
41
|
+
it "returns empty list if there is no matching package provider" do
|
42
|
+
expect(selector.values_for(:notfound, :ubuntu, '10')).to eq([])
|
43
|
+
end
|
44
|
+
it "returns nil if there is no default and no matching platform" do
|
45
|
+
expect(selector.values_for(:homebrew, :notfound, 1)).to eq([])
|
46
|
+
end
|
47
|
+
it "returns nil if there is no default and no matching platform version" do
|
48
|
+
expect(selector.values_for(:homebrew, :mac_os_x, '999')).to eq([])
|
122
49
|
end
|
123
50
|
end
|
124
51
|
end
|
@@ -93,14 +93,18 @@ describe Natives::Catalog do
|
|
93
93
|
and_return({
|
94
94
|
'rubygems' => {
|
95
95
|
'nokogiri' => {
|
96
|
-
'
|
97
|
-
'
|
98
|
-
|
96
|
+
'apt' => {
|
97
|
+
'ubuntu' => {
|
98
|
+
'13.10' => 'value1',
|
99
|
+
'default' => 'value2'
|
100
|
+
}
|
99
101
|
}
|
100
102
|
},
|
101
103
|
'curb' => {
|
102
|
-
'
|
103
|
-
'
|
104
|
+
'apt' => {
|
105
|
+
'ubuntu' => {
|
106
|
+
'default' => 'value3'
|
107
|
+
}
|
104
108
|
}
|
105
109
|
}
|
106
110
|
},
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: natives
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
MC41LjU=
|
4
|
+
version: 0.6.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Huiming Teo
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-11-
|
11
|
+
date: 2013-11-18 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: ohai
|
@@ -95,20 +94,6 @@ dependencies:
|
|
95
94
|
- - ! '>='
|
96
95
|
- !ruby/object:Gem::Version
|
97
96
|
version: '0'
|
98
|
-
- !ruby/object:Gem::Dependency
|
99
|
-
name: bundler
|
100
|
-
requirement: !ruby/object:Gem::Requirement
|
101
|
-
requirements:
|
102
|
-
- - ! '>='
|
103
|
-
- !ruby/object:Gem::Version
|
104
|
-
version: '0'
|
105
|
-
type: :development
|
106
|
-
prerelease: false
|
107
|
-
version_requirements: !ruby/object:Gem::Requirement
|
108
|
-
requirements:
|
109
|
-
- - ! '>='
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
version: '0'
|
112
97
|
- !ruby/object:Gem::Dependency
|
113
98
|
name: jeweler
|
114
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -193,9 +178,11 @@ files:
|
|
193
178
|
- lib/natives/catalog.rb
|
194
179
|
- lib/natives/catalog/loader.rb
|
195
180
|
- lib/natives/catalog/merger.rb
|
181
|
+
- lib/natives/catalog/normalizer.rb
|
196
182
|
- lib/natives/catalog/selector.rb
|
197
183
|
- lib/natives/catalog/validator.rb
|
198
184
|
- lib/natives/cli.rb
|
185
|
+
- lib/natives/errors.rb
|
199
186
|
- lib/natives/gemfile_viewer.rb
|
200
187
|
- lib/natives/host_detection.rb
|
201
188
|
- lib/natives/host_detection/package_provider.rb
|
@@ -215,6 +202,7 @@ files:
|
|
215
202
|
- spec/natives/apps/list_spec.rb
|
216
203
|
- spec/natives/catalog/loader_spec.rb
|
217
204
|
- spec/natives/catalog/merger_spec.rb
|
205
|
+
- spec/natives/catalog/normalizer_spec.rb
|
218
206
|
- spec/natives/catalog/selector_spec.rb
|
219
207
|
- spec/natives/catalog/validator_spec.rb
|
220
208
|
- spec/natives/catalog_spec.rb
|
@@ -243,7 +231,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
243
231
|
version: '0'
|
244
232
|
requirements: []
|
245
233
|
rubyforge_project:
|
246
|
-
rubygems_version: 2.1.
|
234
|
+
rubygems_version: 2.1.11
|
247
235
|
signing_key:
|
248
236
|
specification_version: 4
|
249
237
|
summary: Lookup native packages required by gems.
|