Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-Implemente subcmd on github.com/urfave/cli/v2 #121

Merged
merged 6 commits into from May 15, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build_pages.yml
Expand Up @@ -24,7 +24,7 @@ jobs:
- name: 'Generate htdocs'
run: |
cd generator
BASEURL=/slacklog go run . generate-html scripts/config.json templates/ ../data/files ../data/slacklog_data/ ../data/
BASEURL=/slacklog go run . generate-html --filesdir ../data/files --indir ../data/slacklog_data/ --outdir ../data/
cp -r assets ../data
rm -fr ../data/slacklog_data/ ../data/.github/
touch ../data/.nojekyll
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Expand Up @@ -7,6 +7,6 @@ require (
github.com/google/go-cmp v0.4.0
github.com/joho/godotenv v1.3.0
github.com/kyokomi/emoji v2.2.2+incompatible
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/slack-go/slack v0.6.4
github.com/urfave/cli/v2 v2.2.0
)
8 changes: 8 additions & 0 deletions go.sum
@@ -1,3 +1,5 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-test/deep v1.0.4 h1:u2CU3YKy9I2pmu9pX0eq50wCgjfGIt539SqR7FbHiho=
Expand All @@ -14,9 +16,15 @@ github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/slack-go/slack v0.6.4 h1:cxOqFgM5RW6mdEyDqAJutFk3qiORK9oHRKi5bPqkY9o=
github.com/slack-go/slack v0.6.4/go.mod h1:sGRjv3w+ERAUMMMbldHObQPBcNSyVB7KLKYfnwUFBfw=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4=
github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
2 changes: 1 addition & 1 deletion scripts/download_emoji.sh
Expand Up @@ -9,4 +9,4 @@ if [ ! -d _logdata/slacklog_data/ ] ; then
exit 1
fi

go run . download-emoji _logdata/emojis/ _logdata/slacklog_data/emoji.json
go run . download-emoji
2 changes: 1 addition & 1 deletion scripts/download_files.sh
Expand Up @@ -9,4 +9,4 @@ if [ ! -d _logdata/slacklog_data/ ] ; then
exit 1
fi

go run . download-files _logdata/slacklog_data/ _logdata/files/
go run . download-files
2 changes: 1 addition & 1 deletion scripts/generate_html.sh
Expand Up @@ -9,4 +9,4 @@ if [ ! -d _logdata/slacklog_data/ ] ; then
exit 1
fi

go run . generate-html scripts/config.json templates/ files/ _logdata/slacklog_data/ _site/
go run . generate-html
2 changes: 1 addition & 1 deletion scripts/site_diff.sh
Expand Up @@ -51,7 +51,7 @@ generate_site() {
if [ -d _logdata ] ; then
filesdir=_logdata/files/
fi
${cmd} generate-html scripts/config.json ${tmpldir} ${filesdir} ${logdir} ${outdir}/ > ${outdir}.generate-html.log 2>&1 || ( cat ${outdir}.generate-html.log && exit 1 )
${cmd} generate-html --templatedir ${tmpldir} --filesdir ${filesdir} --indir ${logdir} --outdir ${outdir}/ > ${outdir}.generate-html.log 2>&1 || ( cat ${outdir}.generate-html.log && exit 1 )
rm -f ${cmd}
./scripts/build.sh -o $outdir > ${outdir}.build.log 2>&1 || ( cat ${outdir}.build.log && exit 1 )
}
Expand Down
25 changes: 17 additions & 8 deletions subcmd/convert_exported_logs.go
Expand Up @@ -14,19 +14,28 @@ import (
"os"
"path/filepath"

cli "github.com/urfave/cli/v2"
"github.com/vim-jp/slacklog-generator/internal/slacklog"
)

var ConvertExportedLogsFlags = []cli.Flag {
&cli.StringFlag{
Name: "indir",
Usage: "exported log dir",
Value: "_old_logs",
},
&cli.StringFlag{
Name: "outdir",
Usage: "slacklog_data dir",
Value: filepath.Join("_logdata", "slacklog_data"),
},
}

