{"action":"created","comment":{"url":"https://api.github.com/repos/workato/connector_sdk/pulls/comments/201932010","pull_request_review_id":136528369,"id":201932010,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwMTkzMjAxMA==","diff_hunk":"@@ -0,0 +1,814 @@\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 - <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+\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, \"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, \"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, \"EntityType\", 0, \"Property\").\n+          select{ |field| field[\"@updatable\"] == \"true\" }.\n+          map do |o|\n+            optional = o[\"@Name\"] == key_column ? false : o[\"@required\"].include?(\"false\")\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, \"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, \"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+\n+  test: lambda { |_connection|\n+    get(\"/odata/v2/User?$top=1\")\n+  },\n+  methods: {\n+\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{ |field| [\"Edm.DateTime\",\n+         \"Edm.DateTimeOffset\"].include?(field[\"@Type\"]) }.\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.dig(\"edmx:Edmx\", 0, \"edmx:DataServices\", 0,\n+          \"Schema\", 1, \"EntityType\", 0, \"Key\", 0, \"PropertyRef\")[0][\"@Name\"]\n+    end\n+  },\n+  actions: {\n+\n+    search_object: {\n+      description: 'Search <span class=\"provider\">Objects</span> in <span class=\"provider\"> Success Factors</span>',\n+      subtitle: \"Search Object's in Success Factors\",\n+      config_fields: [\n+        { name: \"object_name\", control_type: :select,\n+          pick_list: :entity_set,\n+          label: \"Object\",\n+          hint: \"Select object\",\n+          optional: false }\n+      ],\n+      input_fields: lambda do |object_definitions|\n+        object_definitions[\"object_filter\"]\n+      end,\n+      execute: lambda do |connection, input|\n+        object_name = input.delete(\"object_name\")\n+        error(\"Provide at least one search criteria\") if input.blank?\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 << ( key + \" eq '\" + \"/Date(\" + val  + \")/\" + \"'\") unless val.blank?\n+          else\n+            filter_params << ( key + \" eq '\" + val + \"'\") unless val.blank?\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\").dig(\"d\", \"results\")\n+        final_objects = objects.map { |obj|\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if !value.blank?\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+        }\n+        final_objects\n+        {\n+          objects: final_objects\n+        }\n+      end,\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+      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).dig(\"d\", \"results\")\n+        final_objects = objects.map { |obj|\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if !value.blank?\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+        }\n+        final_objects&.first || {}\n+      end\n+\n+    },\n+    create_object: {\n+      description: \"Create <span class='provider'>Object</span> in \" \\\n+      \"<span class='provider'>Success Factors</span>\",\n+      subtitle: \"Create object in Success Factors\",\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+      input_fields: lambda do |object_definitions|\n+        object_definitions[\"object_create\"]\n+      end,\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\"].blank?\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.blank?\n+              date_time = value.to_time.utc.iso8601.to_i * 1000 unless 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+\n+      end,\n+      output_fields: lambda do |object_definitions|\n+        object_definitions[\"object_output\"]\n+      end,\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\"]).params(\"$top\": 1).dig(\"d\", \"results\")\n+        final_objects = objects.map { |obj|\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if !value.blank?\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+\n+            else\n+              { key => value }\n+            end\n+          end.inject(:merge)\n+        }\n+        final_objects&.first || {}\n+      end\n+\n+    },\n+    update_object: {\n+      description: \"Update <span class='provider'>Object</span> in \" \\\n+      \"<span class='provider'> Success Factors</span>\",\n+      subtitle: \"Update Object in Success Factors\",\n+      help: \"Merges only data fields which are passed in input\",\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+      input_fields: lambda do |object_definitions|\n+        object_definitions[\"object_update\"]\n+      end,\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.blank?\n+              date_time = value.to_time.utc.iso8601.to_i * 1000 unless 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 + \"('\" + 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+      output_fields: lambda do |object_definitions|\n+        object_definitions[\"object_output\"]\n+      end,\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).dig(\"d\", \"results\")\n+        final_objects = objects.map { |obj|\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if !value.blank?\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+\n+            else\n+              { key => value }\n+            end\n+          end.inject(:merge)\n+        }\n+        final_objects&.first || {}\n+      end\n+\n+    }\n+\n+  },\n+\n+  triggers: {\n+\n+    new_updated_object: {\n+      description: \"New or Updated <span class='provider'>Object</span> in \" \\\n+      \"<span class='provider'>Success Factors</span>\",\n+      title_hint: \"New or Updated object in Success Factors\",\n+      help: \"Each object created or updated processed as a single trigger event.\",\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+      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+      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).to_time.utc.iso8601\n+        objects = get(\"/odata/v2/\" + object_name ).\n+          params(\"$filter\": \"lastModifiedDateTime gt \" + \"datetimeoffset'\" + last_updated_since + \"'\",\n+            \"$orderby\": \"lastModifiedDateTime asc\").\n+          headers(\"Accept\": \"application/json\",\n+            \"Content-Type\": \"application/json\").dig(\"d\", \"results\")\n+        # add custom column for dedup, timestamp conversion\n+        final_objects = objects.map { |obj|\n+          obj[\"object_id\"] = obj[key_column] + \"-\" + obj[\"lastModifiedDateTime\"].scan(/\\d+/)[0].to_s\n+          obj.map do |key, value|\n+            if date_fields.include?(key)\n+              if !value.blank?\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+        }\n+        last_updated_since = final_objects.last['lastModifiedDateTime'] unless final_objects.size == 0","path":"basic_auth/SuccessFactors.rb","position":767,"original_position":767,"commit_id":"4ec26ac2fb42d751feb66817d6701c8ccd0b7a9d","original_commit_id":"4ec26ac2fb42d751feb66817d6701c8ccd0b7a9d","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":"Style/StringLiterals: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.<br>Style/NumericPredicate: Use final_objects.size.zero? instead of final_objects.size == 0.<br>Style/ZeroLengthPredicate: Use empty? instead of size == 0.<br>Metrics/LineLength: Line is too long. [102/80]","created_at":"2018-07-12T07:20:26Z","updated_at":"2018-07-12T07:20:27Z","html_url":"https://github.com/workato/connector_sdk/pull/136#discussion_r201932010","pull_request_url":"https://api.github.com/repos/workato/connector_sdk/pulls/136","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/workato/connector_sdk/pulls/comments/201932010"},"html":{"href":"https://github.com/workato/connector_sdk/pull/136#discussion_r201932010"},"pull_request":{"href":"https://api.github.com/repos/workato/connector_sdk/pulls/136"}}},"pull_request":{"url":"https://api.github.com/repos/workato/connector_sdk/pulls/136","id":200908999,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAwOTA4OTk5","html_url":"https://github.com/workato/connector_sdk/pull/136","diff_url":"https://github.com/workato/connector_sdk/pull/136.diff","patch_url":"https://github.com/workato/connector_sdk/pull/136.patch","issue_url":"https://api.github.com/repos/workato/connector_sdk/issues/136","number":136,"state":"open","locked":false,"title":"Success factors connector","user":{"login":"kohroshimizu","id":39761424,"node_id":"MDQ6VXNlcjM5NzYxNDI0","avatar_url":"https://avatars0.githubusercontent.com/u/39761424?v=4","gravatar_id":"","url":"https://api.github.com/users/kohroshimizu","html_url":"https://github.com/kohroshimizu","followers_url":"https://api.github.com/users/kohroshimizu/followers","following_url":"https://api.github.com/users/kohroshimizu/following{/other_user}","gists_url":"https://api.github.com/users/kohroshimizu/gists{/gist_id}","starred_url":"https://api.github.com/users/kohroshimizu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kohroshimizu/subscriptions","organizations_url":"https://api.github.com/users/kohroshimizu/orgs","repos_url":"https://api.github.com/users/kohroshimizu/repos","events_url":"https://api.github.com/users/kohroshimizu/events{/privacy}","received_events_url":"https://api.github.com/users/kohroshimizu/received_events","type":"User","site_admin":false},"body":"Triggers:\r\n- [ ] New updated object\r\n\r\nActions:\r\n- [ ] Create object \r\n- [ ] Search object \r\n- [ ] Update object","created_at":"2018-07-12T07:20:14Z","updated_at":"2018-07-12T07:20:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bd3193952671226f081e9a1ec28baaf24ca789f7","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/workato/connector_sdk/pulls/136/commits","review_comments_url":"https://api.github.com/repos/workato/connector_sdk/pulls/136/comments","review_comment_url":"https://api.github.com/repos/workato/connector_sdk/pulls/comments{/number}","comments_url":"https://api.github.com/repos/workato/connector_sdk/issues/136/comments","statuses_url":"https://api.github.com/repos/workato/connector_sdk/statuses/4ec26ac2fb42d751feb66817d6701c8ccd0b7a9d","head":{"label":"kohroshimizu:SuccessFactors_connector","ref":"SuccessFactors_connector","sha":"4ec26ac2fb42d751feb66817d6701c8ccd0b7a9d","user":{"login":"kohroshimizu","id":39761424,"node_id":"MDQ6VXNlcjM5NzYxNDI0","avatar_url":"https://avatars0.githubusercontent.com/u/39761424?v=4","gravatar_id":"","url":"https://api.github.com/users/kohroshimizu","html_url":"https://github.com/kohroshimizu","followers_url":"https://api.github.com/users/kohroshimizu/followers","following_url":"https://api.github.com/users/kohroshimizu/following{/other_user}","gists_url":"https://api.github.com/users/kohroshimizu/gists{/gist_id}","starred_url":"https://api.github.com/users/kohroshimizu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kohroshimizu/subscriptions","organizations_url":"https://api.github.com/users/kohroshimizu/orgs","repos_url":"https://api.github.com/users/kohroshimizu/repos","events_url":"https://api.github.com/users/kohroshimizu/events{/privacy}","received_events_url":"https://api.github.com/users/kohroshimizu/received_events","type":"User","site_admin":false},"repo":{"id":138720855,"node_id":"MDEwOlJlcG9zaXRvcnkxMzg3MjA4NTU=","name":"connector_sdk","full_name":"kohroshimizu/connector_sdk","owner":{"login":"kohroshimizu","id":39761424,"node_id":"MDQ6VXNlcjM5NzYxNDI0","avatar_url":"https://avatars0.githubusercontent.com/u/39761424?v=4","gravatar_id":"","url":"https://api.github.com/users/kohroshimizu","html_url":"https://github.com/kohroshimizu","followers_url":"https://api.github.com/users/kohroshimizu/followers","following_url":"https://api.github.com/users/kohroshimizu/following{/other_user}","gists_url":"https://api.github.com/users/kohroshimizu/gists{/gist_id}","starred_url":"https://api.github.com/users/kohroshimizu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kohroshimizu/subscriptions","organizations_url":"https://api.github.com/users/kohroshimizu/orgs","repos_url":"https://api.github.com/users/kohroshimizu/repos","events_url":"https://api.github.com/users/kohroshimizu/events{/privacy}","received_events_url":"https://api.github.com/users/kohroshimizu/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kohroshimizu/connector_sdk","description":"Connector SDK samples and documentation","fork":true,"url":"https://api.github.com/repos/kohroshimizu/connector_sdk","forks_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/forks","keys_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/teams","hooks_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/hooks","issue_events_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/issues/events{/number}","events_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/events","assignees_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/assignees{/user}","branches_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/branches{/branch}","tags_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/tags","blobs_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/git/refs{/sha}","trees_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/statuses/{sha}","languages_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/languages","stargazers_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/stargazers","contributors_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/contributors","subscribers_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/subscribers","subscription_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/subscription","commits_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/commits{/sha}","git_commits_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/git/commits{/sha}","comments_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/comments{/number}","issue_comment_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/issues/comments{/number}","contents_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/contents/{+path}","compare_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/merges","archive_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/downloads","issues_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/issues{/number}","pulls_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/pulls{/number}","milestones_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/milestones{/number}","notifications_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/labels{/name}","releases_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/releases{/id}","deployments_url":"https://api.github.com/repos/kohroshimizu/connector_sdk/deployments","created_at":"2018-06-26T10:12:31Z","updated_at":"2018-07-12T07:18:52Z","pushed_at":"2018-07-12T07:19:57Z","git_url":"git://github.com/kohroshimizu/connector_sdk.git","ssh_url":"git@github.com:kohroshimizu/connector_sdk.git","clone_url":"https://github.com/kohroshimizu/connector_sdk.git","svn_url":"https://github.com/kohroshimizu/connector_sdk","homepage":"","size":1933,"stargazers_count":0,"watchers_count":0,"language":"Ruby","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"workato:master","ref":"master","sha":"0840da810604f2b2c1ba8818b604ea9849cb8f64","user":{"login":"workato","id":5629924,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU2Mjk5MjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/5629924?v=4","gravatar_id":"","url":"https://api.github.com/users/workato","html_url":"https://github.com/workato","followers_url":"https://api.github.com/users/workato/followers","following_url":"https://api.github.com/users/workato/following{/other_user}","gists_url":"https://api.github.com/users/workato/gists{/gist_id}","starred_url":"https://api.github.com/users/workato/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/workato/subscriptions","organizations_url":"https://api.github.com/users/workato/orgs","repos_url":"https://api.github.com/users/workato/repos","events_url":"https://api.github.com/users/workato/events{/privacy}","received_events_url":"https://api.github.com/users/workato/received_events","type":"Organization","site_admin":false},"repo":{"id":54221993,"node_id":"MDEwOlJlcG9zaXRvcnk1NDIyMTk5Mw==","name":"connector_sdk","full_name":"workato/connector_sdk","owner":{"login":"workato","id":5629924,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU2Mjk5MjQ=","avatar_url":"https://avatars3.githubusercontent.com/u/5629924?v=4","gravatar_id":"","url":"https://api.github.com/users/workato","html_url":"https://github.com/workato","followers_url":"https://api.github.com/users/workato/followers","following_url":"https://api.github.com/users/workato/following{/other_user}","gists_url":"https://api.github.com/users/workato/gists{/gist_id}","starred_url":"https://api.github.com/users/workato/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/workato/subscriptions","organizations_url":"https://api.github.com/users/workato/orgs","repos_url":"https://api.github.com/users/workato/repos","events_url":"https://api.github.com/users/workato/events{/privacy}","received_events_url":"https://api.github.com/users/workato/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/workato/connector_sdk","description":"Connector SDK samples and documentation","fork":false,"url":"https://api.github.com/repos/workato/connector_sdk","forks_url":"https://api.github.com/repos/workato/connector_sdk/forks","keys_url":"https://api.github.com/repos/workato/connector_sdk/keys{/key_id}","collaborators_url":"https://api.github.com/repos/workato/connector_sdk/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/workato/connector_sdk/teams","hooks_url":"https://api.github.com/repos/workato/connector_sdk/hooks","issue_events_url":"https://api.github.com/repos/workato/connector_sdk/issues/events{/number}","events_url":"https://api.github.com/repos/workato/connector_sdk/events","assignees_url":"https://api.github.com/repos/workato/connector_sdk/assignees{/user}","branches_url":"https://api.github.com/repos/workato/connector_sdk/branches{/branch}","tags_url":"https://api.github.com/repos/workato/connector_sdk/tags","blobs_url":"https://api.github.com/repos/workato/connector_sdk/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/workato/connector_sdk/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/workato/connector_sdk/git/refs{/sha}","trees_url":"https://api.github.com/repos/workato/connector_sdk/git/trees{/sha}","statuses_url":"https://api.github.com/repos/workato/connector_sdk/statuses/{sha}","languages_url":"https://api.github.com/repos/workato/connector_sdk/languages","stargazers_url":"https://api.github.com/repos/workato/connector_sdk/stargazers","contributors_url":"https://api.github.com/repos/workato/connector_sdk/contributors","subscribers_url":"https://api.github.com/repos/workato/connector_sdk/subscribers","subscription_url":"https://api.github.com/repos/workato/connector_sdk/subscription","commits_url":"https://api.github.com/repos/workato/connector_sdk/commits{/sha}","git_commits_url":"https://api.github.com/repos/workato/connector_sdk/git/commits{/sha}","comments_url":"https://api.github.com/repos/workato/connector_sdk/comments{/number}","issue_comment_url":"https://api.github.com/repos/workato/connector_sdk/issues/comments{/number}","contents_url":"https://api.github.com/repos/workato/connector_sdk/contents/{+path}","compare_url":"https://api.github.com/repos/workato/connector_sdk/compare/{base}...{head}","merges_url":"https://api.github.com/repos/workato/connector_sdk/merges","archive_url":"https://api.github.com/repos/workato/connector_sdk/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/workato/connector_sdk/downloads","issues_url":"https://api.github.com/repos/workato/connector_sdk/issues{/number}","pulls_url":"https://api.github.com/repos/workato/connector_sdk/pulls{/number}","milestones_url":"https://api.github.com/repos/workato/connector_sdk/milestones{/number}","notifications_url":"https://api.github.com/repos/workato/connector_sdk/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/workato/connector_sdk/labels{/name}","releases_url":"https://api.github.com/repos/workato/connector_sdk/releases{/id}","deployments_url":"https://api.github.com/repos/workato/connector_sdk/deployments","created_at":"2016-03-18T18:08:56Z","updated_at":"2018-07-11T15:33:04Z","pushed_at":"2018-07-12T07:20:14Z","git_url":"git://github.com/workato/connector_sdk.git","ssh_url":"git@github.com:workato/connector_sdk.git","clone_url":"https://github.com/workato/connector_sdk.git","svn_url":"https://github.com/workato/connector_sdk","homepage":"","size":2031,"stargazers_count":14,"watchers_count":14,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":38,"mirror_url":null,"archived":false,"open_issues_count":40,"license":null,"forks":38,"open_issues":40,"watchers":14,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/workato/connector_sdk/pulls/136"},"html":{"href":"https://github.com/workato/connector_sdk/pull/136"},"issue":{"href":"https://api.github.com/repos/workato/connector_sdk/issues/136"},"comments":{"href":"https://api.github.com/repos/workato/connector_sdk/issues/136/comments"},"review_comments":{"href":"https://api.github.com/repos/workato/connector_sdk/pulls/136/comments"},"review_comment":{"href":"https://api.github.com/repos/workato/connector_sdk/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/workato/connector_sdk/pulls/136/commits"},"statuses":{"href":"https://api.github.com/repos/workato/connector_sdk/statuses/4ec26ac2fb42d751feb66817d6701c8ccd0b7a9d"}},"author_association":"NONE"}}
{"actor":{"display_login":"houndci-bot"}}