{"action":"created","comment":{"url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/comments/66673935","id":66673935,"diff_hunk":"@@ -0,0 +1,255 @@\n+﻿// Copyright (c) .NET Foundation. All rights reserved.\n+// Licensed under the MIT License. See License.txt in the project root for license information.\n+\n+using System;\n+using System.Collections.Generic;\n+using System.Collections.ObjectModel;\n+using System.IO;\n+using System.Linq;\n+using System.Reflection;\n+using System.Reflection.Emit;\n+using System.Threading.Tasks;\n+using Microsoft.Azure.WebJobs.Host.Bindings.Path;\n+using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;\n+using Microsoft.Azure.WebJobs.Script.Description;\n+using Microsoft.Azure.WebJobs.Script.Extensibility;\n+using Newtonsoft.Json.Linq;\n+\n+namespace Microsoft.Azure.WebJobs.Script.Binding\n+{\n+    /// <summary>\n+    /// Wrapper used to adapt a <see cref=\"ScriptBinding\"/> to the binding pipeline.\n+    /// </summary>\n+    [CLSCompliant(false)]\n+    public class ExtensionBinding : FunctionBinding\n+    {\n+        private ScriptBinding _binding;\n+        private IDictionary<Type, IDictionary<string, object>> _attributeData;\n+\n+        public ExtensionBinding(ScriptHostConfiguration config, ScriptBinding binding, BindingMetadata metadata) : base(config, metadata, binding.Context.Access)\n+        {\n+            _binding = binding;\n+\n+            // TEMP: We're doing some conversions from Attribute instances to data bags\n+            // which will go away\n+            var attributes = _binding.GetAttributes();\n+            _attributeData = new Dictionary<Type, IDictionary<string, object>>();\n+            foreach (var attribute in attributes)\n+            {\n+                _attributeData.Add(attribute.GetType(), GetAttributeData(attribute));\n+            }\n+        }\n+\n+        public override Collection<CustomAttributeBuilder> GetCustomAttributes(Type parameterType)\n+        {\n+            Collection<CustomAttributeBuilder> attributeBuilders = new Collection<CustomAttributeBuilder>();\n+            foreach (var attribute in _attributeData)\n+            {\n+                CustomAttributeBuilder builder = GetAttributeBuilder(attribute.Key, attribute.Value);\n+                attributeBuilders.Add(builder);\n+            }\n+\n+            return attributeBuilders;\n+        }\n+\n+        public override async Task BindAsync(BindingContext context)\n+        {\n+            // All the below BindAsync logic is temporary IBinder support\n+            // Once the Invoker work is done, we'll be binding directly\n+            Collection<Attribute> attributes = CreateAttributes(_attributeData, context.BindingData);\n+            var attribute = attributes.First();\n+            var additionalAttributes = attributes.Skip(1).ToArray();\n+            RuntimeBindingContext runtimeContext = new RuntimeBindingContext(attribute, additionalAttributes);\n+\n+            // TEMP: We'll be doing away with this IBinder code\n+            // So for now we don't support binding parameters for Non C#\n+            if (_binding.DefaultType == typeof(IAsyncCollector<byte[]>))\n+            {\n+                await BindAsyncCollectorAsync<byte[]>(context, runtimeContext);\n+            }\n+            else if (_binding.DefaultType == typeof(Stream))\n+            {\n+                await BindStreamAsync(context, Access, runtimeContext);\n+            }\n+            else if (_binding.DefaultType == typeof(JObject))\n+            {\n+                var result = await context.Binder.BindAsync<JObject>(runtimeContext);\n+                if (Access == FileAccess.Read)\n+                {\n+                    context.Value = result;\n+                }\n+            }\n+            else if (_binding.DefaultType == typeof(IAsyncCollector<JObject>))\n+            {\n+                await BindAsyncCollectorAsync<JObject>(context, runtimeContext);\n+            }\n+        }\n+\n+        // TEMP - Since we're still using IBinder for non C#, we have to construct the Attributes\n+        private Collection<Attribute> CreateAttributes(IDictionary<Type, IDictionary<string, object>> attributesToCreate, IReadOnlyDictionary<string, string> bindingData)\n+        {\n+            Collection<Attribute> attributes = new Collection<Attribute>();\n+\n+            foreach (var attributeToCreate in attributesToCreate)\n+            {\n+                // access and resolve all attribute data\n+                var attributeData = attributeToCreate.Value;\n+                if (bindingData != null)\n+                {\n+                    foreach (var pair in attributeData.Where(p => p.Value is string).ToArray())\n+                    {\n+                        string resolvedValue = ResolveAndBind((string)pair.Value, bindingData);\n+                        attributeData[pair.Key] = resolvedValue;\n+                    }\n+                }\n+\n+                // construct the attribute instance\n+                var attributeConstructionInfo = GetAttributeConstructionInfo(attributeToCreate.Key, attributeData);\n+                Attribute attribute = (Attribute)attributeConstructionInfo.Constructor.Invoke(attributeConstructionInfo.ConstructorArgs);\n+\n+                // apply any named property values\n+                foreach (var namedProperty in attributeConstructionInfo.Properties)\n+                {\n+                    namedProperty.Key.SetValue(attribute, namedProperty.Value);\n+                }\n+\n+                attributes.Add(attribute);\n+            }\n+\n+            return attributes;\n+        }\n+\n+        // TEMP\n+        private string ResolveAndBind(string value, IReadOnlyDictionary<string, string> bindingData)\n+        {\n+            BindingTemplate template = BindingTemplate.FromString(value);\n+\n+            string boundValue = value;\n+\n+            if (bindingData != null)\n+            {\n+                if (template != null)\n+                {\n+                    boundValue = template.Bind(bindingData);\n+                }\n+            }\n+\n+            if (!string.IsNullOrEmpty(value))\n+            {\n+                boundValue = Resolve(boundValue);\n+            }\n+\n+            return boundValue;\n+        }\n+\n+        internal class AttributeConstructionInfo\n+        {\n+            public ConstructorInfo Constructor { get; set; }\n+            public object[] ConstructorArgs { get; set; }\n+            public IDictionary<PropertyInfo, object> Properties { get; set; }\n+        }\n+\n+        internal static CustomAttributeBuilder GetAttributeBuilder(Type attributeType, IDictionary<string, object> attributeData)\n+        {\n+            AttributeConstructionInfo constructionInfo = GetAttributeConstructionInfo(attributeType, attributeData);\n+\n+            var namedProperties = constructionInfo.Properties.Keys.ToArray();\n+            var namedPropertyValues = constructionInfo.Properties.Values.ToArray();\n+            CustomAttributeBuilder builder = new CustomAttributeBuilder(constructionInfo.Constructor, constructionInfo.ConstructorArgs, namedProperties, namedPropertyValues);\n+\n+            return builder;\n+        }\n+\n+        internal static IDictionary<string, object> GetAttributeData(Attribute attribute)\n+        {\n+            Dictionary<string, object> data = new Dictionary<string, object>();\n+\n+            foreach (var property in attribute.GetType().GetProperties())\n+            {\n+                object value = property.GetValue(attribute);\n+                if (value != null)\n+                {\n+                    data.Add(property.Name, value);\n+                }\n+            }\n+\n+            return data;\n+        }\n+\n+        internal static AttributeConstructionInfo GetAttributeConstructionInfo(Type attributeType, IDictionary<string, object> attributeData)\n+        {","path":"src/WebJobs.Script/Binding/ExtensionBinding.cs","position":180,"original_position":180,"commit_id":"608c490480875c2451f59b85a48ad6c6dacd0ebb","original_commit_id":"608c490480875c2451f59b85a48ad6c6dacd0ebb","user":{"login":"fabiocav","id":2507935,"avatar_url":"https://avatars.githubusercontent.com/u/2507935?v=3","gravatar_id":"","url":"https://api.github.com/users/fabiocav","html_url":"https://github.com/fabiocav","followers_url":"https://api.github.com/users/fabiocav/followers","following_url":"https://api.github.com/users/fabiocav/following{/other_user}","gists_url":"https://api.github.com/users/fabiocav/gists{/gist_id}","starred_url":"https://api.github.com/users/fabiocav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fabiocav/subscriptions","organizations_url":"https://api.github.com/users/fabiocav/orgs","repos_url":"https://api.github.com/users/fabiocav/repos","events_url":"https://api.github.com/users/fabiocav/events{/privacy}","received_events_url":"https://api.github.com/users/fabiocav/received_events","type":"User","site_admin":false},"body":"Was going through this but remembered you talking about using some existing code for the attribute construction. Is this it? If so, it's something that's already pretty well tested in the SDK, correct?","created_at":"2016-06-10T20:10:52Z","updated_at":"2016-06-10T20:10:52Z","html_url":"https://github.com/Azure/azure-webjobs-sdk-script/pull/427#discussion_r66673935","pull_request_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/427","_links":{"self":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/comments/66673935"},"html":{"href":"https://github.com/Azure/azure-webjobs-sdk-script/pull/427#discussion_r66673935"},"pull_request":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/427"}}},"pull_request":{"url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/427","id":73135258,"html_url":"https://github.com/Azure/azure-webjobs-sdk-script/pull/427","diff_url":"https://github.com/Azure/azure-webjobs-sdk-script/pull/427.diff","patch_url":"https://github.com/Azure/azure-webjobs-sdk-script/pull/427.patch","issue_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues/427","number":427,"state":"open","locked":false,"title":"Binding Extensibility","user":{"login":"mathewc","id":1056548,"avatar_url":"https://avatars.githubusercontent.com/u/1056548?v=3","gravatar_id":"","url":"https://api.github.com/users/mathewc","html_url":"https://github.com/mathewc","followers_url":"https://api.github.com/users/mathewc/followers","following_url":"https://api.github.com/users/mathewc/following{/other_user}","gists_url":"https://api.github.com/users/mathewc/gists{/gist_id}","starred_url":"https://api.github.com/users/mathewc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mathewc/subscriptions","organizations_url":"https://api.github.com/users/mathewc/orgs","repos_url":"https://api.github.com/users/mathewc/repos","events_url":"https://api.github.com/users/mathewc/events{/privacy}","received_events_url":"https://api.github.com/users/mathewc/received_events","type":"User","site_admin":false},"body":"These changes introduce a simple set of interfaces that WebJobs SDK extension authors can implement as part of their extension so that their extension can be exposed via Functions **with no changes to Functions**. This will enable 3rd parties to onboard their extensions easily.\r\n\r\nA provider model is introduced in the new **WebJobs.Script.Extensibility** package. Extension authors reference this package and implement a simple **ScriptBindingProvider** that is responsible for mapping Function JSON metadata to their Extension Attribute(s). See the corresponding changes in the Extensions repo [in this PR](https://github.com/Azure/azure-webjobs-sdk-extensions/pull/111).\r\n\r\nThis PR is still very raw, but I wanted to get it out early to get high level feedback on things. There is still more work to do to finish this up to the point where I can check it in. That said, all existing tests pass with these changes :)\r\n\r\nMy plan is to iterate on this a bit more, address any initial feedback, etc. and get this checked in as a first phase. We'll then iterate further in subsequent PRs. ","created_at":"2016-06-08T23:05:56Z","updated_at":"2016-06-10T20:10:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"134a0327bf451f8fc09ba290b0983ac4221cc5df","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/427/commits","review_comments_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/427/comments","review_comment_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues/427/comments","statuses_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/statuses/608c490480875c2451f59b85a48ad6c6dacd0ebb","head":{"label":"Azure:extensibility","ref":"extensibility","sha":"608c490480875c2451f59b85a48ad6c6dacd0ebb","user":{"login":"Azure","id":6844498,"avatar_url":"https://avatars.githubusercontent.com/u/6844498?v=3","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"repo":{"id":42548553,"name":"azure-webjobs-sdk-script","full_name":"Azure/azure-webjobs-sdk-script","owner":{"login":"Azure","id":6844498,"avatar_url":"https://avatars.githubusercontent.com/u/6844498?v=3","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Azure/azure-webjobs-sdk-script","description":"Scripting the Azure WebJobs SDK","fork":false,"url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script","forks_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/forks","keys_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/teams","hooks_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/hooks","issue_events_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues/events{/number}","events_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/events","assignees_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/assignees{/user}","branches_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/branches{/branch}","tags_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/tags","blobs_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/refs{/sha}","trees_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/statuses/{sha}","languages_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/languages","stargazers_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/stargazers","contributors_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/contributors","subscribers_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/subscribers","subscription_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/subscription","commits_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/commits{/sha}","git_commits_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/commits{/sha}","comments_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/comments{/number}","issue_comment_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues/comments{/number}","contents_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/contents/{+path}","compare_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/merges","archive_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/downloads","issues_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues{/number}","pulls_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls{/number}","milestones_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/milestones{/number}","notifications_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/labels{/name}","releases_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/releases{/id}","deployments_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/deployments","created_at":"2015-09-15T21:48:19Z","updated_at":"2016-06-07T16:44:16Z","pushed_at":"2016-06-10T19:33:34Z","git_url":"git://github.com/Azure/azure-webjobs-sdk-script.git","ssh_url":"git@github.com:Azure/azure-webjobs-sdk-script.git","clone_url":"https://github.com/Azure/azure-webjobs-sdk-script.git","svn_url":"https://github.com/Azure/azure-webjobs-sdk-script","homepage":"","size":15338,"stargazers_count":65,"watchers_count":65,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":38,"mirror_url":null,"open_issues_count":93,"forks":38,"open_issues":93,"watchers":65,"default_branch":"dev"}},"base":{"label":"Azure:dev","ref":"dev","sha":"9aa15b74c6b10ed2baa6c18e08c453a599a07651","user":{"login":"Azure","id":6844498,"avatar_url":"https://avatars.githubusercontent.com/u/6844498?v=3","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"repo":{"id":42548553,"name":"azure-webjobs-sdk-script","full_name":"Azure/azure-webjobs-sdk-script","owner":{"login":"Azure","id":6844498,"avatar_url":"https://avatars.githubusercontent.com/u/6844498?v=3","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Azure/azure-webjobs-sdk-script","description":"Scripting the Azure WebJobs SDK","fork":false,"url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script","forks_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/forks","keys_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/teams","hooks_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/hooks","issue_events_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues/events{/number}","events_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/events","assignees_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/assignees{/user}","branches_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/branches{/branch}","tags_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/tags","blobs_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/refs{/sha}","trees_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/statuses/{sha}","languages_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/languages","stargazers_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/stargazers","contributors_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/contributors","subscribers_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/subscribers","subscription_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/subscription","commits_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/commits{/sha}","git_commits_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/git/commits{/sha}","comments_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/comments{/number}","issue_comment_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues/comments{/number}","contents_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/contents/{+path}","compare_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/merges","archive_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/downloads","issues_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues{/number}","pulls_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls{/number}","milestones_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/milestones{/number}","notifications_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/labels{/name}","releases_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/releases{/id}","deployments_url":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/deployments","created_at":"2015-09-15T21:48:19Z","updated_at":"2016-06-07T16:44:16Z","pushed_at":"2016-06-10T19:33:34Z","git_url":"git://github.com/Azure/azure-webjobs-sdk-script.git","ssh_url":"git@github.com:Azure/azure-webjobs-sdk-script.git","clone_url":"https://github.com/Azure/azure-webjobs-sdk-script.git","svn_url":"https://github.com/Azure/azure-webjobs-sdk-script","homepage":"","size":15338,"stargazers_count":65,"watchers_count":65,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":38,"mirror_url":null,"open_issues_count":93,"forks":38,"open_issues":93,"watchers":65,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/427"},"html":{"href":"https://github.com/Azure/azure-webjobs-sdk-script/pull/427"},"issue":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues/427"},"comments":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/issues/427/comments"},"review_comments":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/427/comments"},"review_comment":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/pulls/427/commits"},"statuses":{"href":"https://api.github.com/repos/Azure/azure-webjobs-sdk-script/statuses/608c490480875c2451f59b85a48ad6c6dacd0ebb"}}}}
{"actor":{"display_login":"fabiocav"}}