// ConvertExportedLogs converts log which exported from Slack, to generator can
// treated.
func ConvertExportedLogs(args []string) error {
if len(args) < 2 {
fmt.Println("Usage: go run . convert_exported_logs {indir} {outdir}")
return nil
}

inDir := filepath.Clean(args[0])
outDir := filepath.Clean(args[1])
func ConvertExportedLogs(c *cli.Context) error {
inDir := filepath.Clean(c.String("indir"))
outDir := filepath.Clean(c.String("outdir"))
inChannelsFile := filepath.Join(inDir, "channels.json")

channels, _, err := readChannels(inChannelsFile, []string{"*"})
Expand Down
28 changes: 17 additions & 11 deletions subcmd/download_emoji.go
Expand Up @@ -15,26 +15,32 @@ import (
"strings"

"github.com/slack-go/slack"
cli "github.com/urfave/cli/v2"
"github.com/vim-jp/slacklog-generator/internal/slacklog"
)

var EmojisFlags = []cli.Flag{
&cli.StringFlag{
Name: "outdir",
Usage: "emojis download target dir",
Value: filepath.Join("_logdata", "emojis"),
},
&cli.StringFlag{
Name: "emojiJSON",
Usage: "emoji json path",
Value: filepath.Join("_logdata", "emojis", "emoji.json"),
},
}

// DownloadEmoji downloads and save emoji image files.
func DownloadEmoji(args []string) error {
func DownloadEmoji(c *cli.Context) error {
slackToken := os.Getenv("SLACK_TOKEN")
if slackToken == "" {
return fmt.Errorf("$SLACK_TOKEN required")
}

if len(args) < 1 {
fmt.Println("Usage: go run . download_emoji {emojis-dir}")
return nil
}

emojisDir := filepath.Clean(args[0])
emojiJSONPath := filepath.Join(emojisDir, "emoji.json")
if 1 < len(args) {
emojiJSONPath = filepath.Clean(args[1])
}
emojisDir := filepath.Clean(c.String("outdir"))
emojiJSONPath := filepath.Clean(c.String("emojiJSON"))

api := slack.New(slackToken)

Expand Down
25 changes: 17 additions & 8 deletions subcmd/download_files.go
Expand Up @@ -12,23 +12,32 @@ import (
"os"
"path/filepath"

cli "github.com/urfave/cli/v2"
"github.com/vim-jp/slacklog-generator/internal/slacklog"
)

var FilesFlags = []cli.Flag{
&cli.StringFlag{
Name: "indir",
Usage: "slacklog_data dir",
Value: filepath.Join("_logdata", "slacklog_data"),
},
&cli.StringFlag{
Name: "outdir",
Usage: "files download target dir",
Value: filepath.Join("_logdata", "files"),
},
}

// DownloadFiles downloads and saves files which attached to message.
func DownloadFiles(args []string) error {
func DownloadFiles(c *cli.Context) error {
slackToken := os.Getenv("SLACK_TOKEN")
if slackToken == "" {
return fmt.Errorf("$SLACK_TOKEN required")
}

if len(args) < 2 {
fmt.Println("Usage: go run . download_files {log-dir} {files-dir}")
return nil
}

logDir := filepath.Clean(args[0])
filesDir := filepath.Clean(args[1])
logDir := filepath.Clean(c.String("indir"))
filesDir := filepath.Clean(c.String("outdir"))

s, err := slacklog.NewLogStore(logDir, &slacklog.Config{Channels: []string{"*"}})
if err != nil {
Expand Down
45 changes: 35 additions & 10 deletions subcmd/generate_html.go
Expand Up @@ -4,20 +4,45 @@ import (
"fmt"
"path/filepath"

cli "github.com/urfave/cli/v2"
"github.com/vim-jp/slacklog-generator/internal/slacklog"
)

var GenerateHTMLFlags = []cli.Flag{
&cli.StringFlag{
Name: "config",
Usage: "config.json path",
Value: filepath.Join("scripts", "config.json"),
},
&cli.StringFlag{
Name: "templatedir",
Usage: "templates dir",
Value: "templates",
},
&cli.StringFlag{
Name: "filesdir",
Usage: "files downloaded dir",
Value: filepath.Join("_logdata", "files"),
},
&cli.StringFlag{
Name: "indir",
Usage: "slacklog_data dir",
Value: filepath.Join("_logdata", "slacklog_data"),
},
&cli.StringFlag{
Name: "outdir",
Usage: "generated html target dir",
Value: "_site",
},
}

// GenerateHTML : SlackからエクスポートしたデータをHTMLに変換して出力する。
func GenerateHTML(args []string) error {
if len(args) < 4 {
fmt.Println("Usage: go run . generate_html {config.json} {templatedir} {filesdir} {indir} {outdir}")
return nil
}
configJSONPath := filepath.Clean(args[0])
templateDir := filepath.Clean(args[1])
filesDir := filepath.Clean(args[2])
inDir := filepath.Clean(args[3])
outDir := filepath.Clean(args[4])
func GenerateHTML(c *cli.Context) error {
configJSONPath := filepath.Clean(c.String("config"))
templateDir := filepath.Clean(c.String("templatedir"))
filesDir := filepath.Clean(c.String("filesdir"))
inDir := filepath.Clean(c.String("indir"))
outDir := filepath.Clean(c.String("outdir"))

cfg, err := slacklog.ReadConfig(configJSONPath)
if err != nil {
Expand Down
39 changes: 24 additions & 15 deletions subcmd/serve/serve.go
@@ -1,12 +1,31 @@
package serve

import (
"flag"
"net/http"
"net/http/httputil"
"net/url"

cli "github.com/urfave/cli/v2"
)

var Flags = []cli.Flag{
&cli.StringFlag{
Name: "addr",
Usage: "address for serve",
Value: ":8081",
},
&cli.StringFlag{
Name: "htdocs",
Usage: "root of files",
Value: "_site",
},
&cli.StringFlag{
Name: "target",
Usage: "proxy target endpoint",
Value: "https://vim-jp.org/slacklog/",
},
}

func newReverseProxy(targetURL string) (*httputil.ReverseProxy, error) {
u, err := url.Parse(targetURL)
if err != nil {
Expand All @@ -23,20 +42,10 @@ func newReverseProxy(targetURL string) (*httputil.ReverseProxy, error) {

// Run starts combined HTTP server (file + reverse proxy) to serve slacklog for
// development.
func Run(args []string) error {
var (
addr string
htdocs string
target string
)
fs := flag.NewFlagSet("serve", flag.ExitOnError)
fs.StringVar(&addr, "addr", ":8001", "address for serve")
fs.StringVar(&htdocs, "htdocs", "_site", "root of files")
fs.StringVar(&target, "target", "https://vim-jp.org/slacklog/", "proxy target endpoint")
err := fs.Parse(args)
if err != nil {
return err
}
func Run(c *cli.Context) error {
addr := c.String("addr")
htdocs := c.String("htdocs")
target := c.String("target")

proxy, err := newReverseProxy(target)
if err != nil {
Expand Down
66 changes: 41 additions & 25 deletions subcmd/subcmd.go
Expand Up @@ -4,36 +4,52 @@ import (
"fmt"
"os"

cli "github.com/urfave/cli/v2"
"github.com/vim-jp/slacklog-generator/subcmd/serve"
)

var commands = []*cli.Command{
{
Name: "convert-exported-logs",
Usage: "convert slack exported logs to API download logs",
Action: ConvertExportedLogs,
Flags: ConvertExportedLogsFlags,
},
{
Name: "download-emoji",
Usage: "download customized emoji from slack",
Action: DownloadEmoji,
Flags: EmojisFlags,
},
{
Name: "download-files",
Usage: "download files from slack.com",
Action: DownloadFiles,
Flags: FilesFlags,
},
{
Name: "generate-html",
Usage: "generate html from slacklog_data",
Action: GenerateHTML,
Flags: GenerateHTMLFlags,
},
{
Name: "serve",
Usage: "serve a generated HTML with files proxy",
Action: serve.Run,
Flags: serve.Flags,
},
}

// Run runs one of sub-commands.
func Run() error {
fmt.Println(os.Args)
if len(os.Args) < 2 {
fmt.Println(`Usage: go run . {subcmd}
Subcmd:
convert-exported-logs
download-emoji
download-files
generate-html`)
return nil
}

args := os.Args[2:]
subCmdName := os.Args[1]
switch subCmdName {
case "convert-exported-logs":
return ConvertExportedLogs(args)
case "download-emoji":
return DownloadEmoji(args)
case "download-files":
return DownloadFiles(args)
case "generate-html":
return GenerateHTML(args)
case "serve":
return serve.Run(args)
}
app := cli.NewApp()
app.EnableBashCompletion = true
app.Name = "slacklog-generator"
app.Usage = "generate slacklog HTML"
app.Version = "0.0.0"
app.Commands = commands

return fmt.Errorf("unknown subcmd: %s", subCmdName)
return app.Run(os.Args)
}