mirror of
https://github.com/ralsina/tartrazine.git
synced 2025-05-23 08:30:07 -03:00
Added languages.go generator
This commit is contained in:
parent
d373b46535
commit
d759fb8992
11
cli/slinguist-generate/assets/languages.go.tmpl
Normal file
11
cli/slinguist-generate/assets/languages.go.tmpl
Normal file
@ -0,0 +1,11 @@
|
||||
package slinguist
|
||||
|
||||
// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate
|
||||
// THIS FILE SHOULD NOT BE EDITED BY HAND
|
||||
// Extracted from github/linguist commit: {{ getCommit }}
|
||||
|
||||
var languagesByExtension = map[string][]string{
|
||||
{{range $extension, $languages := . -}}
|
||||
"{{ $extension }}": { {{- $languages | formatStringSlice -}} },
|
||||
{{end -}}
|
||||
}
|
34
cli/slinguist-generate/generator/generator.go
Normal file
34
cli/slinguist-generate/generator/generator.go
Normal file
@ -0,0 +1,34 @@
|
||||
package generator
|
||||
|
||||
import (
|
||||
"go/format"
|
||||
"io/ioutil"
|
||||
)
|
||||
|
||||
// Func is the function's type that generate the files from templates.
|
||||
type Func func(dataToParse []byte, templatePath string, template string, commit string) ([]byte, error)
|
||||
|
||||
// FromFile read data to parse from a file named fileToParse and write the generated source code to a file named outPath. The generated
|
||||
// source code is formated with gofmt and tagged with commit.
|
||||
func FromFile(fileToParse, outPath, tmplPath, tmplName, commit string, generate Func) error {
|
||||
buf, err := ioutil.ReadFile(fileToParse)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
source, err := generate(buf, tmplPath, tmplName, commit)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
formatedSource, err := format.Source(source)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := ioutil.WriteFile(outPath, formatedSource, 0666); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
98
cli/slinguist-generate/generator/generator_test.go
Normal file
98
cli/slinguist-generate/generator/generator_test.go
Normal file
@ -0,0 +1,98 @@
|
||||
package generator
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
const (
|
||||
// FromFile test
|
||||
formatedLangGold = "test_files/formated_languages.gold"
|
||||
formatedContentGold = "test_files/formated_content.gold"
|
||||
|
||||
// Languages test
|
||||
ymlTestFile = "test_files/languages.test.yml"
|
||||
langGold = "test_files/languages.gold"
|
||||
languagesTestTmplPath = "test_files/languages.test.tmpl"
|
||||
languagesTestTmplName = "languages.test.tmpl"
|
||||
commitLangTest = "fe8b44ab8a225b1ffa75b983b916ea22fee5b6f7"
|
||||
)
|
||||
|
||||
func TestFromFile(t *testing.T) {
|
||||
goldLang, err := ioutil.ReadFile(formatedLangGold)
|
||||
assert.NoError(t, err)
|
||||
|
||||
outPathLang, err := ioutil.TempFile("/tmp", "generator-test-")
|
||||
assert.NoError(t, err)
|
||||
defer os.Remove(outPathLang.Name())
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
fileToParse string
|
||||
outPath string
|
||||
tmplPath string
|
||||
tmplName string
|
||||
commit string
|
||||
generate Func
|
||||
wantOut []byte
|
||||
}{
|
||||
{
|
||||
name: "TestFromFile_Language",
|
||||
fileToParse: ymlTestFile,
|
||||
outPath: outPathLang.Name(),
|
||||
tmplPath: languagesTestTmplPath,
|
||||
tmplName: languagesTestTmplName,
|
||||
commit: commitLangTest,
|
||||
generate: Languages,
|
||||
wantOut: goldLang,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
err := FromFile(tt.fileToParse, tt.outPath, tt.tmplPath, tt.tmplName, tt.commit, tt.generate)
|
||||
assert.NoError(t, err)
|
||||
out, err := ioutil.ReadFile(tt.outPath)
|
||||
assert.NoError(t, err)
|
||||
assert.EqualValues(t, tt.wantOut, out, fmt.Sprintf("FromFile() = %v, want %v", string(out), string(tt.wantOut)))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestLanguages(t *testing.T) {
|
||||
gold, err := ioutil.ReadFile(langGold)
|
||||
assert.NoError(t, err)
|
||||
|
||||
input, err := ioutil.ReadFile(ymlTestFile)
|
||||
assert.NoError(t, err)
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
input []byte
|
||||
tmplPath string
|
||||
tmplName string
|
||||
commit string
|
||||
wantOut []byte
|
||||
}{
|
||||
{
|
||||
name: "TestLanguages",
|
||||
input: input,
|
||||
tmplPath: languagesTestTmplPath,
|
||||
tmplName: languagesTestTmplName,
|
||||
commit: commitLangTest,
|
||||
wantOut: gold,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
out, err := Languages(tt.input, tt.tmplPath, tt.tmplName, tt.commit)
|
||||
assert.NoError(t, err)
|
||||
assert.EqualValues(t, tt.wantOut, out, fmt.Sprintf("Languages() = %v, want %v", string(out), string(tt.wantOut)))
|
||||
})
|
||||
}
|
||||
}
|
92
cli/slinguist-generate/generator/langs.go
Normal file
92
cli/slinguist-generate/generator/langs.go
Normal file
@ -0,0 +1,92 @@
|
||||
package generator
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"io"
|
||||
"strings"
|
||||
"text/template"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
var (
|
||||
// ErrExtensionsNotFound is the error returned if data parsed doesn't contain extensions.
|
||||
ErrExtensionsNotFound = errors.New("extensions not found")
|
||||
)
|
||||
|
||||
// Languages reads from buf and builds languages.go file from languagesTmplPath.
|
||||
func Languages(data []byte, languagesTmplPath, languagesTmplName, commit string) ([]byte, error) {
|
||||
var yamlSlice yaml.MapSlice
|
||||
if err := yaml.Unmarshal(data, &yamlSlice); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
languagesByExtension, err := buildExtensionLanguageMap(yamlSlice)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
buf := &bytes.Buffer{}
|
||||
if err := executeLanguagesTemplate(buf, languagesByExtension, languagesTmplPath, languagesTmplName, commit); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return buf.Bytes(), nil
|
||||
}
|
||||
|
||||
func buildExtensionLanguageMap(yamlSlice yaml.MapSlice) (map[string][]string, error) {
|
||||
extensionLangsMap := make(map[string][]string)
|
||||
for _, lang := range yamlSlice {
|
||||
extensions, err := findExtensions(lang.Value.(yaml.MapSlice))
|
||||
if err != nil && err != ErrExtensionsNotFound {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
fillMap(extensionLangsMap, lang.Key.(string), extensions)
|
||||
}
|
||||
|
||||
return extensionLangsMap, nil
|
||||
}
|
||||
|
||||
func findExtensions(items yaml.MapSlice) ([]string, error) {
|
||||
const extField = "extensions"
|
||||
for _, item := range items {
|
||||
if item.Key == extField {
|
||||
extensions := toStringSlice(item.Value.([]interface{}))
|
||||
return extensions, nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil, ErrExtensionsNotFound
|
||||
}
|
||||
|
||||
func toStringSlice(slice []interface{}) []string {
|
||||
extensions := make([]string, 0, len(slice))
|
||||
for _, element := range slice {
|
||||
extension := element.(string)
|
||||
extensions = append(extensions, extension)
|
||||
}
|
||||
|
||||
return extensions
|
||||
}
|
||||
|
||||
func fillMap(extensionLangs map[string][]string, lang string, extensions []string) {
|
||||
for _, extension := range extensions {
|
||||
extensionLangs[extension] = append(extensionLangs[extension], lang)
|
||||
}
|
||||
}
|
||||
|
||||
func executeLanguagesTemplate(out io.Writer, languagesByExtension map[string][]string, languagesTmplPath, languagesTmpl, commit string) error {
|
||||
fmap := template.FuncMap{
|
||||
"getCommit": func() string { return commit },
|
||||
"formatStringSlice": func(slice []string) string { return `"` + strings.Join(slice, `","`) + `"` },
|
||||
}
|
||||
|
||||
t := template.Must(template.New(languagesTmpl).Funcs(fmap).ParseFiles(languagesTmplPath))
|
||||
if err := t.Execute(out, languagesByExtension); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package slinguist
|
||||
|
||||
// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate
|
||||
// THIS FILE SHOULD NOT BE EDITED BY HAND
|
||||
// Extracted from github/linguist commit: fe8b44ab8a225b1ffa75b983b916ea22fee5b6f7
|
||||
|
||||
var languagesByExtension = map[string][]string{
|
||||
".abap": {"ABAP"},
|
||||
".abnf": {"ABNF"},
|
||||
".bsl": {"1C Enterprise"},
|
||||
".os": {"1C Enterprise"},
|
||||
}
|
12
cli/slinguist-generate/generator/test_files/languages.gold
Normal file
12
cli/slinguist-generate/generator/test_files/languages.gold
Normal file
@ -0,0 +1,12 @@
|
||||
package slinguist
|
||||
|
||||
// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate
|
||||
// THIS FILE SHOULD NOT BE EDITED BY HAND
|
||||
// Extracted from github/linguist commit: fe8b44ab8a225b1ffa75b983b916ea22fee5b6f7
|
||||
|
||||
var languagesByExtension = map[string][]string{
|
||||
".abap": {"ABAP"},
|
||||
".abnf": {"ABNF"},
|
||||
".bsl": {"1C Enterprise"},
|
||||
".os": {"1C Enterprise"},
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package slinguist
|
||||
|
||||
// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate
|
||||
// THIS FILE SHOULD NOT BE EDITED BY HAND
|
||||
// Extracted from github/linguist commit: {{ getCommit }}
|
||||
|
||||
var languagesByExtension = map[string][]string{
|
||||
{{range $extension, $languages := . -}}
|
||||
"{{ $extension }}": { {{- $languages | formatStringSlice -}} },
|
||||
{{end -}}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package slinguist
|
||||
|
||||
// CODE GENERATED AUTOMATICALLY WITH github.com/src-d/simple-linguist/cli/slinguist-generate
|
||||
// THIS FILE SHOULD NOT BE EDITED BY HAND
|
||||
// Extracted from github/linguist commit: {{ getCommit }}
|
||||
|
||||
var languagesByExtension = map[string][]string{
|
||||
{{range $extension, $languages := . -}}
|
||||
"{{ $extension }}": { {{- $languages | formatStringSlice -}} },
|
||||
{{end -}}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
---
|
||||
1C Enterprise:
|
||||
type: programming
|
||||
color: "#814CCC"
|
||||
extensions:
|
||||
- ".bsl"
|
||||
- ".os"
|
||||
tm_scope: source.bsl
|
||||
ace_mode: text
|
||||
language_id: 0
|
||||
ABAP:
|
||||
type: programming
|
||||
color: "#E8274B"
|
||||
extensions:
|
||||
- ".abap"
|
||||
ace_mode: abap
|
||||
language_id: 1
|
||||
ABNF:
|
||||
type: data
|
||||
ace_mode: text
|
||||
extensions:
|
||||
- ".abnf"
|
||||
tm_scope: source.abnf
|
||||
language_id: 429
|
42
cli/slinguist-generate/main.go
Normal file
42
cli/slinguist-generate/main.go
Normal file
@ -0,0 +1,42 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"log"
|
||||
|
||||
"srcd.works/simple-linguist.v1/cli/slinguist-generate/generator"
|
||||
)
|
||||
|
||||
const (
|
||||
languagesYAML = ".linguist/lib/linguist/languages.yml"
|
||||
langFile = "languages.go"
|
||||
languagesTmplPath = "cli/slinguist-generate/assets/languages.go.tmpl"
|
||||
languagesTmpl = "languages.go.tmpl"
|
||||
|
||||
heuristicsRuby = ".linguist/lib/linguist/heuristics.rb"
|
||||
contentFile = "content.go"
|
||||
contentTmplPath = "cli/slinguist-generate/assets/content.go.tmpl"
|
||||
contentTmpl = "content.go.tmpl"
|
||||
|
||||
commitPath = ".git/refs/heads/master"
|
||||
)
|
||||
|
||||
func main() {
|
||||
commit, err := getCommit(commitPath)
|
||||
if err != nil {
|
||||
log.Printf("couldn't find commit: %v", err)
|
||||
}
|
||||
|
||||
if err := generator.FromFile(languagesYAML, langFile, languagesTmplPath, languagesTmpl, commit, generator.Languages); err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
}
|
||||
|
||||
func getCommit(path string) (string, error) {
|
||||
commit, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(commit), nil
|
||||
}
|
@ -12,7 +12,7 @@ func (s *TSuite) TestGetLanguageByExtension(c *C) {
|
||||
c.Assert(safe, Equals, true)
|
||||
|
||||
lang, safe = GetLanguageByExtension("foo.go.php")
|
||||
c.Assert(lang, Equals, "PHP")
|
||||
c.Assert(lang, Equals, "Hack")
|
||||
c.Assert(safe, Equals, false)
|
||||
}
|
||||
|
||||
|
3
generate.go
Normal file
3
generate.go
Normal file
@ -0,0 +1,3 @@
|
||||
package slinguist
|
||||
|
||||
//go:generate go run cli/slinguist-generate/main.go
|
1892
languages.go
1892
languages.go
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user