Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
aviaviavi committed Sep 5, 2018
0 parents commit e8fcf65
Show file tree
Hide file tree
Showing 7 changed files with 230 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.stack-work/
pile.cabal
*~
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# pile
2 changes: 2 additions & 0 deletions Setup.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import Distribution.Simple
main = defaultMain
107 changes: 107 additions & 0 deletions app/Main.hs
Original file line number Diff line number Diff line change
@@ -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
46 changes: 46 additions & 0 deletions package.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: pile
version: 0.1.0.0
github: "aviaviavi/pile"
license: MIT
author: "Avi Press"
maintainer: "[email protected]"
copyright: "2018 Avi Press"

extra-source-files:
- README.md

synopsis: Manage the TODO entries in your code
description: See the README on GitHub at <https://github.com/aviaviavi/pile#readme>

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
6 changes: 6 additions & 0 deletions src/Lib.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module Lib
( someFunc
) where

someFunc :: IO ()
someFunc = putStrLn "someFunc"
65 changes: 65 additions & 0 deletions stack.yaml
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit e8fcf65

Please sign in to comment.