natives 0.5.5 → 0.6.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.
- 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
|
[](http://badge.fury.io/rb/natives)
|
4
4
|
[](https://codeclimate.com/github/teohm/natives)
|
5
5
|
[](https://travis-ci.org/teohm/natives)
|
6
|
+
[](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.
|