Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
H
haskell-gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Przemyslaw Kaminski
haskell-gargantext
Commits
2c0adcb4
Unverified
Commit
2c0adcb4
authored
May 04, 2018
by
Nicolas Pouillard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Integrate the orchestrator with a route to query scrapyd
parent
d6d1cb30
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
346 additions
and
73 deletions
+346
-73
README.md
README.md
+4
-0
package.yaml
package.yaml
+3
-0
API.hs
src/Gargantext/API.hs
+35
-50
Orchestrator.hs
src/Gargantext/API/Orchestrator.hs
+75
-0
Schedule.hs
src/Gargantext/API/Orchestrator/Scrapy/Schedule.hs
+54
-0
Types.hs
src/Gargantext/API/Orchestrator/Types.hs
+113
-0
Settings.hs
src/Gargantext/API/Settings.hs
+51
-13
Ngrams.hs
src/Gargantext/Ngrams.hs
+2
-1
Prelude.hs
src/Gargantext/Prelude.hs
+3
-3
Node.hs
src/Gargantext/Types/Node.hs
+0
-2
stack.yaml
stack.yaml
+6
-4
No files found.
README.md
View file @
2c0adcb4
...
...
@@ -44,6 +44,10 @@ sudo apt-get install libbz2-dev lipq-dev
-
https://docs.haskellstack.org/en/stable/README/
-
curl -sSL https://get.haskellstack.org/ | sh
### Get the orchestrator library
git clone https://github.com/np/servant-job.git
## Building and installing
stack install
...
...
package.yaml
View file @
2c0adcb4
...
...
@@ -78,6 +78,8 @@ library:
-
fclabels
-
fast-logger
# - haskell-gi-base
-
http-client
-
http-client-tls
-
http-conduit
-
http-api-data
-
http-types
...
...
@@ -107,6 +109,7 @@ library:
-
servant
-
servant-auth
-
servant-client
-
servant-job
-
servant-mock
-
servant-multipart
-
servant-server
...
...
src/Gargantext/API.hs
View file @
2c0adcb4
...
...
@@ -38,25 +38,25 @@ module Gargantext.API
---------------------------------------------------------------------
import
Gargantext.Prelude
import
System.IO
(
FilePath
,
print
)
import
System.IO
(
FilePath
)
import
GHC.Generics
(
D1
,
Meta
(
..
),
Rep
,
Generic
)
import
GHC.Generics
(
D1
,
Meta
(
..
),
Rep
)
import
GHC.TypeLits
(
AppendSymbol
,
Symbol
)
import
Control.Lens
import
Data.Aeson.Encode.Pretty
(
encodePretty
)
import
qualified
Data.ByteString.Lazy.Char8
as
BL8
import
Data.Swagger
import
Data.Text
(
Text
,
pack
)
import
Data.Text
(
Text
)
import
qualified
Data.Text.IO
as
T
--import qualified Data.Set as Set
import
Database.PostgreSQL.Simple
(
Connection
,
connect
)
import
Network.Wai
import
Network.Wai.Handler.Warp
import
Network.Wai.Handler.Warp
hiding
(
defaultSettings
)
import
Servant
import
Servant.Mock
(
mock
)
import
Servant.Job.Server
(
WithCallbacks
)
import
Servant.Swagger
import
Servant.Swagger.UI
-- import Servant.API.Stream
...
...
@@ -69,7 +69,8 @@ import Gargantext.API.Node ( Roots , roots
,
NodesAPI
,
nodesAPI
)
import
Gargantext.API.Count
(
CountAPI
,
count
,
Query
)
import
Gargantext.Database.Utils
(
databaseParameters
)
import
Gargantext.API.Orchestrator
import
Gargantext.API.Orchestrator.Types
---------------------------------------------------------------------
...
...
@@ -90,20 +91,7 @@ import Network.Wai.Middleware.RequestLogger
import
Network.HTTP.Types
hiding
(
Query
)
-- import Gargantext.API.Settings
data
FireWall
=
FireWall
{
unFireWall
::
Bool
}
data
GEnv
conn
=
Env
{
_env_conn
::
!
conn
,
_env_firewall
::
!
FireWall
}
deriving
(
Generic
)
makeLenses
''
G
Env
type
ProdEnv
=
GEnv
Connection
type
MockEnv
=
GEnv
()
import
Gargantext.API.Settings
fireWall
::
Applicative
f
=>
Request
->
FireWall
->
f
Bool
fireWall
req
fw
=
do
...
...
@@ -121,15 +109,15 @@ fireWall req fw = do
else
pure
False
-- makeApp :: Env -> IO (Warp.Settings, Application)
makeApp
::
MockEnv
->
IO
Application
makeApp
env
=
do
-- make
Mock
App :: Env -> IO (Warp.Settings, Application)
make
Mock
App
::
MockEnv
->
IO
Application
make
Mock
App
env
=
do
let
serverApp
=
appMock
-- logWare <- mkRequestLogger def { destination = RequestLogger.Logger $ env^.logger }
--logWare <- mkRequestLogger def { destination = RequestLogger.Logger "/tmp/logs.txt" }
let
checkOriginAndHost
app
req
resp
=
do
blocking
<-
fireWall
req
(
env
^.
env_firewall
)
blocking
<-
fireWall
req
(
env
^.
m
env_firewall
)
case
blocking
of
True
->
app
req
resp
False
->
resp
(
responseLBS
status401
[]
...
...
@@ -155,8 +143,6 @@ makeApp env = do
pure
$
logStdoutDev
$
checkOriginAndHost
$
corsMiddleware
$
serverApp
---------------------------------------------------------------------
type
PortNumber
=
Int
---------------------------------------------------------------------
-- | API Global
...
...
@@ -180,6 +166,8 @@ type GargAPI = "user" :> Summary "First user endpoint"
:<|>
"count"
:>
Summary
"Count endpoint"
:>
ReqBody
'[
J
SON
]
Query
:>
CountAPI
:<|>
"scraper"
:>
WithCallbacks
ScraperAPI
-- /mv/<id>/<id>
-- /merge/<id>/<id>
-- /rename/<id>
...
...
@@ -194,14 +182,16 @@ type API = SwaggerFrontAPI :<|> GargAPI
---------------------------------------------------------------------
-- | Server declaration
server
::
ProdEnv
->
Server
API
server
env
=
swaggerFront
:<|>
roots
conn
:<|>
nodeAPI
conn
:<|>
nodeAPI
conn
:<|>
nodesAPI
conn
:<|>
count
server
::
Env
->
IO
(
Server
API
)
server
env
=
do
orchestrator
<-
scrapyOrchestrator
env
pure
$
swaggerFront
:<|>
roots
conn
:<|>
nodeAPI
conn
:<|>
nodeAPI
conn
:<|>
nodesAPI
conn
:<|>
count
:<|>
orchestrator
where
conn
=
env
^.
env_conn
...
...
@@ -214,9 +204,8 @@ gargMock :: Server GargAPI
gargMock
=
mock
apiGarg
Proxy
---------------------------------------------------------------------
app
::
ProdEnv
->
Application
app
=
serve
api
.
server
-- TODO firewall
makeApp
::
Env
->
IO
Application
makeApp
=
fmap
(
serve
api
)
.
server
appMock
::
Application
appMock
=
serve
api
(
swaggerFront
:<|>
gargMock
)
...
...
@@ -234,7 +223,7 @@ schemaUiServer :: (Server api ~ Handler Swagger)
schemaUiServer
=
swaggerSchemaUIServer
-- Type Famil
i
y for the Documentation
-- Type Family for the Documentation
type
family
TypeName
(
x
::
*
)
::
Symbol
where
TypeName
Int
=
"Int"
TypeName
Text
=
"Text"
...
...
@@ -266,27 +255,23 @@ swaggerWriteJSON = BL8.writeFile "swagger.json" (encodePretty swaggerDoc)
portRouteInfo
::
PortNumber
->
IO
()
portRouteInfo
port
=
do
print
(
pack
" ----Main Routes----- "
)
print
(
"http://localhost:"
<>
show
port
<>
"/index.html"
)
print
(
"http://localhost:"
<>
show
port
<>
"/swagger-ui"
)
T
.
putStrLn
" ----Main Routes----- "
T
.
putStrLn
$
"http://localhost:"
<>
toUrlPiece
port
<>
"/index.html"
T
.
putStrLn
$
"http://localhost:"
<>
toUrlPiece
port
<>
"/swagger-ui"
-- | startGargantext takes as parameters port number and Ini file.
startGargantext
::
PortNumber
->
FilePath
->
IO
()
startGargantext
port
file
=
do
param
<-
databaseParameters
file
conn
<-
connect
param
let
env
=
Env
conn
(
FireWall
False
)
env
<-
newEnv
port
file
portRouteInfo
port
run
port
(
app
env
)
app
<-
makeApp
env
run
port
app
startGargantextMock
::
PortNumber
->
IO
()
startGargantextMock
port
=
do
portRouteInfo
port
let
env
=
Env
()
(
FireWall
False
)
application
<-
make
App
env
application
<-
make
MockApp
.
MockEnv
$
FireWall
False
run
port
application
src/Gargantext/API/Orchestrator.hs
0 → 100644
View file @
2c0adcb4
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
module
Gargantext.API.Orchestrator
where
import
Gargantext.Prelude
import
Gargantext.API.Settings
import
Gargantext.API.Orchestrator.Types
import
Gargantext.API.Orchestrator.Scrapy.Schedule
import
Control.Lens
hiding
(
elements
)
import
Data.Aeson
import
qualified
Data.ByteString.Lazy.Char8
as
LBS
import
Servant
import
Servant.Job.Async
import
Servant.Job.Client
import
Servant.Job.Server
import
Servant.Job.Utils
(
extendBaseUrl
)
callJobScrapy
::
(
ToJSON
e
,
FromJSON
e
,
FromJSON
o
,
MonadClientJob
m
)
=>
JobServerURL
e
Schedule
o
->
(
URL
->
Schedule
)
->
m
o
callJobScrapy
jurl
schedule
=
do
progress
$
NewTask
jurl
out
<-
view
job_output
<$>
retryOnTransientFailure
(
clientCallbackJob'
jurl
(
fmap
(
const
()
)
.
scrapySchedule
.
schedule
))
progress
$
Finished
jurl
Nothing
pure
out
logConsole
::
ToJSON
a
=>
a
->
IO
()
logConsole
=
LBS
.
putStrLn
.
encode
callScraper
::
MonadClientJob
m
=>
URL
->
ScraperInput
->
m
ScraperStatus
callScraper
url
input
=
callJobScrapy
jurl
$
\
cb
->
Schedule
{
s_project
=
"gargantext"
,
s_spider
=
input
^.
scin_spider
,
s_setting
=
[]
,
s_jobid
=
Nothing
,
s_version
=
Nothing
,
s_extra
=
[(
"query"
,
input
^..
scin_query
.
_Just
)
,(
"user"
,
[
input
^.
scin_user
])
,(
"corpus"
,
[
input
^.
scin_corpus
.
to
toUrlPiece
])
,(
"report_every"
,
input
^..
scin_report_every
.
_Just
.
to
toUrlPiece
)
,(
"limit"
,
input
^..
scin_limit
.
_Just
.
to
toUrlPiece
)
,(
"url"
,
input
^..
scin_local_file
.
_Just
)
,(
"count_only"
,
input
^..
scin_count_only
.
_Just
.
to
toUrlPiece
)
,(
"callback"
,
[
toUrlPiece
cb
])]
}
where
jurl
::
JobServerURL
ScraperStatus
Schedule
ScraperStatus
jurl
=
JobServerURL
url
Callback
pipeline
::
FromJSON
e
=>
URL
->
ClientEnv
->
ScraperInput
->
(
e
->
IO
()
)
->
IO
ScraperStatus
pipeline
scrapyurl
client_env
input
log_status
=
do
e
<-
runJobMLog
client_env
log_status
$
callScraper
scrapyurl
input
either
(
panic
.
cs
.
show
)
pure
e
scrapyOrchestrator
::
Env
->
IO
(
Server
(
WithCallbacks
ScraperAPI
))
scrapyOrchestrator
env
=
do
apiWithCallbacksServer
(
Proxy
::
Proxy
ScraperAPI
)
defaultSettings
(
extendBaseUrl
(
"scraper"
::
String
)
$
env
^.
env_self_url
)
(
env
^.
env_manager
)
(
LogEvent
logConsole
)
$
serveJobsAPI
(
env
^.
env_scrapers
)
.
JobFunction
.
pipeline
(
URL
$
env
^.
env_settings
.
scrapydUrl
)
src/Gargantext/API/Orchestrator/Scrapy/Schedule.hs
0 → 100644
View file @
2c0adcb4
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
module
Gargantext.API.Orchestrator.Scrapy.Schedule
where
import
Control.Lens
import
Data.Aeson
import
qualified
Data.HashMap.Strict
as
H
import
Data.Text
(
Text
)
import
GHC.Generics
import
Servant
import
Servant.Job.Utils
(
jsonOptions
)
import
Servant.Client
import
Web.FormUrlEncoded
hiding
(
parseMaybe
)
data
Schedule
=
Schedule
{
s_project
::
!
Text
,
s_spider
::
!
Text
,
s_setting
::
!
[
Text
]
,
s_jobid
::
!
(
Maybe
Text
)
,
s_version
::
!
(
Maybe
Text
)
,
s_extra
::
!
[(
Text
,[
Text
])]
}
deriving
(
Generic
)
data
ScheduleResponse
=
ScheduleResponse
{
r_status
::
!
Text
,
r_jobid
::
!
Text
}
deriving
(
Generic
)
instance
FromJSON
ScheduleResponse
where
parseJSON
=
genericParseJSON
(
jsonOptions
"r_"
)
instance
ToForm
Schedule
where
toForm
s
=
Form
.
H
.
fromList
$
[(
"project"
,
[
s_project
s
])
,(
"spider"
,
[
s_spider
s
])
,(
"setting"
,
s_setting
s
)
,(
"jobid"
,
s_jobid
s
^..
_Just
)
,(
"_version"
,
s_version
s
^..
_Just
)
]
++
s_extra
s
type
Scrapy
=
"schedule.json"
:>
ReqBody
'[
F
ormUrlEncoded
]
Schedule
:>
Post
'[
J
SON
]
ScheduleResponse
scrapyAPI
::
Proxy
Scrapy
scrapyAPI
=
Proxy
scrapySchedule
::
Schedule
->
ClientM
ScheduleResponse
scrapySchedule
=
client
scrapyAPI
src/Gargantext/API/Orchestrator/Types.hs
0 → 100644
View file @
2c0adcb4
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
module
Gargantext.API.Orchestrator.Types
where
import
Gargantext.Prelude
import
Control.Lens
hiding
(
elements
)
import
Data.Aeson
import
Data.Text
(
Text
)
import
Data.Swagger
hiding
(
URL
,
url
,
port
)
import
GHC.Generics
hiding
(
to
)
import
Servant.Job.Async
import
Servant.Job.Client
import
Servant.Job.Types
import
Servant.Job.Utils
(
jsonOptions
)
import
Test.QuickCheck
(
elements
)
import
Test.QuickCheck.Arbitrary
instance
Arbitrary
a
=>
Arbitrary
(
JobStatus
'S
a
fe
a
)
where
arbitrary
=
panic
"TODO"
instance
Arbitrary
a
=>
Arbitrary
(
JobOutput
a
)
where
arbitrary
=
JobOutput
<$>
arbitrary
instance
ToSchema
URL
where
declareNamedSchema
=
panic
"TODO"
instance
ToSchema
AnyOutput
where
declareNamedSchema
=
panic
"TODO"
instance
ToSchema
AnyInput
where
declareNamedSchema
=
panic
"TODO"
instance
ToSchema
AnyEvent
where
declareNamedSchema
=
panic
"TODO"
instance
ToSchema
a
=>
ToSchema
(
JobInput
a
)
instance
ToSchema
a
=>
ToSchema
(
JobOutput
a
)
data
ScraperInput
=
ScraperInput
{
_scin_spider
::
!
Text
,
_scin_query
::
!
(
Maybe
Text
)
,
_scin_user
::
!
Text
,
_scin_corpus
::
!
Int
,
_scin_report_every
::
!
(
Maybe
Int
)
,
_scin_limit
::
!
(
Maybe
Int
)
,
_scin_local_file
::
!
(
Maybe
Text
)
,
_scin_count_only
::
!
(
Maybe
Bool
)
}
deriving
Generic
makeLenses
''
S
craperInput
instance
FromJSON
ScraperInput
where
parseJSON
=
genericParseJSON
$
jsonOptions
"_scin_"
data
ScraperEvent
=
ScraperEvent
{
_scev_message
::
!
(
Maybe
Text
)
,
_scev_level
::
!
(
Maybe
Text
)
,
_scev_date
::
!
(
Maybe
Text
)
}
deriving
Generic
instance
Arbitrary
ScraperEvent
where
arbitrary
=
ScraperEvent
<$>
elements
[
Nothing
,
Just
"test message"
]
<*>
elements
[
Nothing
,
Just
"INFO"
,
Just
"WARN"
]
<*>
elements
[
Nothing
,
Just
"2018-04-18"
]
instance
ToJSON
ScraperEvent
where
toJSON
=
genericToJSON
$
jsonOptions
"_scev_"
instance
FromJSON
ScraperEvent
where
parseJSON
=
genericParseJSON
$
jsonOptions
"_scev_"
data
ScraperStatus
=
ScraperStatus
{
_scst_succeeded
::
!
(
Maybe
Int
)
,
_scst_failed
::
!
(
Maybe
Int
)
,
_scst_remaining
::
!
(
Maybe
Int
)
,
_scst_events
::
!
(
Maybe
[
ScraperEvent
])
}
deriving
Generic
instance
Arbitrary
ScraperStatus
where
arbitrary
=
ScraperStatus
<$>
arbitrary
<*>
arbitrary
<*>
arbitrary
<*>
arbitrary
instance
ToJSON
ScraperStatus
where
toJSON
=
genericToJSON
$
jsonOptions
"_scst_"
instance
FromJSON
ScraperStatus
where
parseJSON
=
genericParseJSON
$
jsonOptions
"_scst_"
instance
ToSchema
ScraperStatus
-- TODO _scst_ prefix
instance
ToSchema
ScraperInput
-- TODO _scin_ prefix
instance
ToSchema
ScraperEvent
-- TODO _scev_ prefix
instance
ToParamSchema
Offset
where
toParamSchema
=
panic
"TODO"
instance
ToParamSchema
Limit
where
toParamSchema
=
panic
"TODO"
type
ScrapersEnv
=
JobEnv
ScraperStatus
ScraperStatus
type
ScraperAPI
=
AsyncJobsAPI
ScraperStatus
ScraperInput
ScraperStatus
src/Gargantext/API/Settings.hs
View file @
2c0adcb4
...
...
@@ -36,17 +36,20 @@ import GHC.Enum
import
GHC.Generics
(
Generic
)
import
Prelude
(
Bounded
())
import
System.Environment
(
lookupEnv
)
-- import Control.Applicative ((<*>))
import
System.IO
(
FilePath
)
import
Database.PostgreSQL.Simple
(
Connection
,
connect
)
import
Network.HTTP.Client
(
Manager
)
import
Network.HTTP.Client.TLS
(
newTlsManager
)
import
Data.Maybe
(
fromMaybe
)
import
Data.Either
(
either
)
-- import Data.Map
import
Data.Text
import
Data.Text.Encoding
(
encodeUtf8
)
import
Data.ByteString.Lazy.Internal
import
Servant
import
Servant.Client
(
BaseUrl
,
parseBaseUrl
)
import
Servant.Job.Async
(
newJobEnv
,
defaultSettings
)
import
Web.HttpApiData
(
parseUrlPiece
)
import
qualified
Jose.Jwk
as
Jose
import
qualified
Jose.Jwa
as
Jose
...
...
@@ -54,7 +57,10 @@ import qualified Jose.Jwa as Jose
import
Control.Monad.Logger
import
Control.Lens
import
Gargantext.Prelude
import
Gargantext.Database.Utils
(
databaseParameters
)
import
Gargantext.API.Orchestrator.Types
type
PortNumber
=
Int
data
SendEmailType
=
SendEmailViaAws
|
LogEmailToConsole
...
...
@@ -65,11 +71,13 @@ data SendEmailType = SendEmailViaAws
data
Settings
=
Settings
{
_allowedOrigin
::
ByteString
-- ^ allowed origin for CORS
,
_allowedHost
::
ByteString
-- ^ allowed host for CORS
,
_appPort
::
Int
,
_appPort
::
PortNumber
,
_logLevelLimit
::
LogLevel
-- ^ log level from the monad-logger package
,
_dbServer
::
Text
-- , _dbServer :: Text
-- ^ this is not used yet
,
_jwtSecret
::
Jose
.
Jwk
-- ^ key from the jose-jwt package
,
_sendLoginEmails
::
SendEmailType
,
_scrapydUrl
::
BaseUrl
}
makeLenses
''
S
ettings
...
...
@@ -90,12 +98,13 @@ devSettings = Settings
,
_allowedHost
=
"localhost:3000"
,
_appPort
=
3000
,
_logLevelLimit
=
LevelDebug
,
_dbServer
=
"localhost"
--
, _dbServer = "localhost"
-- generate with dd if=/dev/urandom bs=1 count=32 | base64
-- make sure jwtSecret differs between development and production, because you do not want
-- your production key inside source control.
,
_jwtSecret
=
parseJwk
"MVg0YAPVSPiYQc/qIs/rV/X32EFR0zOJWfHFgMbszMw="
,
_sendLoginEmails
=
LogEmailToConsole
,
_scrapydUrl
=
fromMaybe
(
panic
"Invalid scrapy URL"
)
$
parseBaseUrl
"http://localhost:6800"
}
...
...
@@ -122,14 +131,43 @@ optSetting name d = do
-- <*> (parseJwk <$> reqSetting "JWT_SECRET")
-- <*> optSetting "SEND_EMAIL" SendEmailViaAws
data
FireWall
=
FireWall
{
unFireWall
::
Bool
}
data
Env
=
Env
{
_settings
::
Settings
,
_logger
::
LoggerSet
-- , _dbConfig :: ConnectionPool -- from Database.Persist.Postgresql
}
{
_env_settings
::
!
Settings
,
_env_logger
::
!
LoggerSet
,
_env_conn
::
!
Connection
,
_env_manager
::
!
Manager
,
_env_self_url
::
!
BaseUrl
,
_env_scrapers
::
!
ScrapersEnv
}
deriving
(
Generic
)
makeLenses
''
E
nv
createEnv
::
Settings
->
IO
Env
createEnv
_
=
undefined
{- implementation here: connect to db, init logger, etc -}
data
MockEnv
=
MockEnv
{
_menv_firewall
::
!
FireWall
}
deriving
(
Generic
)
makeLenses
''
M
ockEnv
newEnv
::
PortNumber
->
FilePath
->
IO
Env
newEnv
port
file
=
do
manager
<-
newTlsManager
settings
<-
pure
(
devSettings
&
appPort
.~
port
)
-- TODO read from 'file'
when
(
port
/=
settings
^.
appPort
)
$
panic
"TODO: conflicting settings of port"
self_url
<-
parseBaseUrl
$
"http://0.0.0.0:"
<>
show
port
param
<-
databaseParameters
file
conn
<-
connect
param
scrapers_env
<-
newJobEnv
defaultSettings
manager
logger
<-
newStderrLoggerSet
defaultBufSize
pure
$
Env
{
_env_settings
=
settings
,
_env_logger
=
logger
,
_env_conn
=
conn
,
_env_manager
=
manager
,
_env_scrapers
=
scrapers_env
,
_env_self_url
=
self_url
}
src/Gargantext/Ngrams.hs
View file @
2c0adcb4
...
...
@@ -153,7 +153,8 @@ isStop c = c `elem` ['.','?','!']
-- | Tests
-- TODO http://hackage.haskell.org/package/tokenize-0.3.0/docs/NLP-Tokenize-Text.html
ngramsTest
=
ws
ngramsTest
::
(
IO
[
Text
],
IO
[
Text
],
IO
(
Map
Text
Occ
))
ngramsTest
=
(
ws
,
ls
,
ocs
)
where
txt
=
concat
<$>
lines
<$>
clean
<$>
readFile
"Giono-arbres.txt"
-- | Number of sentences
...
...
src/Gargantext/Prelude.hs
View file @
2c0adcb4
...
...
@@ -31,7 +31,7 @@ import Data.Maybe (isJust, fromJust, maybe)
import
Protolude
(
Bool
(
True
,
False
),
Int
,
Double
,
Integer
,
Fractional
,
Num
,
Maybe
(
Just
,
Nothing
)
,
Floating
,
Char
,
IO
,
pure
,
(
<$>
),
panic
,
pure
,
(
<
*>
),
(
<
$>
),
panic
,
head
,
flip
,
Ord
,
Integral
,
Foldable
,
RealFrac
,
Monad
,
filter
,
reverse
,
map
,
zip
,
drop
,
take
,
zipWith
...
...
@@ -42,9 +42,9 @@ import Protolude ( Bool(True, False), Int, Double, Integer
,
Eq
,
(
==
),
(
>=
),
(
<=
),
(
<>
),
(
/=
)
,
(
&&
),
(
||
),
not
,
fst
,
snd
,
toS
,
elem
,
die
,
mod
,
div
,
const
,
elem
,
die
,
mod
,
div
,
const
,
either
,
curry
,
uncurry
,
otherwise
,
otherwise
,
when
)
-- TODO import functions optimized in Utils.Count
...
...
src/Gargantext/Types/Node.hs
View file @
2c0adcb4
...
...
@@ -310,5 +310,3 @@ instance ToSchema (NodePoly NodeId NodeTypeId
)
instance
ToSchema
Status
stack.yaml
View file @
2c0adcb4
...
...
@@ -2,6 +2,7 @@ flags: {}
extra-package-dbs
:
[]
packages
:
-
.
-
servant-job
allow-newer
:
true
extra-deps
:
...
...
@@ -18,15 +19,16 @@ extra-deps:
-
haskell-src-exts-1.18.2
-
http-types-0.12.1
-
protolude-0.2
-
servant-0.1
2.1
-
servant-0.1
3
-
servant-auth-0.3.0.1
-
servant-client-0.1
2.0.1
-
servant-client-core-0.1
2
-
servant-client-0.1
3
-
servant-client-core-0.1
3
-
servant-docs-0.11.1
-
servant-multipart-0.11.1
-
servant-server-0.1
2
-
servant-server-0.1
3
-
servant-swagger-ui-0.2.3.2.2.8
-
stemmer-0.5.2
-
text-1.2.3.0
-
text-show-3.6.2
-
servant-flatten-0.2
resolver
:
lts-10.6
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment