Giter Site home page Giter Site logo

jordimontana82 / fake-xrm-easy Goto Github PK

View Code? Open in Web Editor NEW
263.0 34.0 180.0 15.34 MB

The testing framework for Dynamics CRM and Dynamics 365 which runs on an In-Memory context and deals with mocks or fakes for you

Home Page: https://dynamicsvalue.com/get-started/overview?source=git

License: Other

C# 65.72% PowerShell 0.01% Batchfile 0.01% F# 0.13% HTML 34.14%
dynamics-crm c-sharp fake dynamics dynamics-365 fakexrmeasy testing unittest dynamics-crm-online mock

fake-xrm-easy's Introduction

Fake Xrm Easy: TDD for Dynamics CRM and Dynamics 365 (or now Common Data Service for Apps) made simple

Follow me for updates on Twitter!

UPDATE: FakeXrmEasy v1.x is deprecated and will stop receiving updates soon. Start planning your transition to versions 2.x and 3.x now!

Build Line Coverage Branch Coverage
Build status Line coverage Branch coverage

Streamline unit testing in Dynamics CRM by faking the IOrganizationService to work with an in-memory context.

Drive your development by unit testing any plugin, code activity, or 3rd party app using the OrganizationService easier and faster than ever before.

Note: To keep up to date with client-side unit testing version of this framework, please have a look at this repo and samples in this other sample code repo

Version Package Name NuGet
Dynamics v9 (>= 9.x) FakeXrmEasy.9 Nuget
Dynamics 365 (8.2.x) FakeXrmEasy.365 Nuget
Dynamics CRM 2016 ( >= 8.0 && <= 8.1) FakeXrmEasy.2016 Nuget
Dynamics CRM 2015 (7.x) FakeXrmEasy.2015 Nuget
Dynamics CRM 2013 (6.x) FakeXrmEasy.2013 Nuget
Dynamics CRM 2011 (5.x) FakeXrmEasy Nuget

Supports Dynamics CRM 2011, 2013, 2015, 2016, and Dynamics 365 (8.x and 9.x). NOTE: With the release of Dynamics 365 v9 we are changing the naming convention for new packages to match the major version.

Semantic Versioning

The NuGet packages use semantic versioning like this:

x.y.z  => Major.Minor.Patch

x: stands for the major version. The package is very stable so that's why the major version didn't change yet.

y: minor version. Any minor updates add new functionality without breaking changes. An example of these would be a new operator or a new fake message executor.

z: patch. Any update to this number means new bug fixes for the existing functionality. A new minor version might also include bug fixes too.

Support

We believe in sustainable Open Source. The software is MIT licensed and provided to you for free but we encourage you (and by you, we mean the whole community) to extend it / improve it by yourselves, of course, with help from us.

In programming terms:

Free Open Source !== Free Support. 

If you're a business entity who delivers solutions on top of the Power Platform and are using this project already, you can help make OSS sustainable while getting more visibility by becoming a sponsor. Please reach out to me for sponsorship enquiries and to contribute and give back to this project.

If you're an individual, feel free to check the Sponsorship tiers, any help is welcome and greatly appreciated.

For contributing, please see section below.

Contributing

