func TestExtractCities(t *testing.T) { var cities []dt.City in := &dt.Msg{} db, err := core.ConnectDB("") if err != nil { t.Fatal(err) } in.Sentence = "I'm in New York" in.Tokens = core.TokenizeSentence(in.Sentence) in.Stems = core.StemTokens(in.Tokens) cities, err = ExtractCities(db, in) if err != nil { t.Fatal(err) } if len(cities) == 0 { t.Fatal(errors.New("expected New York, extracted none")) } if cities[0].Name != "New York" { t.Fatal(fmt.Errorf("expected New York, extracted %s", cities[0].Name)) } in = &dt.Msg{} in.Sentence = "I'm in LA or San Francisco next week" in.Tokens = core.TokenizeSentence(in.Sentence) in.Stems = core.StemTokens(in.Tokens) cities, err = ExtractCities(db, in) if err != nil { t.Fatal(err) } if len(cities) < 2 { t.Fatal(fmt.Errorf("expected >2 cities, but got %d\n", len(cities))) } in = &dt.Msg{} in.Sentence = "What's the weather like in San Francisco?" in.Tokens = core.TokenizeSentence(in.Sentence) in.Stems = core.StemTokens(in.Tokens) cities, err = ExtractCities(db, in) if err != nil { t.Fatal(err) } if len(cities) == 0 { t.Fatal(fmt.Errorf("expected San Francisco, extracted none")) } if cities[0].Name != "San Francisco" { t.Fatal(fmt.Errorf("expected San Francisco, extracted %s", cities[0].Name)) } }
// New builds a Plugin with its trigger, RPC, and configuration settings from // its plugin.json. func New(url string) (*dt.Plugin, error) { if err := core.LoadEnvVars(); err != nil { log.Fatal(err) } db, err := core.ConnectDB("") if err != nil { return nil, err } // Read plugin.json data from within plugins.go, unmarshal into struct c := dt.PluginConfig{} if len(os.Getenv("ABOT_PATH")) > 0 { p := filepath.Join(os.Getenv("ABOT_PATH"), "plugins.go") var scn *bufio.Scanner fi, err := os.OpenFile(p, os.O_RDONLY, 0666) if os.IsNotExist(err) { goto makePlugin } if err != nil { return nil, err } defer func() { if err = fi.Close(); err != nil { log.Info("failed to close file", fi.Name()) return } }() var found bool var data string scn = bufio.NewScanner(fi) for scn.Scan() { t := scn.Text() if !found && t != url { continue } else if t == url { found = true continue } else if len(t) >= 1 && t[0] == '}' { data += t break } data += t } if err = scn.Err(); err != nil { return nil, err } if len(data) > 0 { if err = json.Unmarshal([]byte(data), &c); err != nil { return nil, err } if len(c.Name) == 0 { return nil, ErrMissingPluginName } } } makePlugin: l := log.New(c.Name) l.SetDebug(os.Getenv("ABOT_DEBUG") == "true") plg := &dt.Plugin{ Trigger: &dt.StructuredInput{}, SetBranches: func(in *dt.Msg) [][]dt.State { return nil }, Events: &dt.PluginEvents{ PostReceive: func(cmd *string) {}, PreProcessing: func(cmd *string, u *dt.User) {}, PostProcessing: func(in *dt.Msg) {}, PreResponse: func(in *dt.Msg, resp *string) {}, }, Config: c, DB: db, Log: l, } plg.SM = dt.NewStateMachine(plg) return plg, nil }