From 0c878468f5ea19789963c2e7feebbae756098ae0 Mon Sep 17 00:00:00 2001 From: balki <3070606-balki@users.noreply.gitlab.com> Date: Tue, 21 Jun 2022 22:17:16 -0400 Subject: [PATCH] schema generator working --- cmd/gen_schema/main.go | 68 ++++++++------- docs/schema.json | 2 +- docs/schema.yaml | 191 +++++++++++++++++++++-------------------- 3 files changed, 136 insertions(+), 125 deletions(-) diff --git a/cmd/gen_schema/main.go b/cmd/gen_schema/main.go index 72dcf15..31999d8 100644 --- a/cmd/gen_schema/main.go +++ b/cmd/gen_schema/main.go @@ -2,54 +2,60 @@ package main import ( "encoding/json" - "fmt" "os" "github.com/invopop/jsonschema" "go.balki.me/tss/app" + "gopkg.in/yaml.v3" ) -func fix(s string) string { - // s := "go.balki.me/tss/home/balki/projects/tss/app.Config.Proxy" - return fmt.Sprintf("%s%s", s[:16], s[40:]) -} +var refsDoc = `Placeholder to put any yaml anchors to use elsewhere, E.g. +refs: + myvpsproxy: &myvpsproxy "socks5://vps.example.com:1080" + twiceaday: &twiceaday "00 1,13 * * *"` type config struct { app.Config - // Placeholder to put any yaml anchors to use elsewhere, E.g. - // refs: - // myvpsproxy: &myvpsproxy "socks5://vps.example.com:1080" - // twiceaday: &twiceaday "00 1,13 * * *" Refs map[string]any `yaml:"refs" jsonschema:"refs"` } func main() { - // "go.balki.me/tss/app.FeedCfg.Channel": "Telegram channel name in the form \"@foobar\" or \"-1004242442\"", - //s go.balki.me/tss/app.FeedCfg.Channel - // foo() - // return - fmt.Println("vim-go") - cmmap := map[string]string{} - err := jsonschema.ExtractGoComments("go.balki.me/tss", "/home/balki/projects/tss", cmmap) - cmmapF := map[string]string{} - for k, v := range cmmap { - cmmapF[fix(k)] = v - } - cmmap = cmmapF - fmt.Println("err", err) - d, err := json.Marshal(cmmap) - fmt.Printf("%s\n", string(d)) - os.WriteFile("/tmp/cmmap.json", d, 0644) - var c config r := jsonschema.Reflector{ RequiredFromJSONSchemaTags: true, DoNotReference: true, ExpandedStruct: true, - CommentMap: cmmap, } - s := r.Reflect(c) - j, _ := json.Marshal(s) - os.WriteFile("/home/balki/projects/tss/docs/schema.json", j, 0644) - fmt.Println(string(j)) + err := r.AddGoComments("go.balki.me/tss", ".") + if err != nil { + panic(err) + } + r.CommentMap["main.config.Refs"] = refsDoc + + s := r.Reflect(config{}) + j, err := json.Marshal(s) + if err != nil { + panic(err) + } + + err = os.WriteFile("./docs/schema.json", j, 0644) + if err != nil { + panic(err) + } + + var a any + err = yaml.Unmarshal(j, &a) + if err != nil { + panic(err) + } + + y, err := yaml.Marshal(a) + if err != nil { + panic(err) + } + + err = os.WriteFile("./docs/schema.yaml", y, 0644) + if err != nil { + panic(err) + } } diff --git a/docs/schema.json b/docs/schema.json index 33fb52e..449dfc4 100644 --- a/docs/schema.json +++ b/docs/schema.json @@ -1 +1 @@ -{"$schema":"http://json-schema.org/draft/2020-12/schema","properties":{"proxy":{"type":"string","description":"default proxy url that http.Client can understand\nor socks5://unix/path/to/sock for socks proxy over unix socket\nempty for no proxy","default":""},"telegram_proxy":{"type":"string","description":"proxy for telegram if different from default\nNONE to not use global default","default":"\u003cglobal proxy\u003e"},"telegram_auth_token":{"type":"string","description":"Auth token for telegram in the form of 424242424:AB02132skdcjlisjkjflewjlfkjslkfHHXX"},"data_dir":{"type":"string","description":"Base directory to write feed data and schedule file","default":"./"},"last_loaded_path":{"type":"string","description":"Path to the file where last success time for each feed is saved","default":"\u003cdatadir\u003e/last_success.yml"},"db_dir":{"type":"string","description":"Path to the directory where feed content is saved","default":"\u003cdatadir\u003e/feed_data"},"first_time_limit":{"type":"integer","description":"Number of entries to process when the feed is seen for the first time\n-1 means no limit","default":-1},"feeds":{"items":{"properties":{"name":{"type":"string","description":"Unique identifier for the feed. Used as filename, so keep it simple"},"channel":{"type":"string","description":"Telegram channel name in the form \"@foobar\" or \"-1004242442\" (private)"},"rhash":{"type":"string","description":"Telegram instant view rhash id, see https://instantview.telegram.org/#publishing-templates","default":""},"url":{"oneOf":[{"type":"string"},{"type":"array"}],"items":{"type":"string"},"description":"Feed Url, string or array of strings\nIf array, all entries are merged, e.g [\"https://example.com/blog/tag/foo/feed\", \"https://example.com/blog/tag/bar/feed\" ]"},"cron":{"type":"string","description":"Cron expression, see https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format"},"proxy":{"type":"string","description":"Proxy for this feed if different from global","default":"\u003cglobal proxy\u003e"},"type":{"type":"string","enum":["rss","atom"],"description":"Rss or Atom feed"},"title":{"type":"string","description":"Text of the link sent to telegram,","default":"Link"},"first_time_limit":{"type":"integer","description":"Number of entries to process when the feed is seen for the first time","default":0}},"additionalProperties":false,"type":"object","required":["name","channel","url","cron","type"]},"type":"array","description":"Feed config"},"refs":{"type":"object"}},"additionalProperties":false,"type":"object","required":["telegram_auth_token","feeds"]} \ No newline at end of file +{"$schema":"http://json-schema.org/draft/2020-12/schema","properties":{"proxy":{"type":"string","description":"default proxy url that http.Client can understand\nor socks5://unix/path/to/sock for socks proxy over unix socket\nempty for no proxy","default":""},"telegram_proxy":{"type":"string","description":"proxy for telegram if different from default\nNONE to not use global default","default":"\u003cglobal proxy\u003e"},"telegram_auth_token":{"type":"string","description":"Auth token for telegram in the form of 424242424:AB02132skdcjlisjkjflewjlfkjslkfHHXX"},"data_dir":{"type":"string","description":"Base directory to write feed data and schedule file","default":"./"},"last_loaded_path":{"type":"string","description":"Path to the file where last success time for each feed is saved","default":"\u003cdatadir\u003e/last_success.yml"},"db_dir":{"type":"string","description":"Path to the directory where feed content is saved","default":"\u003cdatadir\u003e/feed_data"},"first_time_limit":{"type":"integer","description":"Number of entries to process when the feed is seen for the first time\n-1 means no limit","default":-1},"feeds":{"items":{"properties":{"name":{"type":"string","description":"Unique identifier for the feed. Used as filename, so keep it simple"},"channel":{"type":"string","description":"Telegram channel name in the form \"@foobar\" or \"-1004242442\" (private)"},"rhash":{"type":"string","description":"Telegram instant view rhash id, see https://instantview.telegram.org/#publishing-templates","default":""},"url":{"oneOf":[{"type":"string"},{"type":"array"}],"items":{"type":"string"},"description":"Feed URL, string or array of strings\nIf array, all entries are merged, e.g [\"https://example.com/blog/tag/foo/feed\", \"https://example.com/blog/tag/bar/feed\" ]"},"cron":{"type":"string","description":"Cron expression, see https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format"},"proxy":{"type":"string","description":"Proxy for this feed if different from global","default":"\u003cglobal proxy\u003e"},"type":{"type":"string","enum":["rss","atom"],"description":"Rss or Atom feed"},"title":{"type":"string","description":"Text of the link sent to telegram,","default":"Link"},"first_time_limit":{"type":"integer","description":"Number of entries to process when the feed is seen for the first time","default":0}},"additionalProperties":false,"type":"object","required":["name","channel","url","cron","type"]},"type":"array","description":"Feed config"},"refs":{"type":"object","description":"Placeholder to put any yaml anchors to use elsewhere, E.g.\nrefs:\n myvpsproxy: \u0026myvpsproxy \"socks5://vps.example.com:1080\"\n twiceaday: \u0026twiceaday \"00 1,13 * * *\""}},"additionalProperties":false,"type":"object","required":["telegram_auth_token","feeds"]} \ No newline at end of file diff --git a/docs/schema.yaml b/docs/schema.yaml index 2c6ddba..4d2e6cb 100644 --- a/docs/schema.yaml +++ b/docs/schema.yaml @@ -1,96 +1,101 @@ $schema: http://json-schema.org/draft/2020-12/schema -properties: - proxy: - type: string - description: |- - default proxy url that http.Client can understand - or socks5://unix/path/to/sock for socks proxy over unix socket - empty for no proxy - default: "" - telegram_proxy: - type: string - description: |- - proxy for telegram if different from default - NONE to not use global default - default: - telegram_auth_token: - type: string - description: Auth token for telegram in the form of 424242424:AB02132skdcjlisjkjflewjlfkjslkfHHXX - data_dir: - type: string - description: Base directory to write feed data and schedule file - default: ./ - last_loaded_path: - type: string - description: Path to the file where last success time for each feed is saved - default: /last_success.yml - db_dir: - type: string - description: Path to the directory where feed content is saved - default: /feed_data - first_time_limit: - type: integer - description: |- - Number of entries to process when the feed is seen for the first time - -1 means no limit - default: -1 - feeds: - items: - properties: - name: - type: string - description: Unique identifier for the feed. Used as filename, so keep it simple - channel: - type: string - description: Telegram channel name in the form "@foobar" or "-1004242442" (private) - rhash: - type: string - description: Telegram instant view rhash id, see https://instantview.telegram.org/#publishing-templates - default: "" - url: - oneOf: - - type: string - - type: array - items: - type: string - description: |- - Feed Url, string or array of strings - If array, all entries are merged, e.g ["https://example.com/blog/tag/foo/feed", "https://example.com/blog/tag/bar/feed" ] - cron: - type: string - description: "Cron expression, see https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format" - proxy: - type: string - description: Proxy for this feed if different from global - default: - type: - type: string - enum: - - rss - - atom - description: Rss or Atom feed - title: - type: string - description: Text of the link sent to telegram, - default: Link - first_time_limit: - type: integer - description: Number of entries to process when the feed is seen for the first time - default: 0 - additionalProperties: false - type: object - required: - - name - - channel - - url - - cron - - type - type: array - description: Feed config - refs: - type: object additionalProperties: false -type: object +properties: + data_dir: + default: ./ + description: Base directory to write feed data and schedule file + type: string + db_dir: + default: /feed_data + description: Path to the directory where feed content is saved + type: string + feeds: + description: Feed config + items: + additionalProperties: false + properties: + channel: + description: Telegram channel name in the form "@foobar" or "-1004242442" (private) + type: string + cron: + description: Cron expression, see https://pkg.go.dev/github.com/robfig/cron#hdr-CRON_Expression_Format + type: string + first_time_limit: + default: 0 + description: Number of entries to process when the feed is seen for the first time + type: integer + name: + description: Unique identifier for the feed. Used as filename, so keep it simple + type: string + proxy: + default: + description: Proxy for this feed if different from global + type: string + rhash: + default: "" + description: Telegram instant view rhash id, see https://instantview.telegram.org/#publishing-templates + type: string + title: + default: Link + description: Text of the link sent to telegram, + type: string + type: + description: Rss or Atom feed + enum: + - rss + - atom + type: string + url: + description: |- + Feed URL, string or array of strings + If array, all entries are merged, e.g ["https://example.com/blog/tag/foo/feed", "https://example.com/blog/tag/bar/feed" ] + items: + type: string + oneOf: + - type: string + - type: array + required: + - name + - channel + - url + - cron + - type + type: object + type: array + first_time_limit: + default: -1 + description: |- + Number of entries to process when the feed is seen for the first time + -1 means no limit + type: integer + last_loaded_path: + default: /last_success.yml + description: Path to the file where last success time for each feed is saved + type: string + proxy: + default: "" + description: |- + default proxy url that http.Client can understand + or socks5://unix/path/to/sock for socks proxy over unix socket + empty for no proxy + type: string + refs: + description: |- + Placeholder to put any yaml anchors to use elsewhere, E.g. + refs: + myvpsproxy: &myvpsproxy "socks5://vps.example.com:1080" + twiceaday: &twiceaday "00 1,13 * * *" + type: object + telegram_auth_token: + description: Auth token for telegram in the form of 424242424:AB02132skdcjlisjkjflewjlfkjslkfHHXX + type: string + telegram_proxy: + default: + description: |- + proxy for telegram if different from default + NONE to not use global default + type: string required: - - telegram_auth_token - - feeds + - telegram_auth_token + - feeds +type: object