Please consider the below guidelines for contributing to the project:

  • Priority: Given the overwhelming number of issues and pull requests, we'll review Pull Requests first, then any outstanding issues. We encourage you to resolve / extend issues by yourselves, as a community, and we'll prioritise those first because we know (as mantainers) the effort it takes.

    Please do fork the project and submit a pull request

    We'll thank you forever and ever.

    If you don't know how to resolve something or are not familiar with pull requests, don't worry, raise the issue anyway. Those will be revised next.

  • When raising an issue:

    • Please provide a sample unit test to reproduce any issues detected where possible. This will speed up the resolution.
    • Attach all generated early bound typed entities required (if you're using early bound).
  • If you're using the framework, please do Star the project, it'll give more visibility to the wider community to keep extending and improving it.

Roadmap

  • TODO: We're working on a v2.x of this package which targets .net core. That new version has been developed for the last couple of months, and we're VERY close to make it public. In the meantime, PRs and issues will be on hold for the time being to keep track of "where we are" in order to be merged into both versions 1.x and 2.x. More info here

  • TODO: Add support for date operators. See ConditionOperator implementation status here. Feel free to add missing ones!

  • TODO: Implement remaining CRM messages. To know which ones have been implemented so far, see FakeMessageExecutor implementation status here.

  • TODO: Increase test coverage.

  • NEW! I'm planning a 2.x version, this version will contain all the major improvements I always thought of adding but that will introduce considerable breaking changes. If you want to join a private preview list, let me know.

Tests disappeared?

Try deleting anything under the VS test explorer cache: %Temp%\VisualStudioTestExplorerExtensions

fake-xrm-easy's People

Contributors

aleksandrrogov avatar arjenst avatar betimbeja avatar bwmodular avatar camelcasedave avatar ckl-bso avatar energy164 avatar fallasd avatar iggsn avatar jmontanaepa avatar jordimontana82 avatar kraviecc avatar mivra avatar mrjamiebowman avatar npavlov avatar pedropaulovc avatar phuocle avatar piotr-domanski avatar prohannes avatar rajyraman avatar rbnswartz avatar scubaracer avatar sejoslawmobile avatar sergeytunnik avatar shpetimhysenaj avatar slahn avatar smackodale avatar synesthesia avatar teppolainio avatar vjain90 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fake-xrm-easy's Issues

Parallelization Issues

Hey Jordi,

just found a bug when requests are executed in parallel:

When executing 10 create requests in a Parallel.ForEach loop, only one record is added to the data dictionary, although FakeItEasy reports that the CreateRequest was executed 10 times on the context.
As I see it this is a problem of using a plain dictionary for storing the data, we should better move to a Concurrent Dictionary.

What do you think about that?

Kind Regards,
Florian

Like is Case sensitive

Likes should ignore case. This Unit test should pass:

`

[Fact]
public void LocalCrmTests_LikeIsCaseInsensitive()
{
var context = new XrmFakedContext {ProxyTypesAssembly = Assembly.GetExecutingAssembly()};
var service = context.GetFakedOrganizationService();

service.Create(new Contact { FirstName = "Jimmy" });

var qe = new QueryExpression("contact");
qe.Criteria.AddCondition("firstname", ConditionOperator.Like, "JIM%");

Assert.Equal(1, service.RetrieveMultiple(qe).Entities.Count);

}
`

InsertOptionValueRequest not supported yet?

Hi guys,

I am trying to use Context.Execute to execute an InsertOptionValueRequest but I am getting an error casting the OrganizationResponse that comes back to an InsertOptionValueResponse. Error below:

Unable to cast object of type 'Microsoft.Xrm.Sdk.OrganizationResponse' to type 'Microsoft.Xrm.Sdk.Messages.InsertOptionValueResponse'.

Any ideas?

Cheers,

Ken

PrimaryEntityName return ""

My plugin code here

public void Execute(IServiceProvider serviceProvider) { var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); if (context == null) throw new InvalidPluginExecutionException("Initialize IPluginExecutionContext fail."); var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); if (serviceFactory == null) throw new InvalidPluginExecutionException("Initialize IOrganizationServiceFactory fail."); var service = serviceFactory.CreateOrganizationService(context.UserId); if (service == null) throw new InvalidPluginExecutionException("Initialize IOrganizationService fail."); var tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); if (tracing == null) throw new InvalidPluginExecutionException("Initialize ITracingService fail."); if (context.PrimaryEntityName.ToLower() != "Account".ToLower()) throw new InvalidPluginExecutionException("PrimaryEntityName does not equals Account"); if (context.MessageName.ToLower() != "Create".ToLower()) throw new InvalidPluginExecutionException("MessageName does not equals Create"); if (context.Stage != 20) throw new InvalidPluginExecutionException("Stage does not equals PreOperation"); ExecutePlugin(context, service, tracing); }

