{"action":"created","comment":{"url":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/comments/333679535","pull_request_review_id":300278221,"id":333679535,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMzMzY3OTUzNQ==","diff_hunk":"@@ -0,0 +1,242 @@\n+#pragma once\n+\n+#include <string>\n+#include <variant>\n+#include <vector>\n+\n+#include \"software/util/parameter/parameter.h\"\n+\n+class Config;\n+class MutableConfig;\n+\n+// A ParameterVariant is a variant of shared_ptrs of parameters of int/bool/double/string\n+// or to a Config object which is a collection of parameters or configs iteslf.\n+// TODO explain better, but for now, please take a look the the example below\n+using ParameterVariant =\n+    std::variant<std::shared_ptr<Parameter<int>>, std::shared_ptr<Parameter<bool>>,\n+                 std::shared_ptr<Parameter<double>>,\n+                 std::shared_ptr<Parameter<std::string>>, std::shared_ptr<MutableConfig>>;\n+\n+using ParameterList = std::vector<ParameterVariant>;\n+\n+/* Config Class\n+ *\n+ * Pure virtual class used to represent a collection of\n+ * params and/or configs. This class does NOT expose non-const\n+ * functions of underlying members, and is how all plays/tactics/etc should\n+ * access parameters. Only the visualizer or any other part of our AI that\n+ * is allowed to change the values should use the MutableConfig\n+ */\n+class Config\n+{\n+   public:\n+    /* Pure virtual destructor */\n+    virtual ~Config() = 0;\n+\n+    /*\n+     * Returns the name of the config\n+     *\n+     * returns std::string The name of the configuration\n+     */\n+    virtual std::string name() = 0;\n+\n+    /*\n+     * Returns a const reference to the internal ParameterList\n+     *\n+     * returns const ParameterList& The parameter lists\n+     */\n+    virtual const ParameterList& getParameterList() = 0;\n+};\n+\n+Config::~Config() {}\n+\n+/*\n+ * Mutable Config Class\n+ *\n+ * Extends config to provide non-const functions, allows the parameter values to be\n+ * set to be set.\n+ *\n+ */\n+class MutableConfig : public Config\n+{\n+   public:\n+    /* Pure virtual destructor */\n+    virtual ~MutableConfig() = 0;\n+\n+    /*\n+     * Returns a const reference to the internal ParameterList\n+     *\n+     * returns const ParameterList& The parameter lists\n+     */\n+    virtual ParameterList& getMutableParameterList() = 0;\n+};\n+\n+MutableConfig::~MutableConfig() {}\n+\n+\n+///////////////////////////////////////////////////\n+//          AUTO-GENERATED TEST CONFGS           //\n+///////////////////////////////////////////////////\n+// These will eventually be autogenerated\n+// The example hierarchy:\n+//\n+// GlobalQualityConfig:\n+//       FriendlyEvalConfig\n+//           weSuck\n+//           weHaveNoChill\n+//       EnemyEvalConfig\n+//           enemySucks\n+//           enemyHasNoChill\n+//       everyoneSucks\n+//\n+// These are just stupid parameters/configs so you get an idea\n+// For now the convention is, anything that doesn't have Config at the end\n+// is a parameter\n+class FriendlyEvalConfig : public MutableConfig\n+{\n+   public:\n+    FriendlyEvalConfig()\n+    {\n+        we_suck_param = std::make_shared<Parameter<bool>>(\n+            \"we_suck\", \"should_we_still_have_namespaces\", false);\n+        we_have_no_chill_param = std::make_shared<Parameter<bool>>(\n+            \"we_have_no_chill\", \"should_we_still_have_namespaces\", false);\n+\n+        internal_param_list = {we_have_no_chill_param, we_suck_param};\n+    }\n+\n+    ~FriendlyEvalConfig() {}\n+\n+    const std::shared_ptr<Parameter<bool>> weSuck()\n+    {\n+        return we_suck_param;\n+    }\n+\n+\n+    const std::shared_ptr<Parameter<bool>> weHaveNoChill()\n+    {\n+        return we_have_no_chill_param;\n+    }\n+\n+    std::string name()\n+    {\n+        return \"TestConfigA\";\n+    }\n+\n+    ParameterList& getMutableParameterList()\n+    {\n+        return internal_param_list;\n+    }\n+\n+    const ParameterList& getParameterList()\n+    {\n+        return internal_param_list;\n+    }\n+\n+   private:\n+    ParameterList internal_param_list;\n+    std::shared_ptr<Parameter<bool>> we_suck_param;\n+    std::shared_ptr<Parameter<bool>> we_have_no_chill_param;\n+};\n+\n+\n+class EnemyEvalConfig : public MutableConfig\n+{\n+   public:\n+    EnemyEvalConfig()\n+    {\n+        // The parameters are initialized in the constructor\n+        enemy_team_sucks_param = std::make_shared<Parameter<bool>>(\n+            \"enemy_team_sucks\", \"should_we_still_have_namespaces\", true);\n+        enemy_team_has_no_chill_param = std::make_shared<Parameter<bool>>(\n+            \"enemy_team_has_no_chill\", \"should_we_still_have_namespaces\", true);\n+\n+        internal_param_list = {enemy_team_sucks_param, enemy_team_has_no_chill_param};\n+    }\n+\n+    ~EnemyEvalConfig() {}\n+\n+    const std::shared_ptr<Parameter<bool>> enemyTeamSucks()\n+    {\n+        return enemy_team_sucks_param;\n+    }\n+\n+    const std::shared_ptr<Parameter<bool>> enemyTeamHasNoChill()\n+    {\n+        return enemy_team_has_no_chill_param;\n+    }\n+\n+    std::string name()\n+    {\n+        return \"enemyEvalConfig\";\n+    }\n+\n+    ParameterList& getMutableParameterList()\n+    {\n+        return internal_param_list;\n+    }\n+\n+    const ParameterList& getParameterList()\n+    {\n+        return internal_param_list;\n+    }\n+\n+   private:\n+    ParameterList internal_param_list;\n+    std::shared_ptr<Parameter<bool>> enemy_team_sucks_param;\n+    std::shared_ptr<Parameter<bool>> enemy_team_has_no_chill_param;\n+};\n+\n+\n+class GlobalQualityConfig : public MutableConfig\n+{\n+   public:\n+    GlobalQualityConfig()\n+    {\n+        // The parameters are initialized in the constructor\n+        everyone_sucks_param = std::make_shared<Parameter<bool>>(\n+            \"everyone_sucks\", \"should_we_still_have_namespaces\", true);\n+\n+        friendly_eval_config = std::make_shared<FriendlyEvalConfig>();\n+        enemy_eval_config    = std::make_shared<EnemyEvalConfig>();\n+\n+        internal_param_list = {everyone_sucks_param, friendly_eval_config,\n+                               enemy_eval_config};\n+    }\n+\n+    const std::shared_ptr<Parameter<bool>> everyoneSucks()\n+    {\n+        return everyone_sucks_param;\n+    }\n+\n+    const std::shared_ptr<FriendlyEvalConfig> getFriendlyEvalConfig()\n+    {\n+        return friendly_eval_config;","path":"src/software/util/parameter/config.hpp","position":241,"original_position":214,"commit_id":"05d09329e60de5f481cb1ab63683308ecae5ace0","original_commit_id":"43a834c2af047767b34c3d6a4c4d66f86aae2415","user":{"login":"akhilveeraghanta","id":31548846,"node_id":"MDQ6VXNlcjMxNTQ4ODQ2","avatar_url":"https://avatars0.githubusercontent.com/u/31548846?v=4","gravatar_id":"","url":"https://api.github.com/users/akhilveeraghanta","html_url":"https://github.com/akhilveeraghanta","followers_url":"https://api.github.com/users/akhilveeraghanta/followers","following_url":"https://api.github.com/users/akhilveeraghanta/following{/other_user}","gists_url":"https://api.github.com/users/akhilveeraghanta/gists{/gist_id}","starred_url":"https://api.github.com/users/akhilveeraghanta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akhilveeraghanta/subscriptions","organizations_url":"https://api.github.com/users/akhilveeraghanta/orgs","repos_url":"https://api.github.com/users/akhilveeraghanta/repos","events_url":"https://api.github.com/users/akhilveeraghanta/events{/privacy}","received_events_url":"https://api.github.com/users/akhilveeraghanta/received_events","type":"User","site_admin":false},"body":"If we need this, we would have to separate them into `AIConfigured` and `visualizerConfigurable` for example to specify which ones we set and which ones the AI will set (assuming we don't want AI/Visualizer setting the same params) and then we could update the play that tunes params to get a mutable `AIConfigured`  instance (which the visuzlier will get an immutable version of to just inspect the values). Is this along the lines of what you are thinking?\r\n\r\nWe are going to be adding/update a lot of plays and tactics, might as well support this feature if its immediately useful.","created_at":"2019-10-10T18:46:35Z","updated_at":"2019-10-10T18:46:35Z","html_url":"https://github.com/UBC-Thunderbots/Software/pull/866#discussion_r333679535","pull_request_url":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/866","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/comments/333679535"},"html":{"href":"https://github.com/UBC-Thunderbots/Software/pull/866#discussion_r333679535"},"pull_request":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/866"}},"in_reply_to_id":333145225},"pull_request":{"url":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/866","id":324988932,"node_id":"MDExOlB1bGxSZXF1ZXN0MzI0OTg4OTMy","html_url":"https://github.com/UBC-Thunderbots/Software/pull/866","diff_url":"https://github.com/UBC-Thunderbots/Software/pull/866.diff","patch_url":"https://github.com/UBC-Thunderbots/Software/pull/866.patch","issue_url":"https://api.github.com/repos/UBC-Thunderbots/Software/issues/866","number":866,"state":"open","locked":false,"title":"(WIP) Dynamic Parameters v2","user":{"login":"akhilveeraghanta","id":31548846,"node_id":"MDQ6VXNlcjMxNTQ4ODQ2","avatar_url":"https://avatars0.githubusercontent.com/u/31548846?v=4","gravatar_id":"","url":"https://api.github.com/users/akhilveeraghanta","html_url":"https://github.com/akhilveeraghanta","followers_url":"https://api.github.com/users/akhilveeraghanta/followers","following_url":"https://api.github.com/users/akhilveeraghanta/following{/other_user}","gists_url":"https://api.github.com/users/akhilveeraghanta/gists{/gist_id}","starred_url":"https://api.github.com/users/akhilveeraghanta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akhilveeraghanta/subscriptions","organizations_url":"https://api.github.com/users/akhilveeraghanta/orgs","repos_url":"https://api.github.com/users/akhilveeraghanta/repos","events_url":"https://api.github.com/users/akhilveeraghanta/events{/privacy}","received_events_url":"https://api.github.com/users/akhilveeraghanta/received_events","type":"User","site_admin":false},"body":"This is sort of a suuper work in progress DynamicParameters v2 PR, all the classes in `config.hpp` (excluding Config and MutableConfig) which will eventually be autogenerated. Just want to get some eyes on this PR with any concerns/comments before I write the generate scripts and unit tests.\r\n\r\n https://github.com/UBC-Thunderbots/Software/pull/866/files\r\n\r\nPlease leave a comment/msg me if anything doesn’t make sense. I tried to add comments explaining most of the stuff but its still a WIP, so its pretty messy.\r\n\r\nHere is the corresponding psuedo-design doc (sort of), just has some stuff of what our previous system looked like, and what we are moving to:\r\nhttps://docs.google.com/document/d/1MX824V1DC7oCQixdbVqfsLsnR9JzGFPCrLycQDi0uNE/edit?usp=sharing","created_at":"2019-10-06T00:35:09Z","updated_at":"2019-10-10T18:46:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0f0ca82f99efe35108beb7fecbf4a43971ed621d","assignee":null,"assignees":[],"requested_reviewers":[{"login":"MathewMacDougall","id":21165407,"node_id":"MDQ6VXNlcjIxMTY1NDA3","avatar_url":"https://avatars0.githubusercontent.com/u/21165407?v=4","gravatar_id":"","url":"https://api.github.com/users/MathewMacDougall","html_url":"https://github.com/MathewMacDougall","followers_url":"https://api.github.com/users/MathewMacDougall/followers","following_url":"https://api.github.com/users/MathewMacDougall/following{/other_user}","gists_url":"https://api.github.com/users/MathewMacDougall/gists{/gist_id}","starred_url":"https://api.github.com/users/MathewMacDougall/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MathewMacDougall/subscriptions","organizations_url":"https://api.github.com/users/MathewMacDougall/orgs","repos_url":"https://api.github.com/users/MathewMacDougall/repos","events_url":"https://api.github.com/users/MathewMacDougall/events{/privacy}","received_events_url":"https://api.github.com/users/MathewMacDougall/received_events","type":"User","site_admin":false},{"login":"EvanMorcom","id":25271038,"node_id":"MDQ6VXNlcjI1MjcxMDM4","avatar_url":"https://avatars0.githubusercontent.com/u/25271038?v=4","gravatar_id":"","url":"https://api.github.com/users/EvanMorcom","html_url":"https://github.com/EvanMorcom","followers_url":"https://api.github.com/users/EvanMorcom/followers","following_url":"https://api.github.com/users/EvanMorcom/following{/other_user}","gists_url":"https://api.github.com/users/EvanMorcom/gists{/gist_id}","starred_url":"https://api.github.com/users/EvanMorcom/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EvanMorcom/subscriptions","organizations_url":"https://api.github.com/users/EvanMorcom/orgs","repos_url":"https://api.github.com/users/EvanMorcom/repos","events_url":"https://api.github.com/users/EvanMorcom/events{/privacy}","received_events_url":"https://api.github.com/users/EvanMorcom/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/866/commits","review_comments_url":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/866/comments","review_comment_url":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/comments{/number}","comments_url":"https://api.github.com/repos/UBC-Thunderbots/Software/issues/866/comments","statuses_url":"https://api.github.com/repos/UBC-Thunderbots/Software/statuses/05d09329e60de5f481cb1ab63683308ecae5ace0","head":{"label":"akhilveeraghanta:dynamic-parameters-v2","ref":"dynamic-parameters-v2","sha":"05d09329e60de5f481cb1ab63683308ecae5ace0","user":{"login":"akhilveeraghanta","id":31548846,"node_id":"MDQ6VXNlcjMxNTQ4ODQ2","avatar_url":"https://avatars0.githubusercontent.com/u/31548846?v=4","gravatar_id":"","url":"https://api.github.com/users/akhilveeraghanta","html_url":"https://github.com/akhilveeraghanta","followers_url":"https://api.github.com/users/akhilveeraghanta/followers","following_url":"https://api.github.com/users/akhilveeraghanta/following{/other_user}","gists_url":"https://api.github.com/users/akhilveeraghanta/gists{/gist_id}","starred_url":"https://api.github.com/users/akhilveeraghanta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akhilveeraghanta/subscriptions","organizations_url":"https://api.github.com/users/akhilveeraghanta/orgs","repos_url":"https://api.github.com/users/akhilveeraghanta/repos","events_url":"https://api.github.com/users/akhilveeraghanta/events{/privacy}","received_events_url":"https://api.github.com/users/akhilveeraghanta/received_events","type":"User","site_admin":false},"repo":{"id":146306747,"node_id":"MDEwOlJlcG9zaXRvcnkxNDYzMDY3NDc=","name":"Software","full_name":"akhilveeraghanta/Software","private":false,"owner":{"login":"akhilveeraghanta","id":31548846,"node_id":"MDQ6VXNlcjMxNTQ4ODQ2","avatar_url":"https://avatars0.githubusercontent.com/u/31548846?v=4","gravatar_id":"","url":"https://api.github.com/users/akhilveeraghanta","html_url":"https://github.com/akhilveeraghanta","followers_url":"https://api.github.com/users/akhilveeraghanta/followers","following_url":"https://api.github.com/users/akhilveeraghanta/following{/other_user}","gists_url":"https://api.github.com/users/akhilveeraghanta/gists{/gist_id}","starred_url":"https://api.github.com/users/akhilveeraghanta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akhilveeraghanta/subscriptions","organizations_url":"https://api.github.com/users/akhilveeraghanta/orgs","repos_url":"https://api.github.com/users/akhilveeraghanta/repos","events_url":"https://api.github.com/users/akhilveeraghanta/events{/privacy}","received_events_url":"https://api.github.com/users/akhilveeraghanta/received_events","type":"User","site_admin":false},"html_url":"https://github.com/akhilveeraghanta/Software","description":null,"fork":true,"url":"https://api.github.com/repos/akhilveeraghanta/Software","forks_url":"https://api.github.com/repos/akhilveeraghanta/Software/forks","keys_url":"https://api.github.com/repos/akhilveeraghanta/Software/keys{/key_id}","collaborators_url":"https://api.github.com/repos/akhilveeraghanta/Software/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/akhilveeraghanta/Software/teams","hooks_url":"https://api.github.com/repos/akhilveeraghanta/Software/hooks","issue_events_url":"https://api.github.com/repos/akhilveeraghanta/Software/issues/events{/number}","events_url":"https://api.github.com/repos/akhilveeraghanta/Software/events","assignees_url":"https://api.github.com/repos/akhilveeraghanta/Software/assignees{/user}","branches_url":"https://api.github.com/repos/akhilveeraghanta/Software/branches{/branch}","tags_url":"https://api.github.com/repos/akhilveeraghanta/Software/tags","blobs_url":"https://api.github.com/repos/akhilveeraghanta/Software/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/akhilveeraghanta/Software/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/akhilveeraghanta/Software/git/refs{/sha}","trees_url":"https://api.github.com/repos/akhilveeraghanta/Software/git/trees{/sha}","statuses_url":"https://api.github.com/repos/akhilveeraghanta/Software/statuses/{sha}","languages_url":"https://api.github.com/repos/akhilveeraghanta/Software/languages","stargazers_url":"https://api.github.com/repos/akhilveeraghanta/Software/stargazers","contributors_url":"https://api.github.com/repos/akhilveeraghanta/Software/contributors","subscribers_url":"https://api.github.com/repos/akhilveeraghanta/Software/subscribers","subscription_url":"https://api.github.com/repos/akhilveeraghanta/Software/subscription","commits_url":"https://api.github.com/repos/akhilveeraghanta/Software/commits{/sha}","git_commits_url":"https://api.github.com/repos/akhilveeraghanta/Software/git/commits{/sha}","comments_url":"https://api.github.com/repos/akhilveeraghanta/Software/comments{/number}","issue_comment_url":"https://api.github.com/repos/akhilveeraghanta/Software/issues/comments{/number}","contents_url":"https://api.github.com/repos/akhilveeraghanta/Software/contents/{+path}","compare_url":"https://api.github.com/repos/akhilveeraghanta/Software/compare/{base}...{head}","merges_url":"https://api.github.com/repos/akhilveeraghanta/Software/merges","archive_url":"https://api.github.com/repos/akhilveeraghanta/Software/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/akhilveeraghanta/Software/downloads","issues_url":"https://api.github.com/repos/akhilveeraghanta/Software/issues{/number}","pulls_url":"https://api.github.com/repos/akhilveeraghanta/Software/pulls{/number}","milestones_url":"https://api.github.com/repos/akhilveeraghanta/Software/milestones{/number}","notifications_url":"https://api.github.com/repos/akhilveeraghanta/Software/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/akhilveeraghanta/Software/labels{/name}","releases_url":"https://api.github.com/repos/akhilveeraghanta/Software/releases{/id}","deployments_url":"https://api.github.com/repos/akhilveeraghanta/Software/deployments","created_at":"2018-08-27T14:11:08Z","updated_at":"2019-04-28T04:46:59Z","pushed_at":"2019-10-10T04:01:16Z","git_url":"git://github.com/akhilveeraghanta/Software.git","ssh_url":"git@github.com:akhilveeraghanta/Software.git","clone_url":"https://github.com/akhilveeraghanta/Software.git","svn_url":"https://github.com/akhilveeraghanta/Software","homepage":null,"size":40178,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"UBC-Thunderbots:master","ref":"master","sha":"4edb7d5dc1333eb20c64c96930d7185b784ec6a4","user":{"login":"UBC-Thunderbots","id":27097762,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI3MDk3NzYy","avatar_url":"https://avatars1.githubusercontent.com/u/27097762?v=4","gravatar_id":"","url":"https://api.github.com/users/UBC-Thunderbots","html_url":"https://github.com/UBC-Thunderbots","followers_url":"https://api.github.com/users/UBC-Thunderbots/followers","following_url":"https://api.github.com/users/UBC-Thunderbots/following{/other_user}","gists_url":"https://api.github.com/users/UBC-Thunderbots/gists{/gist_id}","starred_url":"https://api.github.com/users/UBC-Thunderbots/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UBC-Thunderbots/subscriptions","organizations_url":"https://api.github.com/users/UBC-Thunderbots/orgs","repos_url":"https://api.github.com/users/UBC-Thunderbots/repos","events_url":"https://api.github.com/users/UBC-Thunderbots/events{/privacy}","received_events_url":"https://api.github.com/users/UBC-Thunderbots/received_events","type":"Organization","site_admin":false},"repo":{"id":141040516,"node_id":"MDEwOlJlcG9zaXRvcnkxNDEwNDA1MTY=","name":"Software","full_name":"UBC-Thunderbots/Software","private":false,"owner":{"login":"UBC-Thunderbots","id":27097762,"node_id":"MDEyOk9yZ2FuaXphdGlvbjI3MDk3NzYy","avatar_url":"https://avatars1.githubusercontent.com/u/27097762?v=4","gravatar_id":"","url":"https://api.github.com/users/UBC-Thunderbots","html_url":"https://github.com/UBC-Thunderbots","followers_url":"https://api.github.com/users/UBC-Thunderbots/followers","following_url":"https://api.github.com/users/UBC-Thunderbots/following{/other_user}","gists_url":"https://api.github.com/users/UBC-Thunderbots/gists{/gist_id}","starred_url":"https://api.github.com/users/UBC-Thunderbots/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/UBC-Thunderbots/subscriptions","organizations_url":"https://api.github.com/users/UBC-Thunderbots/orgs","repos_url":"https://api.github.com/users/UBC-Thunderbots/repos","events_url":"https://api.github.com/users/UBC-Thunderbots/events{/privacy}","received_events_url":"https://api.github.com/users/UBC-Thunderbots/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/UBC-Thunderbots/Software","description":"Robot Soccer Playing AI","fork":false,"url":"https://api.github.com/repos/UBC-Thunderbots/Software","forks_url":"https://api.github.com/repos/UBC-Thunderbots/Software/forks","keys_url":"https://api.github.com/repos/UBC-Thunderbots/Software/keys{/key_id}","collaborators_url":"https://api.github.com/repos/UBC-Thunderbots/Software/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/UBC-Thunderbots/Software/teams","hooks_url":"https://api.github.com/repos/UBC-Thunderbots/Software/hooks","issue_events_url":"https://api.github.com/repos/UBC-Thunderbots/Software/issues/events{/number}","events_url":"https://api.github.com/repos/UBC-Thunderbots/Software/events","assignees_url":"https://api.github.com/repos/UBC-Thunderbots/Software/assignees{/user}","branches_url":"https://api.github.com/repos/UBC-Thunderbots/Software/branches{/branch}","tags_url":"https://api.github.com/repos/UBC-Thunderbots/Software/tags","blobs_url":"https://api.github.com/repos/UBC-Thunderbots/Software/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/UBC-Thunderbots/Software/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/UBC-Thunderbots/Software/git/refs{/sha}","trees_url":"https://api.github.com/repos/UBC-Thunderbots/Software/git/trees{/sha}","statuses_url":"https://api.github.com/repos/UBC-Thunderbots/Software/statuses/{sha}","languages_url":"https://api.github.com/repos/UBC-Thunderbots/Software/languages","stargazers_url":"https://api.github.com/repos/UBC-Thunderbots/Software/stargazers","contributors_url":"https://api.github.com/repos/UBC-Thunderbots/Software/contributors","subscribers_url":"https://api.github.com/repos/UBC-Thunderbots/Software/subscribers","subscription_url":"https://api.github.com/repos/UBC-Thunderbots/Software/subscription","commits_url":"https://api.github.com/repos/UBC-Thunderbots/Software/commits{/sha}","git_commits_url":"https://api.github.com/repos/UBC-Thunderbots/Software/git/commits{/sha}","comments_url":"https://api.github.com/repos/UBC-Thunderbots/Software/comments{/number}","issue_comment_url":"https://api.github.com/repos/UBC-Thunderbots/Software/issues/comments{/number}","contents_url":"https://api.github.com/repos/UBC-Thunderbots/Software/contents/{+path}","compare_url":"https://api.github.com/repos/UBC-Thunderbots/Software/compare/{base}...{head}","merges_url":"https://api.github.com/repos/UBC-Thunderbots/Software/merges","archive_url":"https://api.github.com/repos/UBC-Thunderbots/Software/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/UBC-Thunderbots/Software/downloads","issues_url":"https://api.github.com/repos/UBC-Thunderbots/Software/issues{/number}","pulls_url":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls{/number}","milestones_url":"https://api.github.com/repos/UBC-Thunderbots/Software/milestones{/number}","notifications_url":"https://api.github.com/repos/UBC-Thunderbots/Software/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/UBC-Thunderbots/Software/labels{/name}","releases_url":"https://api.github.com/repos/UBC-Thunderbots/Software/releases{/id}","deployments_url":"https://api.github.com/repos/UBC-Thunderbots/Software/deployments","created_at":"2018-07-15T16:06:15Z","updated_at":"2019-10-10T18:34:01Z","pushed_at":"2019-10-10T18:33:59Z","git_url":"git://github.com/UBC-Thunderbots/Software.git","ssh_url":"git@github.com:UBC-Thunderbots/Software.git","clone_url":"https://github.com/UBC-Thunderbots/Software.git","svn_url":"https://github.com/UBC-Thunderbots/Software","homepage":"http://www.ubcthunderbots.ca","size":40156,"stargazers_count":10,"watchers_count":10,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":34,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":117,"license":{"key":"lgpl-3.0","name":"GNU Lesser General Public License v3.0","spdx_id":"LGPL-3.0","url":"https://api.github.com/licenses/lgpl-3.0","node_id":"MDc6TGljZW5zZTEy"},"forks":34,"open_issues":117,"watchers":10,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/866"},"html":{"href":"https://github.com/UBC-Thunderbots/Software/pull/866"},"issue":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/issues/866"},"comments":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/issues/866/comments"},"review_comments":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/866/comments"},"review_comment":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/pulls/866/commits"},"statuses":{"href":"https://api.github.com/repos/UBC-Thunderbots/Software/statuses/05d09329e60de5f481cb1ab63683308ecae5ace0"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"akhilveeraghanta"}}