{"action":"created","comment":{"url":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/comments/206815018","pull_request_review_id":142298469,"id":206815018,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNjgxNTAxOA==","diff_hunk":"@@ -0,0 +1,854 @@\n+{\n+  title: \"SuccessFactors\",\n+\n+  secure_tunnel: true,\n+\n+  connection: {\n+    fields: [\n+      {\n+        name: \"username\",\n+        optional: false\n+      },\n+      {\n+        name: \"password\",\n+        control_type: \"password\",\n+        optional: false\n+      },\n+      {\n+        name: \"company\",\n+        label: \"Company ID\",\n+        optional: false\n+      },\n+      {\n+        name: \"endpoint\",\n+        label: \"API endpoint\",\n+        optional: false,\n+        hint: \"Provide the endpoint of the API excluding /odata/v2 \" \\\n+          \"e.g. for location USA, Arizona, Chandler \" \\\n+          \"- <code>https://api4.successfactors.com</code>\"\n+      }\n+    ],\n+\n+    authorization: {\n+      type: \"basic_auth\",\n+\n+      credentials: lambda do |connection|\n+        user(\"#{connection['username']}@#{connection['company']}\")\n+        password(\"#{connection['password']}\")\n+      end\n+    },\n+\n+    base_uri: lambda do |connection|\n+      \"#{connection['endpoint']}\"\n+    end\n+  },\n+\n+  object_definitions: {\n+    object_output: {\n+      fields: lambda do |_connection, config|\n+        columns = get(\"/odata/v2/#{config['object_name']}/$metadata\").\n+                  response_format_xml.\n+                  dig(\"edmx:Edmx\", 0, \"edmx:DataServices\", 0, \"Schema\", 1,\n+                    \"EntityType\", 0, \"Property\").\n+                  select { |field| field[\"@visible\"] == \"true\" }.\n+                  map do |o|\n+                    case o[\"@Type\"]\n+                    when \"Edm.String\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Boolean\"\n+                      { name: o[\"@Name\"], type: \"boolean\",\n+                        control_type: \"checkbox\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Byte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTime\"\n+                      { name: o[\"@Name\"], type: \"date_time\",\n+                        control_type: \"date_time\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Decimal\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Double\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Single\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Guid\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int16\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int32\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int64\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.SByte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Time\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTimeOffset\"\n+                      { name: o[\"@Name\"], type: \"date_time\",\n+                        control_type: \"date_time\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    else\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    end\n+                  end\n+        columns\n+      end\n+    },\n+\n+    object_create: {\n+      fields: lambda do |_connection, config|\n+        columns = get(\"/odata/v2/#{config['object_name']}/$metadata\").\n+                  response_format_xml.\n+                  dig(\"edmx:Edmx\", 0, \"edmx:DataServices\", 0, \"Schema\", 1,\n+                    \"EntityType\", 0, \"Property\").\n+                  select { |field| field[\"@creatable\"] == \"true\" }.\n+                  map do |o|\n+                    case o[\"@Type\"]\n+                    when \"Edm.String\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Boolean\"\n+                      { name: o[\"@Name\"], type: \"boolean\",\n+                        control_type: \"checkbox\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Byte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTime\"\n+                      { name: o[\"@Name\"], type: \"date_time\",\n+                        control_type: \"date_time\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Decimal\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Double\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Single\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Guid\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int16\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int32\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int64\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.SByte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Time\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTimeOffset\"\n+                      { name: o[\"@Name\"], type: \"timestamp\",\n+                        control_type: \"date_time\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    else\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    end\n+                  end\n+        columns\n+      end\n+    },\n+\n+    object_update: {\n+      fields: lambda do |_connection, config|\n+        key_column = call(:object_key, {object_name: config['object_name']})\n+        columns = get(\"/odata/v2/#{config['object_name']}/$metadata\").\n+                  response_format_xml.\n+                  dig(\"edmx:Edmx\", 0, \"edmx:DataServices\", 0, \"Schema\", 1,\n+                    \"EntityType\", 0, \"Property\").\n+                  select{ |field| field[\"@updatable\"] == \"true\" }.\n+                  map do |o|\n+                    optional =\n+                      if o[\"@Name\"] == key_column\n+                        false\n+                      else\n+                        o[\"@required\"].include?(\"false\")\n+                      end\n+                    case o[\"@Type\"]\n+                    when \"Edm.String\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Boolean\"\n+                      { name: o[\"@Name\"], type: \"boolean\",\n+                        control_type: \"checkbox\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Byte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTime\"\n+                      { name: o[\"@Name\"], type: \"date_time\",\n+                        control_type: \"date_time\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize}\n+                    when \"Edm.Decimal\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Double\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Single\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Guid\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int16\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int32\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int64\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.SByte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Time\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTimeOffset\"\n+                      { name: o[\"@Name\"], type: \"timestamp\",\n+                        control_type: \"date_time\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    else\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: optional,\n+                        label:  o[\"@label\"].labelize }\n+                    end\n+                  end\n+        columns\n+      end\n+    },\n+\n+    object_upsert: {\n+      fields: lambda do |_connection, config|\n+        columns = get(\"/odata/v2/#{config['object_name']}/$metadata\").\n+                  response_format_xml.\n+                  dig(\"edmx:Edmx\", 0, \"edmx:DataServices\", 0, \"Schema\", 1,\n+                    \"EntityType\", 0, \"Property\").\n+                  select { |field| field[\"@upsertable\"] == \"true\" }.\n+                  map do |o|\n+                    case o[\"@Type\"]\n+                    when \"Edm.String\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Boolean\"\n+                      { name: o[\"@Name\"], type: \"boolean\",\n+                        control_type: \"checkbox\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Byte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTime\"\n+                      { name: o[\"@Name\"], type: \"date_time\",\n+                        control_type: \"date_time\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Decimal\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Double\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Single\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Guid\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int16\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int32\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int64\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.SByte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Time\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTimeOffset\"\n+                      { name: o[\"@Name\"], type: \"timestamp\",\n+                        control_type: \"date_time\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    else\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        optional: o[\"@required\"].include?(\"false\"),\n+                        label:  o[\"@label\"].labelize }\n+                    end\n+                  end\n+        columns\n+      end\n+    },\n+\n+    object_filter: {\n+      fields: lambda do |_connection, config|\n+        columns = get(\"/odata/v2/#{config['object_name']}/$metadata\").\n+                  response_format_xml.\n+                  dig(\"edmx:Edmx\", 0, \"edmx:DataServices\", 0, \"Schema\", 1,\n+                    \"EntityType\", 0, \"Property\").\n+                  select { |field| field[\"@filterable\"] == \"true\" }.\n+                  map do |o|\n+                    case o[\"@Type\"]\n+                    when \"Edm.String\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Boolean\"\n+                      { name: o[\"@Name\"], type: \"boolean\",\n+                        control_type: \"checkbox\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Byte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTime\"\n+                      { name: o[\"@Name\"], type: \"date_time\",\n+                        control_type: \"date_time\",\n+                        parse_output: \"\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Decimal\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Double\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Single\"\n+                      { name: o[\"@Name\"], type: \"number\",\n+                        control_type: \"number\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Guid\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int16\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int32\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Int64\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.SByte\"\n+                      { name: o[\"@Name\"], type: \"integer\",\n+                        control_type: \"number\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.Time\"\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        label:  o[\"@label\"].labelize }\n+                    when \"Edm.DateTimeOffset\"\n+                      { name: o[\"@Name\"], type: \"timestamp\",\n+                        control_type: \"date_time\",\n+                        label:  o[\"@label\"].labelize }\n+                    else\n+                      { name: o[\"@Name\"], type: \"string\",\n+                        label:  o[\"@label\"].labelize }\n+                    end\n+                  end\n+        columns\n+      end\n+    }\n+  },\n+\n+  test: lambda { |_connection|\n+    get(\"/odata/v2/User?$top=1\")\n+  },\n+\n+  methods: {\n+    date_fields: lambda do |input|\n+      get(\"/odata/v2/\" + input[:object_name] + \"/$metadata\").\n+        response_format_xml.\n+        dig(\"edmx:Edmx\", 0, \"edmx:DataServices\", 0, \"Schema\",\n+         1, \"EntityType\", 0, \"Property\").\n+        select do |field|\n+          [\"Edm.DateTime\", \"Edm.DateTimeOffset\"].include?(field[\"@Type\"])\n+        end.\n+        map { |e| e[\"@Name\"] }\n+    end,\n+\n+    object_key: lambda do |input|\n+      get(\"/odata/v2/\" + input[:object_name]  + \"/$metadata\").\n+        response_format_xml.\n+        dig(\"edmx:Edmx\", 0, \"edmx:DataServices\", 0, \"Schema\", 1,\n+          \"EntityType\", 0, \"Key\", 0, \"PropertyRef\")[0][\"@Name\"]\n+    end\n+  },\n+\n+  actions: {\n+    search_object: {\n+      description: \"Search <span class='provider'>objects</span> in \" \\\n+        \"<span class='provider'>SuccessFactors</span>\",\n+      subtitle: \"Search objects\",\n+\n+      config_fields: [\n+        { name: \"object_name\", control_type: :select,\n+          pick_list: :entity_set,\n+          label: \"Object\",\n+          hint: \"Select object to search for\",\n+          optional: false }\n+      ],\n+\n+      input_fields: lambda do |object_definitions|\n+        object_definitions[\"object_filter\"]\n+      end,\n+\n+      execute: lambda do |connection, input|\n+        object_name = input.delete(\"object_name\")\n+        error(\"Provide at least one search criteria\") if !input.present?\n+        date_fields = call(\"date_fields\", { object_name: object_name })\n+        filter_string = \"\"\n+        filter_params = []\n+        input.map do |key, val|\n+          if date_fields.include?(key)\n+            filter_params <<\n+              (key + \" eq '\" + \"/Date(\" + val + \")/\" + \"'\") unless !val.present?\n+          else\n+            filter_params << (key + \" eq '\" + val + \"'\") unless !val.present?\n+          end\n+        end\n+        filter_string = filter_params.smart_join(\" and \")\n+        objects = get(\"/odata/v2/\" + object_name + \"?$filter=\" + filter_string).\n+                  headers(\"Accept\": \"application/json\",\n+                          \"Content-Type\": \"application/json\").\n+                  dig(\"d\", \"results\")\n+        final_objects = objects.map do |obj|\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if value.present?\n+                date_time = value.scan(/\\d+/)[0] unless value.blank?\n+                { key => (date_time.to_i / 1000).to_i.to_time.utc.iso8601 }\n+              else\n+                { key => value }\n+              end\n+\n+            else\n+              { key => value }\n+            end\n+          end.inject(:merge)\n+        end\n+        {\n+          objects: final_objects\n+        }\n+      end,\n+\n+      output_fields: lambda do |object_definitions|\n+        [\n+          { name: \"objects\", type: \"array\", of: \"object\",\n+            properties: object_definitions[\"object_output\"] }\n+        ]\n+      end,\n+\n+      sample_output: lambda do |_connection, input|\n+        date_fields = call(:date_fields, object_name: input[\"object_name\"])\n+        objects = get(\"/odata/v2/\" + input[\"object_name\"]).\n+                  params(\"$top\": 1).\n+                  dig(\"d\", \"results\")\n+        final_objects = objects.map do |obj|\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if value.present?\n+                date_time = value.scan(/\\d+/)[0] unless value.blank?\n+                { key => (date_time.to_i / 1000).to_i.to_time.utc.iso8601 }\n+              else\n+                { key => value }\n+              end\n+            else\n+              { key => value }\n+            end\n+          end.inject(:merge)\n+        end\n+        final_objects&.first || {}\n+      end\n+    },\n+\n+    create_object: {\n+      description: \"Create <span class='provider'>Object</span> in \" \\\n+      \"<span class='provider'>SuccessFactors</span>\",\n+      subtitle: \"Create object in SuccessFactors\",\n+\n+      config_fields: [\n+        {\n+          name: \"object_name\", label: \"Object\",\n+          control_type: \"select\",\n+          pick_list: \"entity_set\",\n+          hint: \"Select object\",\n+          optional: false\n+        }\n+      ],\n+\n+      input_fields: lambda do |object_definitions|\n+        object_definitions[\"object_create\"]\n+      end,\n+\n+      execute: lambda do |_connection, input|\n+        object_name = input.delete(\"object_name\")\n+        # set empployee id on User creation\n+        if object_name == \"User\" && !input[\"empId\"].present?\n+          employee_id = post(\"/odata/v2/generateNextPersonID?$format=json\").\n+                        dig(\"d\", \"GenerateNextPersonIDResponse\", \"personID\")\n+          input[\"empId\"] = employee_id\n+        end\n+        date_fields = call(\"date_fields\", object_name: object_name)\n+        payload = input.map do |key, value|\n+          if date_fields.include?(key)\n+            if value.present?\n+              date_time = value.to_time.utc.iso8601.to_i * 1000 unless\n+              value.blank?\n+              { key => \"\\/Date(\" + date_time + \")\\/\" }\n+            else\n+              { key => value }\n+            end\n+          else\n+            { key => value }\n+          end\n+        end.inject(:merge)\n+\n+        post(\"/odata/v2/\" + object_name).\n+          headers(\"Accept\": \"application/json\",\n+                  \"Content-Type\": \"application/json\").\n+          payload(payload).\n+          after_response do |_code, body, _header, _message|\n+            body.dig(\"d\")\n+          end.after_error_response(404) do |_code, body, _header, message|\n+            error(\"#{message}: #{body}\")\n+          end\n+      end,\n+\n+      output_fields: lambda do |object_definitions|\n+        object_definitions[\"object_output\"]\n+      end,\n+\n+      sample_output: lambda do |_connection, input|\n+        date_fields = call(:date_fields, object_name: input[\"object_name\"])\n+        objects = get(\"/odata/v2/\" + input[\"object_name\"]).\n+                  params(\"$top\": 1).\n+                  dig(\"d\", \"results\")\n+        final_objects = objects.map do |obj|\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if value.present?\n+                date_time = value.scan(/\\d+/)[0] unless value.blank?\n+                { key => (date_time.to_i / 1000).to_i.to_time }\n+              else\n+                { key => value }\n+              end\n+            else\n+              { key => value }\n+            end\n+          end.inject(:merge)\n+        end\n+        final_objects&.first || {}\n+      end\n+    },\n+\n+    update_object: {\n+      description: \"Update <span class='provider'>object</span> in \" \\\n+        \"<span class='provider'>SuccessFactors</span>\",\n+      subtitle: \"Update object in SuccessFactors\",\n+      help: \"Merges only data fields which are passed in input\",\n+\n+      config_fields: [\n+        {\n+          name: \"object_name\", label: \"Object\",\n+          control_type: \"select\",\n+          pick_list: \"entity_set\",\n+          hint: \"Select object\",\n+          optional: false\n+        }\n+      ],\n+\n+      input_fields: lambda do |object_definitions|\n+        object_definitions[\"object_update\"]\n+      end,\n+\n+      execute: lambda do |_connection, input|\n+        object_name = input.delete(\"object_name\")\n+        key_column = call(:object_key, object_name: object_name)\n+        date_fields = call(:date_fields, object_name: object_name)\n+        payload = input.map do |key, value|\n+          if date_fields.include?(key)\n+            if value.present?\n+              date_time = value.to_time.utc.iso8601.to_i * 1000 unless\n+              value.blank?\n+              { key => \"\\/Date(\" + date_time + \")\\/\" }\n+            else\n+              { key => value }\n+            end\n+          else\n+            { key => value }\n+          end\n+        end.inject(:merge)\n+\n+        put(\"/odata/v2/\" + object_name + \"('\" +\n+            input.delete(key_column) + \"')\").\n+          params(\"$format\": \"JSON\").\n+          headers(\"Content-Type\": \"application/json;charset=utf-8\").\n+          payload(payload).\n+          after_response do |_code, body, _header, _message|\n+            body\n+          end.after_error_response(500) do |_code, body, _header, message|\n+            error(\"#{message}: #{body}\")\n+          end\n+      end,\n+\n+      output_fields: lambda do |object_definitions|\n+        object_definitions[\"object_output\"]\n+      end,\n+\n+      sample_output: lambda do |_connection, input|\n+        date_fields = call(:date_fields, object_name: input[\"object_name\"])\n+        objects = get(\"/odata/v2/\" + input[\"object_name\"]).\n+                  params(\"$top\": 1).\n+                  dig(\"d\", \"results\")\n+        final_objects = objects.map do |obj|\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if value.present?\n+                date_time = value.scan(/\\d+/)[0] unless value.blank?\n+                { key => (date_time.to_i / 1000).to_i.to_time }\n+              else\n+                { key => value }\n+              end\n+            else\n+              { key => value }\n+            end\n+          end.inject(:merge)\n+        end\n+        final_objects&.first || {}\n+      end\n+    }\n+  },\n+\n+  triggers: {\n+    new_updated_object: {\n+      title: \"New/Updated object\",\n+      description: \"New/Updated <span class='provider'>object</span> in \" \\\n+        \"<span class='provider'>SuccessFactors</span>\",\n+      subtitle: \"New/Updated object\",\n+\n+      config_fields: [\n+        { name: \"object_name\", control_type: :select,\n+          pick_list: \"entity_set\",\n+          label: \"Object Name\",\n+          hint: \"Select object\",\n+          optional: false,\n+          toggle_hint: \"Select Entityset\",\n+          toggle_field:\n+            { name: \"object_name\",\n+              type: \"string\",\n+              control_type: \"text\",\n+              label: \"Object API name\",\n+              toggle_hint: \"Use Entityset name\",\n+              hint: \"EntitySet Internal name\" } }\n+      ],\n+\n+      input_fields: lambda do\n+        [\n+          { name: \"since\", type: \"date_time\",\n+            sticky: true,\n+            label: \"From\",\n+            hint: \"Fetch objects from specified time\" }\n+        ]\n+      end,\n+\n+      poll: lambda do |_connection, input, last_updated_since|\n+        object_name = input.delete(\"object_name\")\n+        key_column = call(:object_key, object_name: object_name)\n+        date_fields = call(:date_fields, object_name: object_name)\n+        last_updated_since ||= (input[\"since\"].presence || 1.hour.ago).\n+                               to_time.utc.iso8601\n+        objects = get(\"/odata/v2/\" + object_name).\n+                  params(\"$filter\": \"lastModifiedDateTime gt datetimeoffset'\" +\n+                                    last_updated_since + \"'\",\n+                         \"$orderby\": \"lastModifiedDateTime asc\").\n+                  headers(\"Accept\": \"application/json\",","path":"custom_connectors/api_key_auth/success_factors_connector.rb","position":782,"original_position":782,"commit_id":"9568dc6d2dc2cd85218a9f10c947eacad1b0ff5a","original_commit_id":"9568dc6d2dc2cd85218a9f10c947eacad1b0ff5a","user":{"login":"houndci-bot","id":6697940,"node_id":"MDQ6VXNlcjY2OTc5NDA=","avatar_url":"https://avatars0.githubusercontent.com/u/6697940?v=4","gravatar_id":"","url":"https://api.github.com/users/houndci-bot","html_url":"https://github.com/houndci-bot","followers_url":"https://api.github.com/users/houndci-bot/followers","following_url":"https://api.github.com/users/houndci-bot/following{/other_user}","gists_url":"https://api.github.com/users/houndci-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci-bot/subscriptions","organizations_url":"https://api.github.com/users/houndci-bot/orgs","repos_url":"https://api.github.com/users/houndci-bot/repos","events_url":"https://api.github.com/users/houndci-bot/events{/privacy}","received_events_url":"https://api.github.com/users/houndci-bot/received_events","type":"User","site_admin":false},"body":"Indent headers 2 spaces more than get(\"/odata/v2/\" + object_name) on line 778.","created_at":"2018-08-01T09:38:02Z","updated_at":"2018-08-01T09:38:03Z","html_url":"https://github.com/brendonyang/Hound-Review/pull/4#discussion_r206815018","pull_request_url":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/4","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/comments/206815018"},"html":{"href":"https://github.com/brendonyang/Hound-Review/pull/4#discussion_r206815018"},"pull_request":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/4","id":205365154,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA1MzY1MTU0","html_url":"https://github.com/brendonyang/Hound-Review/pull/4","diff_url":"https://github.com/brendonyang/Hound-Review/pull/4.diff","patch_url":"https://github.com/brendonyang/Hound-Review/pull/4.patch","issue_url":"https://api.github.com/repos/brendonyang/Hound-Review/issues/4","number":4,"state":"open","locked":false,"title":"Successfactor","user":{"login":"brendonyang","id":39894932,"node_id":"MDQ6VXNlcjM5ODk0OTMy","avatar_url":"https://avatars1.githubusercontent.com/u/39894932?v=4","gravatar_id":"","url":"https://api.github.com/users/brendonyang","html_url":"https://github.com/brendonyang","followers_url":"https://api.github.com/users/brendonyang/followers","following_url":"https://api.github.com/users/brendonyang/following{/other_user}","gists_url":"https://api.github.com/users/brendonyang/gists{/gist_id}","starred_url":"https://api.github.com/users/brendonyang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brendonyang/subscriptions","organizations_url":"https://api.github.com/users/brendonyang/orgs","repos_url":"https://api.github.com/users/brendonyang/repos","events_url":"https://api.github.com/users/brendonyang/events{/privacy}","received_events_url":"https://api.github.com/users/brendonyang/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-08-01T09:37:18Z","updated_at":"2018-08-01T09:38:03Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e56ca6134f39de735037f4e5bdfd993687dc8f99","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/4/commits","review_comments_url":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/4/comments","review_comment_url":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/comments{/number}","comments_url":"https://api.github.com/repos/brendonyang/Hound-Review/issues/4/comments","statuses_url":"https://api.github.com/repos/brendonyang/Hound-Review/statuses/9568dc6d2dc2cd85218a9f10c947eacad1b0ff5a","head":{"label":"brendonyang:successfactor","ref":"successfactor","sha":"9568dc6d2dc2cd85218a9f10c947eacad1b0ff5a","user":{"login":"brendonyang","id":39894932,"node_id":"MDQ6VXNlcjM5ODk0OTMy","avatar_url":"https://avatars1.githubusercontent.com/u/39894932?v=4","gravatar_id":"","url":"https://api.github.com/users/brendonyang","html_url":"https://github.com/brendonyang","followers_url":"https://api.github.com/users/brendonyang/followers","following_url":"https://api.github.com/users/brendonyang/following{/other_user}","gists_url":"https://api.github.com/users/brendonyang/gists{/gist_id}","starred_url":"https://api.github.com/users/brendonyang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brendonyang/subscriptions","organizations_url":"https://api.github.com/users/brendonyang/orgs","repos_url":"https://api.github.com/users/brendonyang/repos","events_url":"https://api.github.com/users/brendonyang/events{/privacy}","received_events_url":"https://api.github.com/users/brendonyang/received_events","type":"User","site_admin":false},"repo":{"id":143122853,"node_id":"MDEwOlJlcG9zaXRvcnkxNDMxMjI4NTM=","name":"Hound-Review","full_name":"brendonyang/Hound-Review","owner":{"login":"brendonyang","id":39894932,"node_id":"MDQ6VXNlcjM5ODk0OTMy","avatar_url":"https://avatars1.githubusercontent.com/u/39894932?v=4","gravatar_id":"","url":"https://api.github.com/users/brendonyang","html_url":"https://github.com/brendonyang","followers_url":"https://api.github.com/users/brendonyang/followers","following_url":"https://api.github.com/users/brendonyang/following{/other_user}","gists_url":"https://api.github.com/users/brendonyang/gists{/gist_id}","starred_url":"https://api.github.com/users/brendonyang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brendonyang/subscriptions","organizations_url":"https://api.github.com/users/brendonyang/orgs","repos_url":"https://api.github.com/users/brendonyang/repos","events_url":"https://api.github.com/users/brendonyang/events{/privacy}","received_events_url":"https://api.github.com/users/brendonyang/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/brendonyang/Hound-Review","description":null,"fork":false,"url":"https://api.github.com/repos/brendonyang/Hound-Review","forks_url":"https://api.github.com/repos/brendonyang/Hound-Review/forks","keys_url":"https://api.github.com/repos/brendonyang/Hound-Review/keys{/key_id}","collaborators_url":"https://api.github.com/repos/brendonyang/Hound-Review/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/brendonyang/Hound-Review/teams","hooks_url":"https://api.github.com/repos/brendonyang/Hound-Review/hooks","issue_events_url":"https://api.github.com/repos/brendonyang/Hound-Review/issues/events{/number}","events_url":"https://api.github.com/repos/brendonyang/Hound-Review/events","assignees_url":"https://api.github.com/repos/brendonyang/Hound-Review/assignees{/user}","branches_url":"https://api.github.com/repos/brendonyang/Hound-Review/branches{/branch}","tags_url":"https://api.github.com/repos/brendonyang/Hound-Review/tags","blobs_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/refs{/sha}","trees_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/trees{/sha}","statuses_url":"https://api.github.com/repos/brendonyang/Hound-Review/statuses/{sha}","languages_url":"https://api.github.com/repos/brendonyang/Hound-Review/languages","stargazers_url":"https://api.github.com/repos/brendonyang/Hound-Review/stargazers","contributors_url":"https://api.github.com/repos/brendonyang/Hound-Review/contributors","subscribers_url":"https://api.github.com/repos/brendonyang/Hound-Review/subscribers","subscription_url":"https://api.github.com/repos/brendonyang/Hound-Review/subscription","commits_url":"https://api.github.com/repos/brendonyang/Hound-Review/commits{/sha}","git_commits_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/commits{/sha}","comments_url":"https://api.github.com/repos/brendonyang/Hound-Review/comments{/number}","issue_comment_url":"https://api.github.com/repos/brendonyang/Hound-Review/issues/comments{/number}","contents_url":"https://api.github.com/repos/brendonyang/Hound-Review/contents/{+path}","compare_url":"https://api.github.com/repos/brendonyang/Hound-Review/compare/{base}...{head}","merges_url":"https://api.github.com/repos/brendonyang/Hound-Review/merges","archive_url":"https://api.github.com/repos/brendonyang/Hound-Review/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/brendonyang/Hound-Review/downloads","issues_url":"https://api.github.com/repos/brendonyang/Hound-Review/issues{/number}","pulls_url":"https://api.github.com/repos/brendonyang/Hound-Review/pulls{/number}","milestones_url":"https://api.github.com/repos/brendonyang/Hound-Review/milestones{/number}","notifications_url":"https://api.github.com/repos/brendonyang/Hound-Review/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/brendonyang/Hound-Review/labels{/name}","releases_url":"https://api.github.com/repos/brendonyang/Hound-Review/releases{/id}","deployments_url":"https://api.github.com/repos/brendonyang/Hound-Review/deployments","created_at":"2018-08-01T07:53:37Z","updated_at":"2018-08-01T09:16:08Z","pushed_at":"2018-08-01T09:37:18Z","git_url":"git://github.com/brendonyang/Hound-Review.git","ssh_url":"git@github.com:brendonyang/Hound-Review.git","clone_url":"https://github.com/brendonyang/Hound-Review.git","svn_url":"https://github.com/brendonyang/Hound-Review","homepage":null,"size":169,"stargazers_count":0,"watchers_count":0,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":2,"license":null,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"brendonyang:master","ref":"master","sha":"a225d28a6a95228b972f72c3f35b59ca777cff70","user":{"login":"brendonyang","id":39894932,"node_id":"MDQ6VXNlcjM5ODk0OTMy","avatar_url":"https://avatars1.githubusercontent.com/u/39894932?v=4","gravatar_id":"","url":"https://api.github.com/users/brendonyang","html_url":"https://github.com/brendonyang","followers_url":"https://api.github.com/users/brendonyang/followers","following_url":"https://api.github.com/users/brendonyang/following{/other_user}","gists_url":"https://api.github.com/users/brendonyang/gists{/gist_id}","starred_url":"https://api.github.com/users/brendonyang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brendonyang/subscriptions","organizations_url":"https://api.github.com/users/brendonyang/orgs","repos_url":"https://api.github.com/users/brendonyang/repos","events_url":"https://api.github.com/users/brendonyang/events{/privacy}","received_events_url":"https://api.github.com/users/brendonyang/received_events","type":"User","site_admin":false},"repo":{"id":143122853,"node_id":"MDEwOlJlcG9zaXRvcnkxNDMxMjI4NTM=","name":"Hound-Review","full_name":"brendonyang/Hound-Review","owner":{"login":"brendonyang","id":39894932,"node_id":"MDQ6VXNlcjM5ODk0OTMy","avatar_url":"https://avatars1.githubusercontent.com/u/39894932?v=4","gravatar_id":"","url":"https://api.github.com/users/brendonyang","html_url":"https://github.com/brendonyang","followers_url":"https://api.github.com/users/brendonyang/followers","following_url":"https://api.github.com/users/brendonyang/following{/other_user}","gists_url":"https://api.github.com/users/brendonyang/gists{/gist_id}","starred_url":"https://api.github.com/users/brendonyang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/brendonyang/subscriptions","organizations_url":"https://api.github.com/users/brendonyang/orgs","repos_url":"https://api.github.com/users/brendonyang/repos","events_url":"https://api.github.com/users/brendonyang/events{/privacy}","received_events_url":"https://api.github.com/users/brendonyang/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/brendonyang/Hound-Review","description":null,"fork":false,"url":"https://api.github.com/repos/brendonyang/Hound-Review","forks_url":"https://api.github.com/repos/brendonyang/Hound-Review/forks","keys_url":"https://api.github.com/repos/brendonyang/Hound-Review/keys{/key_id}","collaborators_url":"https://api.github.com/repos/brendonyang/Hound-Review/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/brendonyang/Hound-Review/teams","hooks_url":"https://api.github.com/repos/brendonyang/Hound-Review/hooks","issue_events_url":"https://api.github.com/repos/brendonyang/Hound-Review/issues/events{/number}","events_url":"https://api.github.com/repos/brendonyang/Hound-Review/events","assignees_url":"https://api.github.com/repos/brendonyang/Hound-Review/assignees{/user}","branches_url":"https://api.github.com/repos/brendonyang/Hound-Review/branches{/branch}","tags_url":"https://api.github.com/repos/brendonyang/Hound-Review/tags","blobs_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/refs{/sha}","trees_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/trees{/sha}","statuses_url":"https://api.github.com/repos/brendonyang/Hound-Review/statuses/{sha}","languages_url":"https://api.github.com/repos/brendonyang/Hound-Review/languages","stargazers_url":"https://api.github.com/repos/brendonyang/Hound-Review/stargazers","contributors_url":"https://api.github.com/repos/brendonyang/Hound-Review/contributors","subscribers_url":"https://api.github.com/repos/brendonyang/Hound-Review/subscribers","subscription_url":"https://api.github.com/repos/brendonyang/Hound-Review/subscription","commits_url":"https://api.github.com/repos/brendonyang/Hound-Review/commits{/sha}","git_commits_url":"https://api.github.com/repos/brendonyang/Hound-Review/git/commits{/sha}","comments_url":"https://api.github.com/repos/brendonyang/Hound-Review/comments{/number}","issue_comment_url":"https://api.github.com/repos/brendonyang/Hound-Review/issues/comments{/number}","contents_url":"https://api.github.com/repos/brendonyang/Hound-Review/contents/{+path}","compare_url":"https://api.github.com/repos/brendonyang/Hound-Review/compare/{base}...{head}","merges_url":"https://api.github.com/repos/brendonyang/Hound-Review/merges","archive_url":"https://api.github.com/repos/brendonyang/Hound-Review/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/brendonyang/Hound-Review/downloads","issues_url":"https://api.github.com/repos/brendonyang/Hound-Review/issues{/number}","pulls_url":"https://api.github.com/repos/brendonyang/Hound-Review/pulls{/number}","milestones_url":"https://api.github.com/repos/brendonyang/Hound-Review/milestones{/number}","notifications_url":"https://api.github.com/repos/brendonyang/Hound-Review/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/brendonyang/Hound-Review/labels{/name}","releases_url":"https://api.github.com/repos/brendonyang/Hound-Review/releases{/id}","deployments_url":"https://api.github.com/repos/brendonyang/Hound-Review/deployments","created_at":"2018-08-01T07:53:37Z","updated_at":"2018-08-01T09:16:08Z","pushed_at":"2018-08-01T09:37:18Z","git_url":"git://github.com/brendonyang/Hound-Review.git","ssh_url":"git@github.com:brendonyang/Hound-Review.git","clone_url":"https://github.com/brendonyang/Hound-Review.git","svn_url":"https://github.com/brendonyang/Hound-Review","homepage":null,"size":169,"stargazers_count":0,"watchers_count":0,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":2,"license":null,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/4"},"html":{"href":"https://github.com/brendonyang/Hound-Review/pull/4"},"issue":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/issues/4"},"comments":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/brendonyang/Hound-Review/statuses/9568dc6d2dc2cd85218a9f10c947eacad1b0ff5a"}},"author_association":"OWNER"}}
{"actor":{"display_login":"houndci-bot"}}