aboutsummaryrefslogtreecommitdiffstats
path: root/main.go
AgeCommit message (Collapse)Author
2017-06-03Create a new Project typeTeddy Wing
This corresponds to a "project" entry in the new config2.toml file. (See 13c84cd9973458750305c72a919cf921d9b22b04). Instead of decoding generic `interface{}`s as projects from the TOML, make them a real type. The reason why we're using `int`s where we used to use strings is that the new TOML format will have users write IDs directly in the config file, instead of having the program automatically search for those IDs and use them as we had previously designed. Maybe we'll bring that functionality back at some point, but for now it's too bothersome to implement and I don't consider it worth the trouble.
2017-06-03Comment out all the things!Teddy Wing
Half get rid of a lot of code. I don't like and don't want to use our old field types. Get rid of them and the code in 'http.go' that depends on them. Also get rid of the time entry submission code in 'main.go' as that's going to be redone.
2017-06-03main.go: Cleanup from 13c84cd9973458750305c72a919cf921d9b22b04Teddy Wing
* Get rid of the 'yaml' import since we're now using 'toml' instead. * Get rid of commented code that's no longer relevant. * Get rid of test code that checked that the config loaded correctly.
2017-06-03main.go: Read config from a new format TOML fileTeddy Wing
Construct a new config format, written in TOML. Read that format in when starting the program. This new format has the benefit of using project name aliases as keys. The goal will be to allow users to send one of those aliases as a command line argument to the program, and thus to have the program post a TimeTask entry for that project. Here's an idea of what the new format looks like: [auth] username = "example" password_cmd = "" [projects.myprojectalias] client = ... project = ... module = ... task = ... work_type = ... time = 7 billable = true [projects.project2] client = ... project = ... module = ... task = ... work_type = ... time = 7 billable = true Eventually, we'll need to remove the `interface{}` from the `Projects` map value and replace it with a real type, but this was just to test that it was possible to get us a nice map from the TOML.
2017-03-19main.go: Change import to use `github.com` URLTeddy Wing
Use a GitHub path instead of my custom project path to allow us to publish the project.
2017-03-12Add GenerateWeeklyTimesheet()Teddy Wing
A function to generate a weekly time sheet. Add a new `defaults` key to the config.yml file. Looks like this: defaults: client: project: module: task: work_type: time: billable: This will be used to fill in default values when a timesheet is generated.
2017-03-12main.go: Check the output of `buildSubmissionParams`Teddy Wing
2017-03-12Make fields named structsTeddy Wing
We'll be needing to refer to these fields as named types, so create types for them and reference them in the config object.
2017-03-12Parse timesheet filesTeddy Wing
Expect a timesheet file as the last argument to the program. Parse the contents into `TimeEntry` objects. `TimeEntry`ies will then be able to be POSTed to Time Task to submit times. The time entries input file is a YAML document in this format: - client: A client project: A project module: A module task: A task work_type: type date: 2017-03-06 time: 7 billable: true description: It contains an array where each element is a time entry. Had a lot of trouble parsing the date into a `time.Time`. Finally realised that my first and biggest problem was somehow I was importing `yaml.v1` instead of `yaml.v2`, and thus my `UnmarshalYAML` function was never getting called. Wanted a way to get the time as a string and parse it myself into a time. At first tried using an `UnmarshalText` function: type Time time.Time func (t *Time) UnmarshalText(text []byte) error { parsed, err := time.Parse("2006-01-02", string(text)) if err == nil { *t = Time(parsed) } return err } But in order to do that I had to make a type alias to `time.Time`. Doing so was not ideal, because then I'd have to convert my `Time` into a `time.Time` any time I wanted to use it for real. Ended up going with a suggestion from here: https://mlafeldt.github.io/blog/decoding-yaml-in-go/ Creating an auxiliary struct in `UnmarshalYAML` to unmarshal the date into a string and then parse it myself as a date. I don't really like it because it's a lot of ceremony just to parse one type myself, but can't come up with a better solution right now so there you have it.
2017-03-11main.go: Move config loading to a new functionTeddy Wing
* Extract the config loading lines from `main` so we can give them a name * Make `config` available globally
2017-03-11Add main.go with configurationTeddy Wing
Set up a configuration object which gets read from a YAML config file. Currently using an uncommitted test file that looks like this (with some data filled in: auth: username: password_cmd: fields: person_id: clients: - id: name: projects: - id: name: modules: - id: name: tasks: - id: name: work_types: - id: name: The program just outputs the config object so I can see whether it's working. The data will then be used to associate ids for time submission.