My Test

public void Test1() { var context = new XrmFakedContext(); var pluginContext = context.GetDefaultPluginContext(); pluginContext.PrimaryEntityName = "Account"; pluginContext.MessageName = "Create"; pluginContext.Stage = 20; var entity = new Entity(); context.ExecutePluginWith<PreAccountCreate>(pluginContext); Assert.True(true); }

I assigned PrimaryEntityName = "Account" but in the context it return ""

Messagename and Stage OK

Thanks

Implement Create and Delete Request

Hey Jordi,

Since the Organization Service Context also sends Create and Delete requests when doing those actions, those requests should be implemented.
Will do that and send a PR.

Kind Regards,
Florian

SharedVariables.Add

When using SharedVariables.Add() during unit test of a plugin.

The shared variables do not seem to be being added to the Faked PluginContext Shared Variables collection.

Automate Build

Hey Jordi,

how would you like it, if I created a FAKE (F# Make: https://github.com/fsharp/FAKE) Build Script that we could use for attaching this project into a CI and run builds and Nuget package creation automatically on each commit?

Kind Regards,
DigitalFlow

How to pass in Default Code Activity Context?

I'm struggling to pass a default Code Activity Context from my unit test case method.
Please help me with an example of how to pass a mocked Code Activty context while making an ExecuteCodeActivity(PrimaryEntity, inputs) call.
In my code activity, I'm trying to get the context.IntitiatingUserId, which is failing with null object exception.

Images for NuGet package

Hi guys @DigitalFlow , @crisfervil, @kmjones77

I was spending some time on a logo for the NuGet package.

Which one of these would you prefer? : )

Logo 1:
fakexrmeasy

Logo 2:
fakexrmeasy2

Logo3:
fakexrmeasy3

It's a pitty only PNG files of 64x64 can be uploaded cause the SVG version look way better than these ones! : (

Nested LinkEntities in QueryExpression

I am expecting to see both queries below return 1 result. The 1st query behaves as expected however when adding the nested LinkEntity I get no results. Apologies in advance if this is a silly mistake or a misunderstanding on my part.

        // create a contact
        var contact = new Entity
            {
                LogicalName = "contact",
                Id = Guid.NewGuid(),
            };

        // link a child to the contact
        var child = new Entity
            {
                LogicalName = "child",
                Id = Guid.NewGuid(),
                Attributes = new AttributeCollection {{"contactid", new EntityReference("contact", contact.Id)}}
            };

        // link a pet to the child
        var pet = new Entity
            {
                LogicalName = "pet",
                Id = Guid.NewGuid(),
                Attributes = new AttributeCollection {{"childid", new EntityReference("child", child.Id)}}
            };

        // initialise
        var context = new XrmFakedContext();
        context.Initialize(new[] {contact, child, pet});
        var service = context.GetFakedOrganizationService();

        // 1st Query: join contact and child
        var query1 = new QueryExpression("contact");
        var link1 = query1.AddLink("child", "contactid", "contactid", JoinOperator.Inner);

        var count1 = service.RetrieveMultiple(query1).Entities.Count;
        Console.WriteLine(count1); // returns 1 record (expected)

        // 2nd Query: join contact and child and pet
        var query2 = new QueryExpression("contact");
        var link2 = query2.AddLink("child", "contactid", "contactid", JoinOperator.Inner);
        var link22 = link2.AddLink("pet", "childid", "childid", JoinOperator.Inner);

        var count2 = service.RetrieveMultiple(query2).Entities.Count;
        Console.WriteLine(count2); // returns 0 records (unexpected?)

Add associate / disassociate fake messages implementation

Although we can fake 1:N and N:1 relationships by just using EntityReference attributes with the current version of the framework, N:N relationships are created using a special Associate / Disassociate message from the OrganizationService and we don't have fake methods for these yet.

In order to keep it simple, we could just store an array of relationships in the XrmFakedContext, so that we could initialize the minimum set of relationships for each test.

public class XrmFakedContext {
...
   public Dictionary<string, XrmFakedRelationship> Relationships {get; set;}


...
}


public class XrmFakedRelationship {
   public string SchemaName {get;set;}
   public string EntityName {get;set;}  //of the many to many intersect entity

   //Entity name and attribute of the first entity participating in the relationship
   public string ReferencedEntityName1 {get;set;}   
   public string ReferencedEntityName2 {get;set;}

   //Entity name and attribute of the first entity participating in the relationship
   public string ReferencedAttributeName1 {get;set;}
   public string ReferencedAttributeName2 {get;set;}
}

So that when an Associate message is called, it needs to create new entries in the context for the EntityName involved in the N:N relationship as well as it needs to populate Entity References to the relevant entities. XrmFakedRelationship will be used to know which fields need to be updated.

Fake Calls?

Does FakeXrmEasy support Faking out an Xrm Call?  Lets say for example I have a really complicated query in my plugin that requires 4 or 5 entities to be created, but I actually want to test the update statement that comes after that.

Here is an example of how I would do it in XrmUnitTest currently:

service = new OrganizationServiceBuilder(service).WithFakeRetrieveMultiple(
    (s, q) =>
    {
        var col = new EntityCollection();
        col.Entities.Add(myEntity);
        return col;
    }).Build();

So this says, if you have a RetrieveMultiple return myEntity instead of actually performing a query

System.ArgumentException on Associate

We receive a System.ArgumentException on Associate, if the relation ship that we want to associate has the same name for Entity1Attribute and EntityAttribute2.
This needs to get fixed.

Support for version depending Requests

I've just stumpled upon the fact that at the moment there is no support for ExecuteTransactionRequest. I've then looked into the project to see, how I could implement the missing message executor for this request.

Have already thought about how version specific requests, like ExecuteTransactionRequest should be added? This specific message for example does only exist for CRM 2016 and therefore it would not make sense to place it in the shared project.

Could we for example add a Xrm2016FakedContext to the 2016 project which inherits the XrmFakedContext and adds (for example) version specific messages?

I just wanted to make sure that there are no conflicting plans regarding this topic.

edit
I have just seen that you already have compilation symbols in place. I will use them.

CRM 2016 Support

Hey Jordi,

since CRM 2016 was released we should also publish FakeXRMEasy packages supporting this version.
Do you have time for this or should I do it and send a PR?

Kind Regards

Null valued attribute is returned in Attributes collection in a different way that CRM returns

Consider following initialization:
var contact = new Contact {
FirstName = null,
LastName = "asdf"
}
var fakedContext = new XrmFakedContext();
fakedContext.Initialize( new List<Entity>{ contact });

Now when I try to retrieve that contact using something like:
QueryByAttribute query = new QueryByAttribute("contact");
query.ColumnSet = new ColumnSet("firstname", "lastname");
var results = service_.RetrieveMultiple(query);

I get one contact record which attributes collection contains:

  • "firstname": null
  • "lastname": "asdf"

When I execute following code agains real Dynamics CRM web service endpoint I get one contact record which attributes collection contains:

  • "lastname": "asdf"

So problem here is that fake-xrm-easy implementation puts incorrectly field names into Entity.Attributes collection also for fields which values are null.

Add OrganizationServiceProxy implementation

A new GetFakedOrganizationServiceProxy implementation that should return a faked OrganizationServiceProxy, which is basically the IOrganizationService plus the EnableProxyTypes method.

FetchXml with the linked query fails with a NullReferenceException.

StackTrace:

