licensed 2.9.2 → 2.10.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 +5 -5
- data/.github/workflows/release.yml +11 -12
- data/.github/workflows/test.yml +68 -49
- data/CHANGELOG.md +11 -1
- data/README.md +4 -2
- data/docs/configuration.md +20 -0
- data/docs/sources/nuget.md +14 -0
- data/lib/licensed/commands/cache.rb +47 -17
- data/lib/licensed/configuration.rb +12 -2
- data/lib/licensed/reporters/reporter.rb +3 -0
- data/lib/licensed/sources.rb +1 -0
- data/lib/licensed/sources/go.rb +1 -1
- data/lib/licensed/sources/npm.rb +1 -0
- data/lib/licensed/sources/nuget.rb +206 -0
- data/lib/licensed/version.rb +1 -1
- data/licensed.gemspec +2 -1
- data/script/source-setup/nuget +17 -0
- metadata +22 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 8b47685dba77cc47406dfa9aa2dd805c5f4a1746ea547a5b34c39a6d2ec47dcf
|
|
4
|
+
data.tar.gz: 0eef1add309449ee2f00a33831d780cf6250990bb74be08077cf786ab28996a2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: e01ca0150f1690ade72d0c95743d435af9796269d6b3a51496d39b5e98c186dc0cf78dd824f565c7070dc75e8a85e5af0aad21c8382b92b1578bd09edbe89dd3
|
|
7
|
+
data.tar.gz: 0d00ed4c4b0596f96cb2ec77972fe36352bc17a84ee7043b5c3d002db9d9b2f15c9ddf87a2b67ebf36b99eb8dc8b02b4a917e68f9d83d2d42457bb26ee3a5314
|
|
@@ -14,7 +14,7 @@ jobs:
|
|
|
14
14
|
needs: tag_filter
|
|
15
15
|
|
|
16
16
|
steps:
|
|
17
|
-
- uses: actions/checkout@
|
|
17
|
+
- uses: actions/checkout@v2
|
|
18
18
|
- name: Set up Ruby 2.6
|
|
19
19
|
uses: actions/setup-ruby@v1
|
|
20
20
|
with:
|
|
@@ -25,7 +25,7 @@ jobs:
|
|
|
25
25
|
env:
|
|
26
26
|
VERSION: ${{github.event.ref}}
|
|
27
27
|
|
|
28
|
-
- uses: actions/upload-artifact@
|
|
28
|
+
- uses: actions/upload-artifact@v2
|
|
29
29
|
with:
|
|
30
30
|
name: ${{github.event.ref}}-linux
|
|
31
31
|
path: pkg/${{github.event.ref}}/licensed-${{github.event.ref}}-linux-x64.tar.gz
|
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
needs: tag_filter
|
|
36
36
|
|
|
37
37
|
steps:
|
|
38
|
-
- uses: actions/checkout@
|
|
38
|
+
- uses: actions/checkout@v2
|
|
39
39
|
- name: Set up Ruby 2.6
|
|
40
40
|
uses: actions/setup-ruby@v1
|
|
41
41
|
with:
|
|
@@ -46,7 +46,7 @@ jobs:
|
|
|
46
46
|
env:
|
|
47
47
|
VERSION: ${{github.event.ref}}
|
|
48
48
|
|
|
49
|
-
- uses: actions/upload-artifact@
|
|
49
|
+
- uses: actions/upload-artifact@v2
|
|
50
50
|
with:
|
|
51
51
|
name: ${{github.event.ref}}-darwin
|
|
52
52
|
path: pkg/${{github.event.ref}}/licensed-${{github.event.ref}}-darwin-x64.tar.gz
|
|
@@ -56,7 +56,7 @@ jobs:
|
|
|
56
56
|
needs: tag_filter
|
|
57
57
|
|
|
58
58
|
steps:
|
|
59
|
-
- uses: actions/checkout@
|
|
59
|
+
- uses: actions/checkout@v2
|
|
60
60
|
- name: Set up Ruby 2.6
|
|
61
61
|
uses: actions/setup-ruby@v1
|
|
62
62
|
with:
|
|
@@ -65,7 +65,7 @@ jobs:
|
|
|
65
65
|
- name: Build gem
|
|
66
66
|
run: gem build *.gemspec
|
|
67
67
|
|
|
68
|
-
- uses: actions/upload-artifact@
|
|
68
|
+
- uses: actions/upload-artifact@v2
|
|
69
69
|
with:
|
|
70
70
|
name: ${{github.event.ref}}-gem
|
|
71
71
|
path: licensed-${{github.event.ref}}.gem
|
|
@@ -74,7 +74,6 @@ jobs:
|
|
|
74
74
|
runs-on: ubuntu-latest
|
|
75
75
|
needs: [package_linux, package_mac, build_gem]
|
|
76
76
|
steps:
|
|
77
|
-
- uses: actions/checkout@master
|
|
78
77
|
- uses: Roang-zero1/github-create-release-action@v1.0.2
|
|
79
78
|
env:
|
|
80
79
|
GITHUB_TOKEN: ${{ secrets.API_AUTH_TOKEN }}
|
|
@@ -91,24 +90,24 @@ jobs:
|
|
|
91
90
|
ruby-version: 2.6.x
|
|
92
91
|
|
|
93
92
|
- name: Download linux package
|
|
94
|
-
uses: actions/download-artifact@
|
|
93
|
+
uses: actions/download-artifact@v2
|
|
95
94
|
with:
|
|
96
95
|
name: ${{github.event.ref}}-linux
|
|
97
96
|
|
|
98
97
|
- name: Download macOS package
|
|
99
|
-
uses: actions/download-artifact@
|
|
98
|
+
uses: actions/download-artifact@v2
|
|
100
99
|
with:
|
|
101
100
|
name: ${{github.event.ref}}-darwin
|
|
102
101
|
|
|
103
102
|
- name: Download gem
|
|
104
|
-
uses: actions/download-artifact@
|
|
103
|
+
uses: actions/download-artifact@v2
|
|
105
104
|
with:
|
|
106
105
|
name: ${{github.event.ref}}-gem
|
|
107
106
|
|
|
108
107
|
- name: Publish packages to GitHub Release
|
|
109
108
|
uses: Roang-zero1/github-upload-release-artifacts-action@v2.0.0
|
|
110
109
|
with:
|
|
111
|
-
args:
|
|
110
|
+
args: licensed-${{github.event.ref}}-linux-x64.tar.gz licensed-${{github.event.ref}}-darwin-x64.tar.gz
|
|
112
111
|
env:
|
|
113
112
|
GITHUB_TOKEN: ${{secrets.API_AUTH_TOKEN}}
|
|
114
113
|
|
|
@@ -121,4 +120,4 @@ jobs:
|
|
|
121
120
|
gem push $GEM
|
|
122
121
|
env:
|
|
123
122
|
GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
|
|
124
|
-
GEM:
|
|
123
|
+
GEM: licensed-${{github.event.ref}}.gem
|
data/.github/workflows/test.yml
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
name: Test
|
|
2
2
|
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
branches:
|
|
6
|
-
- "*"
|
|
7
|
-
tags:
|
|
8
|
-
- "!*"
|
|
3
|
+
on: pull_request
|
|
9
4
|
|
|
10
5
|
jobs:
|
|
11
6
|
bower:
|
|
12
7
|
runs-on: ubuntu-latest
|
|
13
8
|
steps:
|
|
14
|
-
- uses: actions/checkout@
|
|
9
|
+
- uses: actions/checkout@v2
|
|
15
10
|
- name: Setup node
|
|
16
11
|
uses: actions/setup-node@v1
|
|
17
12
|
with:
|
|
@@ -23,10 +18,10 @@ jobs:
|
|
|
23
18
|
with:
|
|
24
19
|
ruby-version: 2.6.x
|
|
25
20
|
- run: bundle lock
|
|
26
|
-
- uses: actions/cache@
|
|
21
|
+
- uses: actions/cache@v1
|
|
27
22
|
with:
|
|
28
23
|
path: vendor/gems
|
|
29
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
24
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
30
25
|
- name: Bootstrap
|
|
31
26
|
run: script/bootstrap
|
|
32
27
|
- name: Set up fixtures
|
|
@@ -40,7 +35,7 @@ jobs:
|
|
|
40
35
|
matrix:
|
|
41
36
|
bundler: [ '~> 1.15.0', '~> 1.16.0', '~> 1.17.0', '~> 2.0.0' ]
|
|
42
37
|
steps:
|
|
43
|
-
- uses: actions/checkout@
|
|
38
|
+
- uses: actions/checkout@v2
|
|
44
39
|
- name: Set up Ruby
|
|
45
40
|
uses: actions/setup-ruby@v1
|
|
46
41
|
with:
|
|
@@ -50,10 +45,10 @@ jobs:
|
|
|
50
45
|
yes | gem uninstall bundler --all
|
|
51
46
|
gem install bundler -v "${{ matrix.bundler }}"
|
|
52
47
|
- run: bundle lock
|
|
53
|
-
- uses: actions/cache@
|
|
48
|
+
- uses: actions/cache@v1
|
|
54
49
|
with:
|
|
55
50
|
path: vendor/gems
|
|
56
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
51
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
57
52
|
- name: Bootstrap
|
|
58
53
|
run: script/bootstrap
|
|
59
54
|
- name: Set up fixtures
|
|
@@ -66,9 +61,9 @@ jobs:
|
|
|
66
61
|
strategy:
|
|
67
62
|
matrix:
|
|
68
63
|
ghc: [ '8.2.2', '8.6.5' ]
|
|
69
|
-
cabal: [ '2.
|
|
64
|
+
cabal: [ '2.2', '2.4', '3.0', 'latest' ]
|
|
70
65
|
steps:
|
|
71
|
-
- uses: actions/checkout@
|
|
66
|
+
- uses: actions/checkout@v2
|
|
72
67
|
- name: Set up Ruby
|
|
73
68
|
uses: actions/setup-ruby@v1
|
|
74
69
|
with:
|
|
@@ -79,10 +74,10 @@ jobs:
|
|
|
79
74
|
ghc-version: ${{ matrix.ghc }}
|
|
80
75
|
cabal-version: ${{ matrix.cabal }}
|
|
81
76
|
- run: bundle lock
|
|
82
|
-
- uses: actions/cache@
|
|
77
|
+
- uses: actions/cache@v1
|
|
83
78
|
with:
|
|
84
79
|
path: vendor/gems
|
|
85
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
80
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
86
81
|
- name: Bootstrap
|
|
87
82
|
run: script/bootstrap
|
|
88
83
|
- name: Set up fixtures
|
|
@@ -96,7 +91,7 @@ jobs:
|
|
|
96
91
|
matrix:
|
|
97
92
|
php: [ '5.6', '7.1', '7.2', '7.3' ]
|
|
98
93
|
steps:
|
|
99
|
-
- uses: actions/checkout@
|
|
94
|
+
- uses: actions/checkout@v2
|
|
100
95
|
- name: Setup php
|
|
101
96
|
uses: nanasess/setup-php@v1.0.2
|
|
102
97
|
with:
|
|
@@ -106,10 +101,10 @@ jobs:
|
|
|
106
101
|
with:
|
|
107
102
|
ruby-version: 2.6.x
|
|
108
103
|
- run: bundle lock
|
|
109
|
-
- uses: actions/cache@
|
|
104
|
+
- uses: actions/cache@v1
|
|
110
105
|
with:
|
|
111
106
|
path: vendor/gems
|
|
112
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
107
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
113
108
|
- name: Bootstrap
|
|
114
109
|
run: script/bootstrap
|
|
115
110
|
- name: Set up fixtures
|
|
@@ -123,7 +118,7 @@ jobs:
|
|
|
123
118
|
matrix:
|
|
124
119
|
ruby: [ 2.4.x, 2.5.x, 2.6.x ]
|
|
125
120
|
steps:
|
|
126
|
-
- uses: actions/checkout@
|
|
121
|
+
- uses: actions/checkout@v2
|
|
127
122
|
- name: Set up Ruby
|
|
128
123
|
uses: actions/setup-ruby@v1
|
|
129
124
|
with:
|
|
@@ -131,10 +126,10 @@ jobs:
|
|
|
131
126
|
- name: Set up Bundler
|
|
132
127
|
run: gem install bundler
|
|
133
128
|
- run: bundle lock
|
|
134
|
-
- uses: actions/cache@
|
|
129
|
+
- uses: actions/cache@v1
|
|
135
130
|
with:
|
|
136
131
|
path: vendor/gems
|
|
137
|
-
key: ${{ runner.os }}-gem-${{ matrix.ruby }}-${{ hashFiles(
|
|
132
|
+
key: ${{ runner.os }}-gem-${{ matrix.ruby }}-${{ hashFiles('**/Gemfile.lock') }}
|
|
138
133
|
- name: Bootstrap
|
|
139
134
|
run: script/bootstrap
|
|
140
135
|
- name: Build and lint
|
|
@@ -145,7 +140,7 @@ jobs:
|
|
|
145
140
|
dep:
|
|
146
141
|
runs-on: ubuntu-latest
|
|
147
142
|
steps:
|
|
148
|
-
- uses: actions/checkout@
|
|
143
|
+
- uses: actions/checkout@v2
|
|
149
144
|
- name: Setup go
|
|
150
145
|
uses: actions/setup-go@v1
|
|
151
146
|
with:
|
|
@@ -155,10 +150,10 @@ jobs:
|
|
|
155
150
|
with:
|
|
156
151
|
ruby-version: 2.6.x
|
|
157
152
|
- run: bundle lock
|
|
158
|
-
- uses: actions/cache@
|
|
153
|
+
- uses: actions/cache@v1
|
|
159
154
|
with:
|
|
160
155
|
path: vendor/gems
|
|
161
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
156
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
162
157
|
- name: Bootstrap
|
|
163
158
|
run: script/bootstrap
|
|
164
159
|
- name: Set up fixtures
|
|
@@ -172,7 +167,7 @@ jobs:
|
|
|
172
167
|
matrix:
|
|
173
168
|
go: [ '1.7.x', '1.10.x', '1.11.x', '1.12.x', '1.13.x', '1.14.x' ]
|
|
174
169
|
steps:
|
|
175
|
-
- uses: actions/checkout@
|
|
170
|
+
- uses: actions/checkout@v2
|
|
176
171
|
- name: Setup go
|
|
177
172
|
uses: actions/setup-go@v1
|
|
178
173
|
with:
|
|
@@ -182,10 +177,10 @@ jobs:
|
|
|
182
177
|
with:
|
|
183
178
|
ruby-version: 2.6.x
|
|
184
179
|
- run: bundle lock
|
|
185
|
-
- uses: actions/cache@
|
|
180
|
+
- uses: actions/cache@v1
|
|
186
181
|
with:
|
|
187
182
|
path: vendor/gems
|
|
188
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
183
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
189
184
|
- name: Bootstrap
|
|
190
185
|
run: script/bootstrap
|
|
191
186
|
- name: Set up fixtures
|
|
@@ -196,16 +191,16 @@ jobs:
|
|
|
196
191
|
gradle:
|
|
197
192
|
runs-on: ubuntu-latest
|
|
198
193
|
steps:
|
|
199
|
-
- uses: actions/checkout@
|
|
194
|
+
- uses: actions/checkout@v2
|
|
200
195
|
- name: Set up Ruby
|
|
201
196
|
uses: actions/setup-ruby@v1
|
|
202
197
|
with:
|
|
203
198
|
ruby-version: 2.6.x
|
|
204
199
|
- run: bundle lock
|
|
205
|
-
- uses: actions/cache@
|
|
200
|
+
- uses: actions/cache@v1
|
|
206
201
|
with:
|
|
207
202
|
path: vendor/gems
|
|
208
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
203
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
209
204
|
- name: Bootstrap
|
|
210
205
|
run: script/bootstrap
|
|
211
206
|
- name: Gradle version
|
|
@@ -216,16 +211,16 @@ jobs:
|
|
|
216
211
|
manifest:
|
|
217
212
|
runs-on: ubuntu-latest
|
|
218
213
|
steps:
|
|
219
|
-
- uses: actions/checkout@
|
|
214
|
+
- uses: actions/checkout@v2
|
|
220
215
|
- name: Set up Ruby
|
|
221
216
|
uses: actions/setup-ruby@v1
|
|
222
217
|
with:
|
|
223
218
|
ruby-version: 2.6.x
|
|
224
219
|
- run: bundle lock
|
|
225
|
-
- uses: actions/cache@
|
|
220
|
+
- uses: actions/cache@v1
|
|
226
221
|
with:
|
|
227
222
|
path: vendor/gems
|
|
228
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
223
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
229
224
|
- name: Bootstrap
|
|
230
225
|
run: script/bootstrap
|
|
231
226
|
- name: Run tests
|
|
@@ -238,7 +233,7 @@ jobs:
|
|
|
238
233
|
otp: [21.x, 22.x]
|
|
239
234
|
elixir: [1.8.x, 1.9.x]
|
|
240
235
|
steps:
|
|
241
|
-
- uses: actions/checkout@
|
|
236
|
+
- uses: actions/checkout@v2
|
|
242
237
|
- uses: actions/setup-elixir@v1.0.0
|
|
243
238
|
with:
|
|
244
239
|
otp-version: ${{matrix.otp}}
|
|
@@ -248,10 +243,10 @@ jobs:
|
|
|
248
243
|
with:
|
|
249
244
|
ruby-version: 2.6.x
|
|
250
245
|
- run: bundle lock
|
|
251
|
-
- uses: actions/cache@
|
|
246
|
+
- uses: actions/cache@v1
|
|
252
247
|
with:
|
|
253
248
|
path: vendor/gems
|
|
254
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
249
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
255
250
|
- name: Bootstrap
|
|
256
251
|
run: script/bootstrap
|
|
257
252
|
- name: Set up fixtures
|
|
@@ -265,7 +260,7 @@ jobs:
|
|
|
265
260
|
matrix:
|
|
266
261
|
node_version: [ 8, 10, 12 ]
|
|
267
262
|
steps:
|
|
268
|
-
- uses: actions/checkout@
|
|
263
|
+
- uses: actions/checkout@v2
|
|
269
264
|
- name: Setup node
|
|
270
265
|
uses: actions/setup-node@v1
|
|
271
266
|
with:
|
|
@@ -275,10 +270,10 @@ jobs:
|
|
|
275
270
|
with:
|
|
276
271
|
ruby-version: 2.6.x
|
|
277
272
|
- run: bundle lock
|
|
278
|
-
- uses: actions/cache@
|
|
273
|
+
- uses: actions/cache@v1
|
|
279
274
|
with:
|
|
280
275
|
path: vendor/gems
|
|
281
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
276
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
282
277
|
- name: Bootstrap
|
|
283
278
|
run: script/bootstrap
|
|
284
279
|
- name: Set up fixtures
|
|
@@ -286,13 +281,37 @@ jobs:
|
|
|
286
281
|
- name: Run tests
|
|
287
282
|
run: script/test npm
|
|
288
283
|
|
|
284
|
+
nuget:
|
|
285
|
+
runs-on: ubuntu-latest
|
|
286
|
+
steps:
|
|
287
|
+
- uses: actions/checkout@v2
|
|
288
|
+
- name: Setup dotnet
|
|
289
|
+
uses: actions/setup-dotnet@v1
|
|
290
|
+
with:
|
|
291
|
+
dotnet-version: 3.1.202
|
|
292
|
+
- name: Set up Ruby
|
|
293
|
+
uses: actions/setup-ruby@v1
|
|
294
|
+
with:
|
|
295
|
+
ruby-version: 2.6.x
|
|
296
|
+
- run: bundle lock
|
|
297
|
+
- uses: actions/cache@v1
|
|
298
|
+
with:
|
|
299
|
+
path: vendor/gems
|
|
300
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
301
|
+
- name: Bootstrap
|
|
302
|
+
run: script/bootstrap
|
|
303
|
+
- name: Set up fixtures
|
|
304
|
+
run: script/source-setup/nuget
|
|
305
|
+
- name: Run tests
|
|
306
|
+
run: script/test nuget
|
|
307
|
+
|
|
289
308
|
pip:
|
|
290
309
|
runs-on: ubuntu-latest
|
|
291
310
|
strategy:
|
|
292
311
|
matrix:
|
|
293
312
|
python: [ '2.x', '3.x' ]
|
|
294
313
|
steps:
|
|
295
|
-
- uses: actions/checkout@
|
|
314
|
+
- uses: actions/checkout@v2
|
|
296
315
|
- name: Setup python
|
|
297
316
|
uses: actions/setup-python@v1
|
|
298
317
|
with:
|
|
@@ -303,10 +322,10 @@ jobs:
|
|
|
303
322
|
with:
|
|
304
323
|
ruby-version: 2.6.x
|
|
305
324
|
- run: bundle lock
|
|
306
|
-
- uses: actions/cache@
|
|
325
|
+
- uses: actions/cache@v1
|
|
307
326
|
with:
|
|
308
327
|
path: vendor/gems
|
|
309
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
328
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
310
329
|
- name: Bootstrap
|
|
311
330
|
run: script/bootstrap
|
|
312
331
|
- name: Install virtualenv
|
|
@@ -319,7 +338,7 @@ jobs:
|
|
|
319
338
|
pipenv:
|
|
320
339
|
runs-on: ubuntu-latest
|
|
321
340
|
steps:
|
|
322
|
-
- uses: actions/checkout@
|
|
341
|
+
- uses: actions/checkout@v2
|
|
323
342
|
- name: Setup python
|
|
324
343
|
uses: actions/setup-python@v1
|
|
325
344
|
with:
|
|
@@ -330,10 +349,10 @@ jobs:
|
|
|
330
349
|
with:
|
|
331
350
|
ruby-version: 2.6.x
|
|
332
351
|
- run: bundle lock
|
|
333
|
-
- uses: actions/cache@
|
|
352
|
+
- uses: actions/cache@v1
|
|
334
353
|
with:
|
|
335
354
|
path: vendor/gems
|
|
336
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
355
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
337
356
|
- name: Bootstrap
|
|
338
357
|
run: script/bootstrap
|
|
339
358
|
- name: Install pipenv
|
|
@@ -350,7 +369,7 @@ jobs:
|
|
|
350
369
|
# not using 1.0.0 because it doesn't support `yarn list --production`
|
|
351
370
|
yarn_version: [ 1.4.0, latest ]
|
|
352
371
|
steps:
|
|
353
|
-
- uses: actions/checkout@
|
|
372
|
+
- uses: actions/checkout@v2
|
|
354
373
|
- name: Setup node
|
|
355
374
|
uses: actions/setup-node@v1
|
|
356
375
|
with:
|
|
@@ -364,10 +383,10 @@ jobs:
|
|
|
364
383
|
with:
|
|
365
384
|
ruby-version: 2.6.x
|
|
366
385
|
- run: bundle lock
|
|
367
|
-
- uses: actions/cache@
|
|
386
|
+
- uses: actions/cache@v1
|
|
368
387
|
with:
|
|
369
388
|
path: vendor/gems
|
|
370
|
-
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles(
|
|
389
|
+
key: ${{ runner.os }}-gem-2.6.x-${{ hashFiles('**/Gemfile.lock') }}
|
|
371
390
|
- name: Bootstrap
|
|
372
391
|
run: script/bootstrap
|
|
373
392
|
- name: Set up fixtures
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## 2.10.0
|
|
10
|
+
2020-05-15
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- NPM source ignores missing peer dependencies (https://github.com/github/licensed/pull/267)
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- Nuget source (:tada: @zarenner https://github.com/github/licensed/pull/261)
|
|
17
|
+
- Multiple apps can share a single cache location (https://github.com/github/licensed/pull/263)
|
|
18
|
+
|
|
9
19
|
## 2.9.2
|
|
10
20
|
2020-04-28
|
|
11
21
|
|
|
@@ -292,4 +302,4 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
|
|
|
292
302
|
|
|
293
303
|
Initial release :tada:
|
|
294
304
|
|
|
295
|
-
[Unreleased]: https://github.com/github/licensed/compare/2.
|
|
305
|
+
[Unreleased]: https://github.com/github/licensed/compare/2.10.0...HEAD
|
data/README.md
CHANGED
|
@@ -102,14 +102,16 @@ Dependencies will be automatically detected for all of the following sources by
|
|
|
102
102
|
1. [Bundler](./docs/sources/bundler.md)
|
|
103
103
|
1. [Cabal](./docs/sources/cabal.md)
|
|
104
104
|
1. [Composer](./docs/sources/composer.md)
|
|
105
|
+
1. [Git Submodules (git_submodule)](./docs/sources/git_submodule.md)
|
|
105
106
|
1. [Go](./docs/sources/go.md)
|
|
106
107
|
1. [Go Dep (dep)](./docs/sources/dep.md)
|
|
108
|
+
1. [Gradle](./docs/sources/gradle.md)
|
|
107
109
|
1. [Manifest lists (manifests)](./docs/sources/manifests.md)
|
|
110
|
+
1. [Mix](./docs/sources/mix.md)
|
|
108
111
|
1. [NPM](./docs/sources/npm.md)
|
|
112
|
+
1. [NuGet](./docs/sources/nuget.md)
|
|
109
113
|
1. [Pip](./docs/sources/pip.md)
|
|
110
114
|
1. [Pipenv](./docs/sources/pipenv.md)
|
|
111
|
-
1. [Git Submodules (git_submodule)](./docs/sources/git_submodule.md)
|
|
112
|
-
1. [Mix](./docs/sources/mix.md)
|
|
113
115
|
1. [Yarn](./docs/sources/yarn.md)
|
|
114
116
|
|
|
115
117
|
You can disable any of them in the configuration file:
|
data/docs/configuration.md
CHANGED
|
@@ -209,6 +209,26 @@ apps:
|
|
|
209
209
|
|
|
210
210
|
In this example, the root configuration will contain a default cache path of `.licenses`. `app1` will inherit this value and append it's name, resulting in a cache path of `.licenses/app1`.
|
|
211
211
|
|
|
212
|
+
### Sharing caches between apps
|
|
213
|
+
|
|
214
|
+
Dependency caches can be shared between apps by setting the same cache path on each app.
|
|
215
|
+
|
|
216
|
+
```yaml
|
|
217
|
+
apps:
|
|
218
|
+
- source_path: "path/to/app1"
|
|
219
|
+
cache_path: ".licenses/apps"
|
|
220
|
+
- source_path: "path/to/app2"
|
|
221
|
+
cache_path: ".licenses/apps"
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
When using a source path with a glob pattern, the apps created from the glob pattern can share a dependency by setting an explicit cache path and setting `shared_cache` to true.
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
source_path: "path/to/apps/*"
|
|
228
|
+
cache_path: ".licenses/apps"
|
|
229
|
+
shared_cache: true
|
|
230
|
+
```
|
|
231
|
+
|
|
212
232
|
## Source specific configuration
|
|
213
233
|
|
|
214
234
|
See the [source documentation](./sources) for details on any source specific configuration.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# NuGet
|
|
2
|
+
|
|
3
|
+
The NuGet source will detect ProjectReference-style restored packages by inspecting `project.assets.json` files for dependencies. It requires that `dotnet restore` has already ran on the project.
|
|
4
|
+
|
|
5
|
+
The source currently expects that `source_path` is set to the `obj` directory containing the `project.assets.json`.
|
|
6
|
+
For example, if your project lives at `foo/foo.proj`, you likely want to set `source_path` to `foo/obj`.
|
|
7
|
+
If in MSBuild you have customized your `obj` paths (e.g. to live outside your source tree), you may need to set `source_path` to something different such as `../obj/foo`.
|
|
8
|
+
|
|
9
|
+
### Search strategy
|
|
10
|
+
This source looks for licenses:
|
|
11
|
+
1. Specified by SPDX expression via `<license type="expression">` in a package's `.nuspec` (via licensee)
|
|
12
|
+
2. In license files such as `LICENSE.txt`, even if not specified in the `.nuspec` (via licensee)
|
|
13
|
+
3. Specified by filepath via `<license type="file">` in a package's `.nuspec`, even if not a standard license filename.
|
|
14
|
+
4. By downloading and inspecting the contents of `<licenseUrl>` in a package's `.nuspec`, if not found otherwise.
|
|
@@ -11,20 +11,39 @@ module Licensed
|
|
|
11
11
|
Licensed::Reporters::CacheReporter.new
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
# Run the command.
|
|
15
|
+
# Removes any cached records that don't match a current application
|
|
16
|
+
# dependency.
|
|
17
|
+
#
|
|
18
|
+
# options - Options to run the command with
|
|
19
|
+
#
|
|
20
|
+
# Returns whether the command was a success
|
|
21
|
+
def run(**options)
|
|
22
|
+
begin
|
|
23
|
+
result = super
|
|
24
|
+
clear_stale_cached_records if result
|
|
25
|
+
|
|
26
|
+
result
|
|
27
|
+
ensure
|
|
28
|
+
cache_paths.clear
|
|
29
|
+
files.clear
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
14
33
|
protected
|
|
15
34
|
|
|
16
|
-
# Run the command for all
|
|
35
|
+
# Run the command for all enabled sources for an application configuration,
|
|
17
36
|
# recording results in a report.
|
|
18
|
-
# Removes any cached records that don't match a current application
|
|
19
|
-
# dependency.
|
|
20
37
|
#
|
|
21
|
-
# app -
|
|
22
|
-
# source - A dependency source enumerator
|
|
38
|
+
# app - An application configuration
|
|
23
39
|
#
|
|
24
|
-
# Returns whether the command succeeded for the
|
|
25
|
-
def
|
|
40
|
+
# Returns whether the command succeeded for the application.
|
|
41
|
+
def run_app(app)
|
|
26
42
|
result = super
|
|
27
|
-
|
|
43
|
+
|
|
44
|
+
# add the full cache path to the list of cache paths evaluted during this run
|
|
45
|
+
cache_paths << app.cache_path
|
|
46
|
+
|
|
28
47
|
result
|
|
29
48
|
end
|
|
30
49
|
|
|
@@ -62,6 +81,9 @@ module Licensed
|
|
|
62
81
|
report.warnings << "expected dependency path #{dependency.path} does not exist"
|
|
63
82
|
end
|
|
64
83
|
|
|
84
|
+
# add the absolute dependency file path to the list of files seen during this licensed run
|
|
85
|
+
files << filename.to_s
|
|
86
|
+
|
|
65
87
|
true
|
|
66
88
|
end
|
|
67
89
|
|
|
@@ -86,18 +108,26 @@ module Licensed
|
|
|
86
108
|
|
|
87
109
|
# Clean up cached files that dont match current dependencies
|
|
88
110
|
#
|
|
89
|
-
# app - An application configuration
|
|
90
|
-
# source - A dependency source enumerator
|
|
91
|
-
#
|
|
92
111
|
# Returns nothing
|
|
93
|
-
def clear_stale_cached_records
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
112
|
+
def clear_stale_cached_records
|
|
113
|
+
cache_paths.each do |cache_path|
|
|
114
|
+
Dir.glob(cache_path.join("**/*.#{DependencyRecord::EXTENSION}")).each do |file|
|
|
115
|
+
next if files.include?(file)
|
|
116
|
+
|
|
117
|
+
FileUtils.rm(file)
|
|
118
|
+
end
|
|
99
119
|
end
|
|
100
120
|
end
|
|
121
|
+
|
|
122
|
+
# Set of unique cache paths that are evaluted during the run
|
|
123
|
+
def cache_paths
|
|
124
|
+
@cache_paths ||= Set.new
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Set of unique absolute file paths of cached records evaluted during the run
|
|
128
|
+
def files
|
|
129
|
+
@files ||= Set.new
|
|
130
|
+
end
|
|
101
131
|
end
|
|
102
132
|
end
|
|
103
133
|
end
|
|
@@ -108,7 +108,12 @@ module Licensed
|
|
|
108
108
|
def detect_cache_path(options, inherited_options)
|
|
109
109
|
return options["cache_path"] unless options["cache_path"].to_s.empty?
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
# if cache_path and shared_cache are both set in inherited_options,
|
|
112
|
+
# don't append the app name to the cache path
|
|
113
|
+
cache_path = inherited_options["cache_path"]
|
|
114
|
+
return cache_path if cache_path && inherited_options["shared_cache"] == true
|
|
115
|
+
|
|
116
|
+
cache_path ||= DEFAULT_CACHE_PATH
|
|
112
117
|
File.join(cache_path, self["name"])
|
|
113
118
|
end
|
|
114
119
|
|
|
@@ -167,7 +172,12 @@ module Licensed
|
|
|
167
172
|
# will handle configurations that don't have these explicitly set
|
|
168
173
|
dir_name = File.basename(path)
|
|
169
174
|
config["name"] = "#{config["name"]}-#{dir_name}" if config["name"]
|
|
170
|
-
|
|
175
|
+
|
|
176
|
+
# if a cache_path is set and is not marked as shared, append the app name
|
|
177
|
+
# to the end of the cache path to make a unique cache path for the app
|
|
178
|
+
if config["cache_path"] && config["shared_cache"] != true
|
|
179
|
+
config["cache_path"] = File.join(config["cache_path"], dir_name)
|
|
180
|
+
end
|
|
171
181
|
|
|
172
182
|
config
|
|
173
183
|
end
|
data/lib/licensed/sources.rb
CHANGED
|
@@ -11,6 +11,7 @@ module Licensed
|
|
|
11
11
|
require "licensed/sources/go"
|
|
12
12
|
require "licensed/sources/manifest"
|
|
13
13
|
require "licensed/sources/npm"
|
|
14
|
+
require "licensed/sources/nuget"
|
|
14
15
|
require "licensed/sources/pip"
|
|
15
16
|
require "licensed/sources/pipenv"
|
|
16
17
|
require "licensed/sources/gradle"
|
data/lib/licensed/sources/go.rb
CHANGED
|
@@ -125,7 +125,7 @@ module Licensed
|
|
|
125
125
|
# find most recent git SHA for a package, or nil if SHA is
|
|
126
126
|
# not available
|
|
127
127
|
Dir.chdir package_directory do
|
|
128
|
-
contents_version
|
|
128
|
+
contents_version(*contents_version_arguments)
|
|
129
129
|
end
|
|
130
130
|
end
|
|
131
131
|
|
data/lib/licensed/sources/npm.rb
CHANGED
|
@@ -48,6 +48,7 @@ module Licensed
|
|
|
48
48
|
# package name to it's metadata
|
|
49
49
|
def recursive_dependencies(dependencies, result = {})
|
|
50
50
|
dependencies.each do |name, dependency|
|
|
51
|
+
next if dependency["peerMissing"]
|
|
51
52
|
next if yarn_lock_present && dependency["missing"]
|
|
52
53
|
(result[name] ||= []) << dependency
|
|
53
54
|
recursive_dependencies(dependency["dependencies"] || {}, result)
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "json"
|
|
3
|
+
require "reverse_markdown"
|
|
4
|
+
|
|
5
|
+
module Licensed
|
|
6
|
+
module Sources
|
|
7
|
+
# Only supports ProjectReference (project.assets.json) style restore used in .NET Core.
|
|
8
|
+
# Does not currently support packages.config style restore.
|
|
9
|
+
class NuGet < Source
|
|
10
|
+
def self.type
|
|
11
|
+
"nuget"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class NuGetDependency < Licensed::Dependency
|
|
15
|
+
LICENSE_FILE_REGEX = /<license\s*type\s*=\s*\"\s*file\s*\"\s*>\s*(.*)\s*<\/license>/ix.freeze
|
|
16
|
+
LICENSE_URL_REGEX = /<licenseUrl>\s*(.*)\s*<\/licenseUrl>/ix.freeze
|
|
17
|
+
PROJECT_URL_REGEX = /<projectUrl>\s*(.*)\s*<\/projectUrl>/ix.freeze
|
|
18
|
+
PROJECT_DESC_REGEX = /<description>\s*(.*)\s*<\/description>/ix.freeze
|
|
19
|
+
|
|
20
|
+
def initialize(name:, version:, path:, search_root: nil, metadata: {}, errors: [])
|
|
21
|
+
super(name: name, version: version, path: path, search_root: search_root, metadata: metadata, errors: errors)
|
|
22
|
+
@metadata["homepage"] = project_url if project_url
|
|
23
|
+
@metadata["summary"] = description if description
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def nuspec_path
|
|
27
|
+
name = @metadata["name"]
|
|
28
|
+
File.join(self.path, "#{name.downcase}.nuspec")
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def nuspec_contents
|
|
32
|
+
return unless nuspec_path
|
|
33
|
+
@nuspec_contents ||= File.read(nuspec_path)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def project_url
|
|
37
|
+
return @project_url if defined?(@project_url)
|
|
38
|
+
return unless nuspec_contents
|
|
39
|
+
@project_url = begin
|
|
40
|
+
match = nuspec_contents.match PROJECT_URL_REGEX
|
|
41
|
+
match[1] if match && match[1]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def description
|
|
46
|
+
return @description if defined?(@description)
|
|
47
|
+
return unless nuspec_contents
|
|
48
|
+
@description = begin
|
|
49
|
+
match = nuspec_contents.match PROJECT_DESC_REGEX
|
|
50
|
+
match[1] if match && match[1]
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def project_files
|
|
55
|
+
@nuget_project_files ||= begin
|
|
56
|
+
files = super().flatten.compact
|
|
57
|
+
|
|
58
|
+
# Only include the local file if it's a file licensee didn't already detect
|
|
59
|
+
nuspec_license_filename = File.basename(nuspec_local_license_file.filename) if nuspec_local_license_file
|
|
60
|
+
if nuspec_license_filename && files.none? { |file| File.basename(file.filename) == nuspec_license_filename }
|
|
61
|
+
files.push(nuspec_local_license_file)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Only download licenseUrl if no recognized license was found locally
|
|
65
|
+
if files.none? { |file| file.license && file.license.key != "other" }
|
|
66
|
+
files.push(nuspec_remote_license_file)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
files.compact
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Look for a <license type="file"> element in the nuspec that points to an
|
|
74
|
+
# on-disk license file (which licensee may not find due to a non-standard filename)
|
|
75
|
+
def nuspec_local_license_file
|
|
76
|
+
return @nuspec_local_license_file if defined?(@nuspec_local_license_file)
|
|
77
|
+
return unless nuspec_contents
|
|
78
|
+
|
|
79
|
+
match = nuspec_contents.match LICENSE_FILE_REGEX
|
|
80
|
+
return unless match && match[1]
|
|
81
|
+
|
|
82
|
+
license_path = File.join(File.dirname(nuspec_path), match[1])
|
|
83
|
+
return unless File.exist?(license_path)
|
|
84
|
+
|
|
85
|
+
license_data = File.read(license_path)
|
|
86
|
+
@nuspec_local_license_file = Licensee::ProjectFiles::LicenseFile.new(license_data, license_path)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Look for a <licenseUrl> element in the nuspec that either is known to contain a license identifier
|
|
90
|
+
# in the URL, or points to license text on the internet that can be downloaded.
|
|
91
|
+
def nuspec_remote_license_file
|
|
92
|
+
return @nuspec_remote_license_file if defined?(@nuspec_remote_license_file)
|
|
93
|
+
return unless nuspec_contents
|
|
94
|
+
|
|
95
|
+
match = nuspec_contents.match LICENSE_URL_REGEX
|
|
96
|
+
return unless match && match[1]
|
|
97
|
+
|
|
98
|
+
# Attempt to fetch the license content
|
|
99
|
+
license_content = self.class.retrieve_license(match[1])
|
|
100
|
+
@nuspec_remote_license_file = Licensee::ProjectFiles::LicenseFile.new(license_content, { uri: match[1] }) if license_content
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
class << self
|
|
104
|
+
def strip_html(html)
|
|
105
|
+
return unless html
|
|
106
|
+
|
|
107
|
+
return html unless html.downcase.include?("<html")
|
|
108
|
+
ReverseMarkdown.convert(html, unknown_tags: :bypass)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def ignored_url?(url)
|
|
112
|
+
# Many Microsoft packages that now use <license> use this for <licenseUrl>
|
|
113
|
+
# No need to fetch this page - it just contains NuGet documentation
|
|
114
|
+
url == "https://aka.ms/deprecateLicenseUrl"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def text_content_url(url)
|
|
118
|
+
# Convert github file URLs to raw URLs
|
|
119
|
+
return url unless match = url.match(/https?:\/\/(?:www\.)?github.com\/([^\/]+)\/([^\/]+)\/blob\/(.*)/i)
|
|
120
|
+
"https://github.com/#{match[1]}/#{match[2]}/raw/#{match[3]}"
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def retrieve_license(url)
|
|
124
|
+
return unless url
|
|
125
|
+
return if ignored_url?(url)
|
|
126
|
+
|
|
127
|
+
# Transform URLs that are known to return HTML but have a corresponding text-based URL
|
|
128
|
+
text_url = text_content_url(url)
|
|
129
|
+
|
|
130
|
+
raw_content = fetch_content(text_url)
|
|
131
|
+
strip_html(raw_content)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def fetch_content(url, redirect_limit = 5)
|
|
135
|
+
url = URI.parse(url) if url.instance_of? String
|
|
136
|
+
return @response_by_url[url] if (@response_by_url ||= {}).key?(url)
|
|
137
|
+
return if redirect_limit == 0
|
|
138
|
+
|
|
139
|
+
begin
|
|
140
|
+
response = Net::HTTP.get_response(url)
|
|
141
|
+
case response
|
|
142
|
+
when Net::HTTPSuccess then
|
|
143
|
+
@response_by_url[url] = response.body
|
|
144
|
+
when Net::HTTPRedirection then
|
|
145
|
+
redirect_url = URI.parse(response["location"])
|
|
146
|
+
if redirect_url.relative?
|
|
147
|
+
redirect_url = url + redirect_url
|
|
148
|
+
end
|
|
149
|
+
# The redirect might be to a URL that requires transformation, i.e. a github file
|
|
150
|
+
redirect_url = text_content_url(redirect_url.to_s)
|
|
151
|
+
@response_by_url[url] = fetch_content(redirect_url, redirect_limit - 1)
|
|
152
|
+
end
|
|
153
|
+
rescue
|
|
154
|
+
# Host might no longer exist or some other error, ignore
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def project_assets_file_path
|
|
161
|
+
File.join(config.pwd, "project.assets.json")
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def project_assets_file
|
|
165
|
+
return @project_assets_file if defined?(@project_assets_file)
|
|
166
|
+
@project_assets_file = File.read(project_assets_file_path)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def enabled?
|
|
170
|
+
File.exist?(project_assets_file_path)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Inspect project.assets.json files for package references.
|
|
174
|
+
# Ideally we'd use `dotnet list package` instead, but its output isn't
|
|
175
|
+
# easily machine readable and doesn't contain everything we need.
|
|
176
|
+
def enumerate_dependencies
|
|
177
|
+
json = JSON.parse(project_assets_file)
|
|
178
|
+
nuget_packages_dir = json["project"]["restore"]["packagesPath"]
|
|
179
|
+
json["targets"].each_with_object({}) do |(_, target), dependencies|
|
|
180
|
+
target.each do |reference_key, reference|
|
|
181
|
+
# Ignore project references
|
|
182
|
+
next unless reference["type"] == "package"
|
|
183
|
+
package_id_parts = reference_key.partition("/")
|
|
184
|
+
name = package_id_parts[0]
|
|
185
|
+
version = package_id_parts[-1]
|
|
186
|
+
id = "#{name}-#{version}"
|
|
187
|
+
|
|
188
|
+
# Already know this package from another target
|
|
189
|
+
next if dependencies.key?(id)
|
|
190
|
+
|
|
191
|
+
path = File.join(nuget_packages_dir, json["libraries"][reference_key]["path"])
|
|
192
|
+
dependencies[id] = NuGetDependency.new(
|
|
193
|
+
name: id,
|
|
194
|
+
version: version,
|
|
195
|
+
path: path,
|
|
196
|
+
metadata: {
|
|
197
|
+
"type" => NuGet.type,
|
|
198
|
+
"name" => name
|
|
199
|
+
}
|
|
200
|
+
)
|
|
201
|
+
end
|
|
202
|
+
end.values
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
data/lib/licensed/version.rb
CHANGED
data/licensed.gemspec
CHANGED
|
@@ -23,13 +23,14 @@ Gem::Specification.new do |spec|
|
|
|
23
23
|
|
|
24
24
|
spec.required_ruby_version = ">= 2.3.0"
|
|
25
25
|
|
|
26
|
-
spec.add_dependency "licensee", ">= 9.
|
|
26
|
+
spec.add_dependency "licensee", ">= 9.14.0", "< 10.0.0"
|
|
27
27
|
spec.add_dependency "thor", ">= 0.19"
|
|
28
28
|
spec.add_dependency "pathname-common_prefix", "~> 0.0.1"
|
|
29
29
|
spec.add_dependency "tomlrb", "~> 1.2"
|
|
30
30
|
spec.add_dependency "bundler", ">= 1.10"
|
|
31
31
|
spec.add_dependency "ruby-xxHash", "~> 0.4"
|
|
32
32
|
spec.add_dependency "parallel", ">= 0.18.0"
|
|
33
|
+
spec.add_dependency "reverse_markdown", "~> 1.0"
|
|
33
34
|
|
|
34
35
|
spec.add_development_dependency "rake", ">= 12.3.3"
|
|
35
36
|
spec.add_development_dependency "minitest", "~> 5.8"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
if [ -z "$(which dotnet)" ]; then
|
|
5
|
+
echo "A local dotnet installation is required for dotnet/nuget development." >&2
|
|
6
|
+
exit 127
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
# setup test fixtures
|
|
10
|
+
BASE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
11
|
+
cd $BASE_PATH/test/fixtures/nuget
|
|
12
|
+
|
|
13
|
+
if [ "$1" == "-f" ]; then
|
|
14
|
+
dotnet clean
|
|
15
|
+
fi
|
|
16
|
+
|
|
17
|
+
dotnet restore
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: licensed
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.10.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- GitHub
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-05-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: licensee
|
|
@@ -16,7 +16,7 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 9.
|
|
19
|
+
version: 9.14.0
|
|
20
20
|
- - "<"
|
|
21
21
|
- !ruby/object:Gem::Version
|
|
22
22
|
version: 10.0.0
|
|
@@ -26,7 +26,7 @@ dependencies:
|
|
|
26
26
|
requirements:
|
|
27
27
|
- - ">="
|
|
28
28
|
- !ruby/object:Gem::Version
|
|
29
|
-
version: 9.
|
|
29
|
+
version: 9.14.0
|
|
30
30
|
- - "<"
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
32
|
version: 10.0.0
|
|
@@ -114,6 +114,20 @@ dependencies:
|
|
|
114
114
|
- - ">="
|
|
115
115
|
- !ruby/object:Gem::Version
|
|
116
116
|
version: 0.18.0
|
|
117
|
+
- !ruby/object:Gem::Dependency
|
|
118
|
+
name: reverse_markdown
|
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
|
120
|
+
requirements:
|
|
121
|
+
- - "~>"
|
|
122
|
+
- !ruby/object:Gem::Version
|
|
123
|
+
version: '1.0'
|
|
124
|
+
type: :runtime
|
|
125
|
+
prerelease: false
|
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - "~>"
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '1.0'
|
|
117
131
|
- !ruby/object:Gem::Dependency
|
|
118
132
|
name: rake
|
|
119
133
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -257,6 +271,7 @@ files:
|
|
|
257
271
|
- docs/sources/manifests.md
|
|
258
272
|
- docs/sources/mix.md
|
|
259
273
|
- docs/sources/npm.md
|
|
274
|
+
- docs/sources/nuget.md
|
|
260
275
|
- docs/sources/pip.md
|
|
261
276
|
- docs/sources/pipenv.md
|
|
262
277
|
- docs/sources/stack.md
|
|
@@ -297,6 +312,7 @@ files:
|
|
|
297
312
|
- lib/licensed/sources/manifest.rb
|
|
298
313
|
- lib/licensed/sources/mix.rb
|
|
299
314
|
- lib/licensed/sources/npm.rb
|
|
315
|
+
- lib/licensed/sources/nuget.rb
|
|
300
316
|
- lib/licensed/sources/pip.rb
|
|
301
317
|
- lib/licensed/sources/pipenv.rb
|
|
302
318
|
- lib/licensed/sources/source.rb
|
|
@@ -320,6 +336,7 @@ files:
|
|
|
320
336
|
- script/source-setup/go
|
|
321
337
|
- script/source-setup/mix
|
|
322
338
|
- script/source-setup/npm
|
|
339
|
+
- script/source-setup/nuget
|
|
323
340
|
- script/source-setup/pip
|
|
324
341
|
- script/source-setup/pipenv
|
|
325
342
|
- script/source-setup/yarn
|
|
@@ -343,8 +360,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
343
360
|
- !ruby/object:Gem::Version
|
|
344
361
|
version: '0'
|
|
345
362
|
requirements: []
|
|
346
|
-
|
|
347
|
-
rubygems_version: 2.6.8
|
|
363
|
+
rubygems_version: 3.0.3
|
|
348
364
|
signing_key:
|
|
349
365
|
specification_version: 4
|
|
350
366
|
summary: Extract and validate the licenses of dependencies.
|