diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4411634 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.stack-work/ +pile.cabal +*~ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f15a233 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# pile diff --git a/Setup.hs b/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/app/Main.hs b/app/Main.hs new file mode 100644 index 0000000..b838d37 --- /dev/null +++ b/app/Main.hs @@ -0,0 +1,107 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} + +module Main where + +import qualified Control.Exception as E +import Data.Maybe +import qualified Data.Text as T +import Data.Void +import System.IO.HVFS +import System.Path +import Text.Megaparsec +import Text.Megaparsec.Char +import qualified Text.Megaparsec.Char.Lexer as L + +import Lib + +data CommentedLine = CommentedLine + { sourceFile :: FilePath + , lineNumber :: Integer + , rawText :: T.Text + , code :: Maybe T.Text + , commentText :: T.Text + } deriving (Show) + +data TodoEntry = TodoEntry + { body :: T.Text + , assignee :: Maybe T.Text + } deriving (Show) + +data SourceFile = SourceFile { + fullPath :: FilePath, + sourceLines :: [T.Text] + } +fileTypeToComment :: [(T.Text, T.Text)] +fileTypeToComment = + [ ("hs", "--") + , ("js", "//") + , ("yaml", "#") + , ("go", "//") + , (".proto", "//") + , (".ts", "//") + , (".py", "#") + , (".java", "//") + , (".cpp", "//") + ] + +unkownMarker :: T.Text +unkownMarker = "------UNKNOWN-DELIMETER-----" + +getCommentForFileType :: T.Text -> T.Text +getCommentForFileType extension = fromMaybe unkownMarker $ lookup extension fileTypeToComment + +type Parser = Parsec Void T.Text + +lexeme :: Parser a -> Parser a +lexeme = L.lexeme space + +symbol :: T.Text -> Parser T.Text +symbol = L.symbol space + +parseComment :: T.Text -> Parser T.Text +parseComment extension = do + _ <- manyTill anyChar (symbol $ getCommentForFileType extension) + b <- many anyChar + return $ T.pack b + +parseTodo :: T.Text -> Parser TodoEntry +parseTodo extension = do + _ <- manyTill anyChar (symbol $ getCommentForFileType extension) + _ <- symbol "TODO" + b <- many anyChar + return $ TodoEntry (T.pack b) Nothing + +-- TODO hi hi hi +hardCodedDir :: FilePath +hardCodedDir = "/Users/avipress/side/pile" + +-- TODO(avi) here's a todo! +getAllFiles :: FilePath -> IO [SourceFile] +getAllFiles path = E.catch + (do + putStrLn path -- a comment! + files <- recurseDir SystemFS path + let validFiles = (filter fileHasValidExtension files) + mapM_ putStrLn validFiles + mapM (\f -> (SourceFile f) <$> (map T.pack . lines) <$> readFile f) validFiles) + (\(e :: E.IOException) -> + putStrLn ("Error reading " ++ path ++ ": " ++ show e) >> return []) + +fileHasValidExtension :: FilePath -> Bool +fileHasValidExtension path = + any (\ext -> ext `T.isSuffixOf` T.pack path) + [".hs", ".yaml", ".go", "js", ".ts"] + +getExtension :: FilePath -> T.Text +getExtension path = last $ T.splitOn "." (T.pack path) + +runTodoParser :: SourceFile -> [TodoEntry] +runTodoParser (SourceFile path ls) = map fromJust $ filter isJust $ map (parseMaybe . parseTodo $ getExtension path) ls + +main :: IO () +main = do + putStrLn "pile" + allFiles <- getAllFiles hardCodedDir + let parsedTodos = concatMap runTodoParser allFiles + print $ (take 5) parsedTodos diff --git a/package.yaml b/package.yaml new file mode 100644 index 0000000..7b7793d --- /dev/null +++ b/package.yaml @@ -0,0 +1,46 @@ +name: pile +version: 0.1.0.0 +github: "aviaviavi/pile" +license: MIT +author: "Avi Press" +maintainer: "mail@avi.press" +copyright: "2018 Avi Press" + +extra-source-files: +- README.md + +synopsis: Manage the TODO entries in your code +description: See the README on GitHub at + +dependencies: +- base >= 4.7 && < 5 + +library: + source-dirs: src + +executables: + pile-exe: + main: Main.hs + source-dirs: app + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - pile + - text + - megaparsec + - directory + - filepath + - MissingH + +# tests: +# pile-test: +# main: Spec.hs +# source-dirs: test +# ghc-options: +# - -threaded +# - -rtsopts +# - -with-rtsopts=-N +# dependencies: +# - pile diff --git a/src/Lib.hs b/src/Lib.hs new file mode 100644 index 0000000..d36ff27 --- /dev/null +++ b/src/Lib.hs @@ -0,0 +1,6 @@ +module Lib + ( someFunc + ) where + +someFunc :: IO () +someFunc = putStrLn "someFunc" diff --git a/stack.yaml b/stack.yaml new file mode 100644 index 0000000..58bcbb5 --- /dev/null +++ b/stack.yaml @@ -0,0 +1,65 @@ +# This file was automatically generated by 'stack init' +# +# Some commonly used options have been documented as comments in this file. +# For advanced use and comprehensive documentation of the format, please see: +# https://docs.haskellstack.org/en/stable/yaml_configuration/ + +# Resolver to choose a 'specific' stackage snapshot or a compiler version. +# A snapshot resolver dictates the compiler version and the set of packages +# to be used for project dependencies. For example: +# +# resolver: lts-3.5 +# resolver: nightly-2015-09-21 +# resolver: ghc-7.10.2 +# resolver: ghcjs-0.1.0_ghc-7.10.2 +# +# The location of a snapshot can be provided as a file or url. Stack assumes +# a snapshot provided as a file might change, whereas a url resource does not. +# +# resolver: ./custom-snapshot.yaml +# resolver: https://example.com/snapshots/2018-01-01.yaml +resolver: lts-11.22 + +# User packages to be built. +# Various formats can be used as shown in the example below. +# +# packages: +# - some-directory +# - https://example.com/foo/bar/baz-0.0.2.tar.gz +# - location: +# git: https://github.com/commercialhaskell/stack.git +# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# subdirs: +# - auto-update +# - wai +packages: +- . +# Dependency packages to be pulled from upstream that are not in the resolver +# using the same syntax as the packages field. +# (e.g., acme-missiles-0.3) +# extra-deps: [] + +# Override default flag values for local packages and extra-deps +# flags: {} + +# Extra package databases containing global packages +# extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true +# +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: ">=1.7" +# +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 +# +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] +# +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor