Compare commits

...

16 Commits

Author SHA1 Message Date
Juan Pedro Villa Isaza
ceffd422d9 Add CNAME 2020-02-16 18:04:09 -05:00
Juan Pedro Villa Isaza
00f903d7ac Bump version to 0.4.0 (Cabal file) 2020-02-16 17:58:17 -05:00
Juan Pedro Villa Isaza
9a122b2961 Bump version to 0.4.0 2020-02-16 17:55:33 -05:00
Juan Pedro Villa Isaza
3f72d89232 Switch to named field puns and pure 2020-02-16 17:55:08 -05:00
Juan Pedro Villa Isaza
4473ab4341 Move executable to app (2) 2020-02-16 17:34:23 -05:00
Juan Pedro Villa Isaza
9a17f87eee Move executable to app 2020-02-16 17:33:23 -05:00
Juan Pedro Villa Isaza
15af251f38 Add generated Cabal file 2020-02-16 11:32:32 -05:00
Juan Pedro Villa Isaza
055192d887 Remove CircleCI configuration 2020-02-16 11:32:22 -05:00
Juan Pedro Villa Isaza
72cb001e07 Add Jekyll configuration 2020-02-16 11:29:40 -05:00
Juan Pedro Villa Isaza
6b0eea666e
Configure GitHub Actions (#24) 2020-02-16 11:18:11 -05:00
Juan Pedro Villa Isaza
fc1fd98e8a Update CircleCI configuration 2020-02-15 08:16:14 -05:00
Juan Pedro Villa Isaza
ba5a60ea7e Add stack.yaml.lock 2020-02-15 08:16:01 -05:00
Juan Pedro Villa Isaza
265fa6e773 Apply HLint suggestions 2020-02-15 08:12:21 -05:00
Juan Pedro Villa Isaza
2f3f9a72ec Remove http-conduit 2020-02-15 08:07:20 -05:00
Juan Pedro Villa Isaza
73ffa34491 Use hpack in cache key 2019-02-06 06:30:48 -05:00
Juan Pedro Villa Isaza
5a7e9a4ecf Use hpack (close #20) 2019-02-05 18:08:01 -05:00
14 changed files with 207 additions and 187 deletions

View File

@ -1,22 +0,0 @@
version: 2
jobs:
build:
docker:
- image: fpco/stack-build:lts-11.11
steps:
- checkout
- restore_cache:
keys:
- v1-.stack-{{ checksum "stack.yaml" }}-{{ checksum "licensor.cabal" }}
- v1-.stack-{{ checksum "stack.yaml" }}
- v1-.stack-
- run:
name: Build dependencies
command: stack build --only-dependencies
- save_cache:
key: v1-.stack-{{ checksum "stack.yaml" }}-{{ checksum "licensor.cabal" }}
paths:
- ~/.stack/
- run:
name: Build package
command: stack build

20
.github/workflows/main.yml vendored Normal file
View File

@ -0,0 +1,20 @@
name: Main
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Cache dependencies
uses: actions/cache@v1
with:
path: ~/.stack
key: stack-${{ hashFiles('stack.yaml.lock') }}
- name: Install GHC
run: stack setup
- name: Build dependencies
run: stack build --only-dependencies
- name: Build package
run: stack build

6
.gitignore vendored
View File

@ -1,4 +1,4 @@
.cabal-sandbox/
Gemfile.lock
_site/
.stack-work/
cabal.sandbox.config
dist/

View File

@ -1,3 +1,9 @@
# 0.4.0 (2020-02-16)
## Enhancements
- Use hpack
# 0.3.0 (2019-02-05)
## Enhancements

1
CNAME Normal file
View File

@ -0,0 +1 @@
licensor.jpvillaisaza.co

3
Gemfile Normal file
View File

@ -0,0 +1,3 @@
source "https://rubygems.org/"
gem "github-pages"

View File

@ -1,10 +1,5 @@
# The not so great automatic Haskell licensor
[![][1]][0]
[0]: https://circleci.com/gh/jpvillaisaza/licensor
[1]: https://circleci.com/gh/jpvillaisaza/licensor.svg?style=shield
[![][2]](https://www.stackage.org/lts/package/licensor)
[![][3]](https://www.stackage.org/nightly/package/licensor)
@ -84,7 +79,7 @@ $ cd licensor/ && stack build --exec licensor
For more information, run `licensor --help`:
```
licensor 0.2.0
licensor 0.4.0
licensor [OPTIONS]
@ -92,6 +87,8 @@ Common flags:
-? --help Display help message
-V --version Print version information
--numeric-version Print just the version number
-v --verbose Loud verbosity
-q --quiet Quiet verbosity
```
## Notes
@ -143,30 +140,24 @@ See [LICENSE.md](LICENSE.md).
### License report
Licensor (0.2.2) depends on the following libraries:
Licensor (0.4.0) depends on the following libraries:
Library | License
------------------------- | -------------------------
base | BSD3
bytestring | BSD3
Cabal | BSD3
cmdargs | BSD3
containers | BSD3
directory | BSD3
http-conduit | BSD3
process | BSD3
And the following licenses (including transitive dependencies):
License | Number of libraries
------------------------- | -------------------------
BSD2 | 1
BSD3 | 70
ISC | 1
MIT | 11
UnspecifiedLicense | 1
BSD3 | 20
(Tested with Licensor 0.2.2, Stack 1.6.3, and Stackage Nightly 2018-01-16.)
(Tested with Licensor 0.4.0, Stack 2.1.3, and LTS Haskell 11.11.)
## Additional resources

View File

@ -1,11 +0,0 @@
module Main
( main
)
where
import Distribution.Simple (defaultMain)
main :: IO ()
main =
defaultMain

18
_config.yml Normal file
View File

@ -0,0 +1,18 @@
exclude:
- app/
- CHANGELOG.md
- Gemfile
- Gemfile.lock
- LICENSE.md
- licensor.cabal
- package.yaml
- src/
- package.yaml
- stack.yaml
- stack.yaml.lock
plugins:
- jekyll-readme-index
readme_index:
remove_originals: true

View File

@ -1,5 +1,5 @@
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NamedFieldPuns #-}
----------------------------------------------------------------------
-- |
@ -86,11 +86,11 @@ main = do
if stack
then do
putStrLn "Found stack.yaml..."
return Nothing
pure Nothing
else
Exit.die "Error: No Cabal file found."
Just PackageDescription{..} -> do
Just PackageDescription { license, package } -> do
putStrLn $
"Package: "
<> display package
@ -98,18 +98,15 @@ main = do
<> "License: "
<> display license
<> ")"
return (Just package)
pure (Just package)
maybeDependencies <- getDependencies
maybeLicenses <- getLicenses
case maybeDependencies of
Nothing ->
Exit.die "Error: ..."
Just dependencies -> do
case (maybeDependencies, maybeLicenses) of
(Just dependencies, Just licenses) -> do
(dependenciesByLicense', failed) <-
orderPackagesByLicense quiet pid maybeLicenses dependencies
orderPackagesByLicense quiet pid licenses dependencies
let dependenciesByLicense = fmap (Set.map display) dependenciesByLicense'
@ -130,3 +127,5 @@ main = do
unless (null failed) $ do
putStr "Failed: "
print failed
_ ->
Exit.die "Error: ..."

View File

@ -1,68 +1,61 @@
name: licensor
version: 0.3.0
cabal-version: 1.12
build-type: Simple
cabal-version: >= 1.10
license: MIT
license-file: LICENSE.md
copyright: 2016 Juan Pedro Villa Isaza
author: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
maintainer: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
stability: Experimental
homepage: https://github.com/jpvillaisaza/licensor
bug-reports: https://github.com/jpvillaisaza/licensor/issues
synopsis: A license compatibility helper
description: A license compatibility helper.
category: Distribution
tested-with: GHC == 7.10.3, GHC == 8.0.1, GHC == 8.0.2, GHC == 8.2.1, GHC == 8.2.2
extra-source-files: CHANGELOG.md, README.md
library
hs-source-dirs:
src
exposed-modules:
Licensor
other-modules:
Paths_licensor
build-depends:
base >= 4.8 && < 4.11
, bytestring
, Cabal >= 1.22 && < 2.1
, containers
, directory
, http-conduit >= 2.1 && < 2.4
, process
default-language:
Haskell2010
ghc-options:
-Wall
executable licensor
main-is:
Main.hs
build-depends:
base
, Cabal
, cmdargs >= 0.10 && < 0.11
, containers
, directory
, licensor
default-language:
Haskell2010
ghc-options:
-Wall -threaded -rtsopts -with-rtsopts=-N
-- This file has been generated from package.yaml by hpack version 0.31.2.
--
-- see: https://github.com/sol/hpack
--
-- hash: b5e0234d196e96476a6a70c11798ae1dd4fd24ca9ce1c11ea74d6b3422604fc8
name: licensor
version: 0.4.0
synopsis: A license compatibility helper
description: A license compatibility helper.
category: Distribution
stability: Experimental
homepage: https://jpvillaisaza.co/licensor
bug-reports: https://github.com/jpvillaisaza/licensor/issues
author: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
maintainer: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
copyright: 2016 Juan Pedro Villa Isaza
license: MIT
license-file: LICENSE.md
build-type: Simple
extra-source-files:
CHANGELOG.md
README.md
source-repository head
type: git
location: https://github.com/jpvillaisaza/licensor
library
exposed-modules:
Licensor
other-modules:
Paths_licensor
hs-source-dirs:
src
ghc-options: -Wall
build-depends:
Cabal >=1.22 && <2.1
, base >=4.8 && <4.11
, containers
, directory
, process
default-language: Haskell2010
executable licensor
main-is: Main.hs
other-modules:
Paths_licensor
hs-source-dirs:
app
ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
build-depends:
Cabal >=1.22 && <2.1
, base >=4.8 && <4.11
, cmdargs >=0.10 && <0.11
, containers
, directory
, licensor
default-language: Haskell2010

49
package.yaml Normal file
View File

@ -0,0 +1,49 @@
name: licensor
version: 0.4.0
synopsis: A license compatibility helper
description: A license compatibility helper.
category: Distribution
stability: Experimental
github: jpvillaisaza/licensor
homepage: https://jpvillaisaza.co/licensor
author: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
maintainer: Juan Pedro Villa Isaza <jpvillaisaza@gmail.com>
copyright: 2016 Juan Pedro Villa Isaza
license-file: LICENSE.md
extra-source-files:
- CHANGELOG.md
- README.md
dependencies:
- Cabal >= 1.22 && < 2.1
- base >= 4.8 && < 4.11
- containers
- directory
ghc-options:
- -Wall
library:
source-dirs:
src
dependencies:
- process
executable:
source-dirs:
app
main:
Main.hs
dependencies:
- cmdargs >= 0.10 && < 0.11
- licensor
ghc-options:
- -threaded
- -rtsopts
- -with-rtsopts=-N

View File

@ -1,6 +1,4 @@
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
----------------------------------------------------------------------
@ -26,21 +24,16 @@ module Licensor
-- base
import qualified Control.Exception as Exception
import Control.Monad (unless)
import Data.Monoid ((<>))
import Data.Version (Version)
import System.IO
-- bytestring
import qualified Data.ByteString.Lazy as ByteString
-- Cabal
import Distribution.License
import Distribution.Package
import Distribution.PackageDescription
import Distribution.PackageDescription.Parse
import Distribution.Simple.Utils
import Distribution.Text
import Distribution.Verbosity
import Distribution.License (License)
import Distribution.Package (PackageIdentifier(..), PackageName)
import Distribution.PackageDescription (PackageDescription, packageDescription)
import Distribution.PackageDescription.Parse (readGenericPackageDescription)
import Distribution.Simple.Utils (comparing, findPackageDesc)
import Distribution.Text (Text, display, simpleParse)
import Distribution.Verbosity (silent)
-- containers
import Data.Map.Strict (Map)
@ -49,16 +42,13 @@ import Data.Set (Set)
import qualified Data.Set as Set
-- directory
import System.Directory
-- http-conduit
import Network.HTTP.Simple (HttpException, getResponseBody, httpLBS, parseRequest)
import System.Directory (getCurrentDirectory)
-- licensor
import qualified Paths_licensor
-- process
import System.Process
import System.Process (readProcess)
-- |
@ -98,7 +88,7 @@ getPackage :: IO (Maybe PackageDescription)
getPackage = do
currentDirectory <- getCurrentDirectory
fmap getPackageDescription <$> findPackageDesc currentDirectory
>>= either (const (return Nothing)) (fmap Just)
>>= either (const (pure Nothing)) (fmap Just)
-- |
@ -107,7 +97,7 @@ getPackage = do
getPackageDescription :: FilePath -> IO PackageDescription
getPackageDescription =
fmap packageDescription . readPackageDescription silent
fmap packageDescription . readGenericPackageDescription silent
-- |
@ -121,10 +111,10 @@ getDependencies = do
case eitherDeps of
Left (_ :: IOError) ->
return Nothing
pure Nothing
Right deps ->
return $ fmap Set.fromList $ sequence $ fmap simpleParse (lines deps)
pure $ Set.fromList <$> traverse simpleParse (lines deps)
getLicenses :: IO (Maybe [(PackageName, License)])
@ -134,10 +124,10 @@ getLicenses = do
case eitherDeps of
Left (_ :: IOError) ->
return Nothing
pure Nothing
Right deps ->
return $ sequence $ fmap toNameLicense (lines deps)
pure $ traverse toNameLicense (lines deps)
where
toNameLicense dep =
case words dep of
@ -155,45 +145,16 @@ getLicenses = do
getPackageLicense
:: Bool
-> PackageIdentifier
-> Maybe [(PackageName, License)]
-> [(PackageName, License)]
-> IO (Maybe LiLicense)
getPackageLicense quiet p@PackageIdentifier{..} (Just licenses) = do
unless quiet (putStr $ display p ++ "...")
case lookup pkgName licenses of
getPackageLicense quiet packageIdentifier licenses = do
unless quiet (putStr $ display packageIdentifier ++ "...")
case lookup (pkgName packageIdentifier) licenses of
Just license -> do
unless quiet (putStrLn $ display license)
return $ Just (LiLicense license)
pure $ Just (LiLicense license)
Nothing ->
return Nothing
getPackageLicense quiet p@PackageIdentifier{..} Nothing = do
unless quiet (putStr $ display p ++ "...")
let
url =
"GET https://hackage.haskell.org/package/"
<> display p
<> "/"
<> unPackageName pkgName
<> ".cabal"
req <- parseRequest url
eitherPd <- Exception.try $ fmap getResponseBody (httpLBS req)
case eitherPd of
Left (_ :: HttpException) ->
return Nothing
Right pd -> do
(file, handle) <- openTempFile "/tmp" "licensor"
hClose handle
ByteString.writeFile file pd
PackageDescription{license} <- getPackageDescription file
hClose handle
removeFile file
unless quiet (putStrLn $ display license)
return $ Just (LiLicense license)
pure Nothing
-- |
@ -203,19 +164,19 @@ getPackageLicense quiet p@PackageIdentifier{..} Nothing = do
orderPackagesByLicense
:: Bool
-> Maybe PackageIdentifier
-> Maybe [(PackageName, License)]
-> [(PackageName, License)]
-> Set PackageIdentifier
-> IO (Map LiLicense (Set PackageIdentifier), Set PackageIdentifier)
orderPackagesByLicense quiet maybeP maybeLicenses =
orderPackagesByLicense quiet maybeP licenses =
let
cond =
maybe (const False) (==) maybeP
insertPackage package orderedPackages' = do
maybeLicense <- getPackageLicense quiet package maybeLicenses
maybeLicense <- getPackageLicense quiet package licenses
(orderedPackages, failed) <- orderedPackages'
return $
pure $
if cond package
then
(orderedPackages, failed)

12
stack.yaml.lock Normal file
View File

@ -0,0 +1,12 @@
# This file was autogenerated by Stack.
# You should not edit this file by hand.
# For more information, please see the documentation at:
# https://docs.haskellstack.org/en/stable/lock_files
packages: []
snapshots:
- completed:
size: 507599
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/11/11.yaml
sha256: 5ec0a1ff4dadde524eb529784556bcc32014422fd1e1ed91231c59f001e92ca9
original: lts-11.11