at FakeXrmEasy.XrmFakedContext.TranslateLinkedEntityFilterExpressionToExpression(LinkEntity le, ParameterExpression entity)
at FakeXrmEasy.XrmFakedContext.TranslateQueryExpressionFiltersToExpression(QueryExpression qe, ParameterExpression entity)
at FakeXrmEasy.XrmFakedContext.TranslateQueryExpressionToLinq(XrmFakedContext context, QueryExpression qe)
at FakeXrmEasy.FakeMessageExecutors.RetrieveMultipleRequestExecutor.Execute(OrganizationRequest req, XrmFakedContext ctx)

fetchXml =

"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
  <entity name='systemuser'>
    <attribute name='fullname' />
     <attribute name='systemuserid' />
     <attribute name='businessunitid' />
     <filter type='and'>
      <condition attribute='systemuserid' operator='eq' uitype='systemuser' value='#userId#' />
     </filter>
        <link-entity name='businessunit' from='businessunitid' to='businessunitid' alias='bu' intersect='true' >
            <attribute name='name' />
        </link-entity>
  </entity>
</fetch>"

Code: var UserRequest = new RetrieveMultipleRequest { Query = new FetchExpression(fetchXml.Replace("#userId#",context.InitiatingUserId.ToString())) };
var UserResponseCoreObject = ((RetrieveMultipleResponse)service.Execute(UserRequest )).EntityCollection.Entities[0]; //Failed Code ((RetrieveMultipleResponse)service.Execute(UserRequest ))

Can't extend FakedService with Fake It Easy testing functionalities

When using extensions like A.CallTo(..), I can't seem to get it to work with the FakedService. For example when trying to verify that FakedService.Retrieve(..) was called Repeated.Exactly.Once, I never pass this as it does not register against the correct IOrganizationService. What is the correct way of doing this?

BUG: FakedOrganizationService().RetrieveMultiple by FetchXml

I Initialize code

        var context = new XrmFakedContext();
        var accountId = Guid.NewGuid();
        var license1 = new Entity("pl_license");
        license1.Id = Guid.NewGuid();
        license1.Attributes["pl_no"] = 1;
        license1.Attributes["pl_accountid"] = new EntityReference("account", accountId);

        var license2 = new Entity("pl_license");
        license2.Id = Guid.NewGuid();
        license2.Attributes["pl_no"] = 2;
        license2.Attributes["pl_accountid"] = new EntityReference("account", accountId);

        context.Initialize(new List<Entity> { license1, license2 });

Write a unit test by QueryExpression and test passed

        var query = new QueryExpression();
        query.EntityName = "pl_license";
        query.ColumnSet = new ColumnSet("pl_no");
        query.Criteria.AddCondition("pl_accountid", ConditionOperator.Equal, accountId);
        var rows = context.GetFakedOrganizationService().RetrieveMultiple(query);
        Assert.Equal(rows.Entities.Count, 2);

And write unit test by FetchXml and test failed

        var fetchXml =
          "<fetch>" +
          "  <entity name='pl_license'>" +
          "     <attribute name='pl_no'/>" +
          "     <filter type='and'>" +
          "         <condition attribute='pl_accountid' operator='eq' value='{0}' />" +
          "     </filter>" +
          "  </entity>" +
          "</fetch>";
        fetchXml = string.Format(fetchXml, accountId);
        var rows = context.GetFakedOrganizationService().RetrieveMultiple(new FetchExpression(fetchXml));
        Assert.Equal(rows.Entities.Count, 2);

I get an Exception when RetrieveMultiple

Unable to cast object of type 'Microsoft.Xrm.Sdk.EntityReference' to type 'System.String'.

Now I change the code to

license1.Attributes["pl_accountid"] = accountId.ToString();
license2.Attributes["pl_accountid"] = accountId.ToString();

And the unit test FetchXml passed.

This changed code INVALID for late bound, because pl_accountid is a lookup to Account entity

Our project use a lot of FetchXml when retrieve data. Please double check.

Thanks

How to Mock IorganiationService.Retrieve & RetrieveMultiple methods

I have started using FakeXrmEasy but struggling to Mock the retrieve method of the FakedOrganisationService object. Earlier I was using in this fashion base.OrganizationServiceMock.Setup(t =>
t.Retrieve(It.Is(s => s == "systemuser"),
It.IsAny(),
It.IsAny<Microsoft.Xrm.Sdk.Query.ColumnSet>())) // don't care about a specific ColumnSet
.Returns(activeUserNameMock);
Please provide some sample on how to implement the proxy retrieve method.

Basically, In my actual plugin code, I'm retrieving the SystemUser entity for an user in this fashion:
Entity userName = service.Retrieve("systemuser", userId, new Microsoft.Xrm.Sdk.Query.ColumnSet(new[] { "domainname", "fullname" }));

Bug in Service Update

Hey Jordi,

just found a bug in the "FakeUpdate" method of XrmFakedContext.Crud:
When you send an updated Entity with the IOrganizationService.Update method, you only set those attributes if you want to change. In the FakeUpdate method you set the whole context object to the update object that was passed in, so that old values that should not have been changed by the update (and thus where not set in the update object) are being deleted.
As a fix, we should take the context object and map all fields that the update object contains onto it.
This fix should be rather easy, but I'm currently having difficulties getting the project build, since there are problems with the NuGet packages.

Kind Regards,
DigitalFlow

XrmFakedContext.Metadata.cs is missing

Hello Jordi,

thanks for your great work.
I'd like to contribute and add support for passing secure and unsecure configurations to plugin executions.
I just checked out the project, but it seems as if the XrmFakedContext.Metadata.cs file is missing from the project, so I can't build it right now.
Can you check in that file?

Kind Regards

Add support for integration tests

It would be ideal to run tests using a real organization service for integration testing purposes.

The connection string could be easily setup in the Web.config and we could add a custom test attribute to tell fake xrm easy that the test is actually an Integration test, and it will return a real organization service instance every time GetFakedOrganizationService is called (and every single method who calls this).

Something like this

[Integration]
public class MyIntegrationTests {
  [Fact]
  public void Test() {

  }

}

Here is an example about adding custom trait attributes in XUnit:

http://dennymichael.net/2015/01/23/how-to-extendmigrate-traitattribute-to-xunit-v2-and-why-has-become-sealed/

The "tricky thing" would be that, the Initialize method could actually also "sync" our test entity records against the real organization service, for the purpose of the integration test, and then do a "cleanup" or "delete" of the records created during testing.

Feature: FetchXml and Aggregate

CRM only support aggregate by FetchXml.

RetrieveMultipleRequestExecutor.Execute convert FetchXml to TranslateFetchXmlToQueryExpression then TranslateQueryExpressionToLinq

aggregate by FetchXml gone

Please support this FetchXml query.

Thanks

Retrieve optionset labels automatically based on the Generated Proxy Types

Optionset labels could be returned automatically based on the proxy types assembly which was generated from CrmSvcUtil.

More info about how to generate those here.

Once generated, we could easily retireve the associated OptionSetLabels by querying the enum names from the enum returned by the entity property using Reflection.

Example:

The StateCode property of the Incident returns a nullable IncidentState enum. Therefore, we could return the names from the enumeration as the labels.

[Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute("statecode")]
public System.Nullable<Crm.IncidentState> StateCode
    {
        get
        {
            Microsoft.Xrm.Sdk.OptionSetValue optionSet = this.GetAttributeValue<Microsoft.Xrm.Sdk.OptionSetValue>("statecode");
            if ((optionSet != null))
            {
                return ((Crm.IncidentState)(System.Enum.ToObject(typeof(Crm.IncidentState), optionSet.Value)));
            }
            else
            {
                return null;
            }
        }
    }

public enum IncidentState
{
    [System.Runtime.Serialization.EnumMemberAttribute()]
    Active = 0,

    [System.Runtime.Serialization.EnumMemberAttribute()]
    Resolved = 1,

    [System.Runtime.Serialization.EnumMemberAttribute()]
    Canceled = 2,
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.