Code Monkey home page Code Monkey logo

cloner's Introduction

Cloner

Packagist Build Status Coverage Status

A trait for Laravel Eloquent models that lets you clone a model and it's relationships, including files. Even to another database.

Installation

To get started with Cloner, use Composer to add the package to your project's dependencies:

composer require bkwld/cloner

Note: The Below step is optional in Laravel 5.5 or above!

After installing the cloner package, register the service provider.

Bkwld\Cloner\ServiceProvider::class,

in your config/app.php configuration file:

'providers' => [
    /*
    * Package Service Providers...
    */
    Bkwld\Cloner\ServiceProvider::class,
],

Usage

Your model should now look like this:

class Article extends Eloquent {

   use \Bkwld\Cloner\Cloneable;
}

You can clone an Article model like so:

$clone = Article::first()->duplicate();

In this example, $clone is a new Article that has been saved to the database. To clone to a different database:

$clone = Article::first()->duplicateTo('production');

Where production is the connection name of a different Laravel database connection.

Cloning Relationships

Lets say your Article has many Photos (a one to many relationship) and can have more than one Authors (a many to many relationship). Now, your Article model should look like this:

class Article extends Eloquent {
   use \Bkwld\Cloner\Cloneable;

   protected $cloneable_relations = ['photos', 'authors'];

   public function photos() {
       return $this->hasMany('Photo');
   }

   public function authors() {
        return $this->belongsToMany('Author');
   }
}

The $cloneable_relations informs the Cloneable as to which relations it should follow when cloning. Now when you call Article::first()->duplicate(), all of the Photo rows of the original will be copied and associated with the new Article. And new pivot rows will be created associating the new Article with the Authors of the original (because it is a many to many relationship, no new Author rows are created). Furthermore, if the Photo model has many of some other model, you can specify $cloneable_relations in its class and Cloner will continue replicating them as well.

Note: Many to many relationships will not be cloned to a different database because the related instance may not exist in the other database or could have a different primary key.

Customizing the cloned attributes

By default, Cloner does not copy the id (or whatever you've defined as the key for the model) field; it assumes a new value will be auto-incremented. It also does not copy the created_at or updated_at. You can add additional attributes to ignore as follows:

class Photo extends Eloquent {
   use \Bkwld\Cloner\Cloneable;

   protected $clone_exempt_attributes = ['uid', 'source'];

   public function article() {
        return $this->belongsTo('Article');
   }

   public function onCloning($src, $child = null) {
        $this->uid = str_random();
        if($child) echo 'This was cloned as a relation!';
        echo 'The original key is: '.$src->getKey();
   }
}

The $clone_exempt_attributes adds to the defaults. If you want to replace the defaults altogether, override the trait's getCloneExemptAttributes() method and return an array.

Also, note the onCloning() method in the example. It is being used to make sure a unique column stays unique. The Cloneable trait adds to no-op callbacks that get called immediately before a model is saved during a duplication and immediately after: onCloning() and onCloned(). The $child parameter allows you to customize the behavior based on if it's being cloned as a relation or direct.

In addition, Cloner fires the following Laravel events during cloning:

  • cloner::cloning: ModelClass
  • cloner::cloned: ModelClass

ModelClass is the classpath of the model being cloned. The event payload contains the clone and the original model instances.

Cloning files

If your model references files saved disk, you'll probably want to duplicate those files and update the references. Otherwise, if the clone is deleted and it cascades delets, you will delete files referenced by your original model. Cloner allows you to specify a file attachment adapter and ships with support for Bkwld\Upchuck. Here's some example usage:

class Photo extends Eloquent {
   use \Bkwld\Cloner\Cloneable;

   protected $cloneable_file_attributes = ['image'];

   public function article() {
        return $this->belongsTo('Article');
   }
}

The $cloneable_file_attributes property is used by the Cloneable trait to identify which columns contain files. Their values are passed to the attachment adapter, which is responsible for duplicating the files and returning the path to the new file.

If you don't use Bkwld\Upchuck you can write your own implementation of the Bkwld\Cloner\AttachmentAdapter trait and wrap it in a Laravel IoC container named 'cloner.attachment-adapter'. For instance, put this in your app/start/global.php:

App::singleton('cloner.attachment-adapter', function($app) {
   return new CustomAttachmentAdapter;
});

cloner's People

Contributors

ben-everly avatar c17r avatar denisdulici avatar denitsa-md avatar dragonfire1119 avatar ecointest avatar eriksanders86 avatar florianw208 avatar fotrino avatar fridzema avatar imanghafoori1 avatar korridor avatar laravel-shift avatar pavel-mironchik avatar putr avatar rasmuscnielsen avatar realrashid avatar ricardosierra avatar sebastianschoeps avatar ukeloop avatar weotch avatar wimski 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

cloner's Issues

Cloning into another database

Hello,
I am trying to clone into another database.
$duplicate = Ticket::where('id',$id)->first()->setConnection('mysql2')->duplicate();
but it will not duplicate into the other database and duplicates to the default database. Please tell me how I can duplicate into another database.

Laravel 8 compatiblity?

I'm quessing only this line in composer.json needs an addition of |^8.0:

"illuminate/support": "^5.5|^6.0|^7.0"

but I've decided to not upgrade yet, so I have not tested it.

Change some fields during copying

Is there any way we can customize some fields while cloning.
As mention on #18 We can customize the fields with onCloning method, But is there any way we can completely override some fields based on some inputs.

Use case:
We have predefined template in the system with a column type=system-defined, when user clone the template it should store type=user-defined,
But when we clone from admin panel it should store type=system-defined.

It means we need to pass some fields to onCloning methods based on user actions/inputs.

update foreign IDs

Is there a way to clone a model with a relation, but on the related model also update another ID column to match the equivalent cloned model's ID?

e.g.
Say you have Section containing many Posts and Comments. A post has many comments. But a comment also belongsTo a different post in that section:

Table: comments
id | post_id | related_post_id

Clone a section & Posts, with comments (straight forward)

But then if I make the relatedPost relationship cloneable, yes it updates the related_post_id in the new comment row, but it also creates a new clone of that post too. How can I get it to just change the foreign_id without creating double posts?

Cloneable undefined

Hello, I'm running Laravel 5.4 and for some reason the classes are not picked up.

I installed as normal via composer and it worked. I then add the following to app.php in config:

// app.php'providers' => [
  …
  Bkwld\Cloner\ServiceProvider::class,
  …
]

When I then add:

// Option.php

<?php

namespace App;

use Eloquent;

class Option extends Eloquent {
    
    use Bkwld\Cloner\Cloneable;

to my model I get the following error message Trait 'App\Bkwld\Cloner\Cloneable' not found.

What am I doing wrong?

Application::make() should not be called statically

In Laravel 7 when i call the duplicate method the error happen:

Non-static method Illuminate\Foundation\Application::make() should not be called statically

The error happen because the App used note the Facade

Need to replace this line in Cloneable trait:

// Deps
use App;

With this

// Deps
use Illuminate\Support\Facades\App;

Duplicate attachment from original model

When duplicating an attachment, the attachment of the clone is used as a reference (line 92).

cloner/src/Cloner.php

Lines 89 to 95 in d9c92a1

protected function duplicateAttachments($clone) {
if (!$this->attachment || !method_exists($clone, 'getCloneableFileAttributes')) return;
foreach($clone->getCloneableFileAttributes() as $attribute) {
if (!$original = $clone->getAttribute($attribute)) continue;
$clone->setAttribute($attribute, $this->attachment->duplicate($original));
}
}

This probably doesn't matter in most cases, but it does with the attachment handler I use. This handler will for example generate the path based on properties of the model, like its key/ID. So in my adapter I cannot get the path of the current existing attachment, because the key is different in the clone.

Duplicating from the original model instead of the clone fixes my issue. It also seems more logical to me to duplicate from an original instead from a clone (which should only receive the duplicate).

withCount columns should not be included in the cloning by default

I have a column in the withCount property on my model:

protected $withCount = ['publications'];

When I call duplicate, cloner tries to insert that column in the table and naturally throws an sql error.

This is fixed if I add the column to $clone_exempt_attributes.

But those columns should not be included in the cloning by default because they are computed columns.

Laravel 6

Are you planning to support Laravel 6?

Problem with polymorphic relations

I want to clone a parent model that has relations like these:
relation_1 => hasMany
relation_2 => hasMany
relation_3 => hasMany
The relation_3 itself has polymorphic relation with relation_1 or relation_2.
So if I tell the cloner to clone the parent model with all relations, the cloned relation_3 has a polymorphic connection with the old one.
Also, if we add it to the cloneable_relations attribute, it cloned a new model, while it should just update relation with the cloned model that created when we cloned parent relations.

Clone relationship with additional pivot data?

Hi
as I say in the title, is possible to accomplish this?
I have a morphToMany relationship and I save additional data, like in this example from the Laravel docs:

$user->roles()->attach($roleId, ['expires' => $expires]);

If I use the duplicate() function it duplicates the relationship but the additional data is not copied.

Any ideas for this?

Thanks and great job with this package!

How to replicate WITH `hasMany()` relationship and `unique()` attribute

Welcome,

I have installed this awesome package, then I used Cloneable trait in User model. I have Post model also and every user hasMany posts and every post belongsTo one user WITH a unique title....as my code show

....

class Post extends Model
{
    use Cloneable;

    protected $fillable = [
        'title',
        'body',
        'user_id',
    ];

    public function user()
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

    public function onCloning($src, $child = null)
    {
        $faker = Faker::create($this);

        $src['title'] = $faker->unique()->name;
    }
}
...

class User extends Authenticatable
{
    ....
    use Cloneable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    ...

    protected $cloneable_relations = ['posts'];

    public function posts()
    {
        return $this->hasMany(Post::class, 'user_id', 'id');
    }
}

When I try to clone the post, this operation is successful, BUT when I try to clone the user this ERROR SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'testing' for key 'posts_title_unique' (SQL: insert into 'posts' ('title', 'body', 'user_id', 'updated_at', 'created_at') values (testing, wesdfdsfffsdf, 54, 2021-07-14 15:00:54, 2021-07-14 15:00:54)) triggered

I know that the solution is to try to change the title while cloning, BUT I do NOT know how can I do it (I have tried onCloning() method BUT WITHOUT avail)

Clone BelongsToMany relation: Add new rows

Hello,

I got this model:

<?php

namespace App;

[...]

class Item extends Model
{
    use Cloneable;

    protected $cloneable_relations = ['category', 'children'];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    /**
     * @return \Illuminate\Database\Eloquent\Relations\belongsToMany
     */
    public function children(): belongsToMany
    {
        return $this->belongsToMany(Child::class)
            ->withPivot('value')->withTimestamps();
    }

}

Now if I do Item::first()->duplicate(), the category is cloned as new row - but the children are not. I understand the docs that tell me that this is not possible on many to many: But it would be nice if it would be optional. Any ideas on that?

Adjacency list parent_id duplication messes up tree

This is a bit of a longshot here, I'm using the laravel-adjacency-list package in my project. This package works by having a column on a model called parent_id, which when null denotes a root level item, then, models below it, loaded in via a children relationship may have an unlimited depth.

I have three models:

  • MarketingAutomation
  • MarketingAutomationAction
  • MarketingAutomationActionCondition

Based on these models, the MarketingAutomationAction is the model which contains the parent_id table and functionality around that package. In addition, this model also a foreign id column to marketing_automation_id.

MarketingAutomationActionCondition models are linked to actions. So in the end, we may end up with the following hierarchy:

  • Marketing automation
    • Marketing automation action
      • Marketing automation action condition
      • Marketing automation action condition
    • Marketing automation action
      • Marketing automation action
        • Marketing automation action condition
      • Marketing automation action
        • Marketing automation action
    • Marketing automation action

I've put \Bkwld\Cloner\Cloneable on all three of these models, then, I've added the following to each:

MarketingAutomation

protected $cloneable_relations = ['actions'];

MarketingAutomationAction

protected $cloneable_relations = ['children', 'conditions'];

When I attempt to clone an automation using MarketingAutomation::find(1)->duplicate(), the table structure of the. MarketingAutomationAction gets completely messed up, the parent_id column doesn't know how to relate to another model etc.

Any way to resolve this?

Any way to get original id using onCloning function?

The thing is, that I'm cloning relationships of relationships of relationships...

I'm using onCloning function to set up correct parent_id's.

I'm trying to save original_id and original_parent_id using onCloning function. But in this function I'm not able to get original id of clonable model.

Any thoughts?

Nested cloning?

Hello! Thanks for publishing this package.

We have a situation where we have an event that has many days and those days have dynamicContent. In order to clone a day we would need to diplicate the day and all of its content. Is there a way to do that?

Thanks again!

Laravel dependency

Hi,

I'm using Eloquent ouside Laravel, and I found this useful package. In composer.json there are no dependency on the laravel framework, only on illuminate/support, but in Cloneable.php there's a dependency on App which i think is a reference to illuminate/foundation:

	/**
	 * Clone the current model instance
	 *
	 * @return Illuminate\Database\Eloquent\Model The new, saved clone
	 */
	public function duplicate() {
		return App::make('cloner')->duplicate($this);
	}

	/**
	 * Clone the current model instance to a specific Laravel database connection
	 *
	 * @param  string $connection A Laravel database connection
	 * @return Illuminate\Database\Eloquent\Model The new, saved clone
	 */
	public function duplicateTo($connection) {
		return App::make('cloner')->duplicateTo($this, $connection);
	}

It would be good if we could remove that dependency, as then this package would be usable outside laravel. I'm willing to provide a PR but I'm not familiar with laravel's dependency resolver, but maybe we could replace it with something like

use Illuminate\Container\Container;

public function duplicate() {
    return Container::getInstance()->make('Bkwld\Cloner\Cloner')->duplicate($this);
}

I'm overloading the duplicate() function of the Cloneable trait and it seems to work correctly.

Also there's a dependency on illuminate\events that should be added to composer.json

Can't clone the 'BelongsTo' relation

Say we have a model with a BelongsTo relation, which is added to the $cloneable_relations. When duplicating such a model an exception is being thrown:

BadMethodCallException
Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsTo::save()

Bad Method Call
Did you mean Illuminate\Database\Eloquent\Relations\BelongsTo::associate() ?

Getting View doesnt exist

( ! ) Fatal error: Uncaught ReflectionException: Class view does not exist in ../Container.php on line 752

if i remove the line:
Bkwld\Cloner\ServiceProvider, from config/app.php I dont get this error so I know its to do with this repo... debug_backtrace doesnt help.. only shows all files relating to laravel which is strange

Laravel 5 Support

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for bkwld/cloner ^1.0 -> satisfiable by bkwld/cloner[1.0.0].
    - Conclusion: remove laravel/framework v5.1.27
    - Conclusion: don't install laravel/framework v5.1.27
    - bkwld/cloner 1.0.0 requires illuminate/support ~4.0 -> satisfiable by illuminate/support[4.0.x-dev, 4.1.x-dev, 4.2.x-dev, v4.0.0, v4.0.0-BETA2, v4.0.0-BETA3, v4.0.0-BETA4, v4.0.1, v4.0.10, v4.0.2, v4.0.3, v4.0.4, v4.0.5, v4.0.6, v4.0.7, v4.0.8, v4.0.9, v4.1.0, v4.1.1, v4.1.10, v4.1.11, v4.1.12, v4.1.13, v4.1.14, v4.1.15, v4.1.16, v4.1.17, v4.1.18, v4.1.19, v4.1.2, v4.1.20, v4.1.21, v4.1.22, v4.1.23, v4.1.24, v4.1.25, v4.1.26, v4.1.27, v4.1.28, v4.1.29, v4.1.3, v4.1.30, v4.1.4, v4.1.5, v4.1.6, v4.1.7, v4.1.8, v4.1.9, v4.2.0-BETA1, v4.2.1, v4.2.12, v4.2.16, v4.2.17, v4.2.2, v4.2.3, v4.2.4, v4.2.5, v4.2.6, v4.2.7, v4.2.8, v4.2.9], laravel/framework[4.0.x-dev, 4.1.x-dev, 4.2.x-dev].
    - Can only install one of: laravel/framework[4.0.x-dev, v5.1.27].
    - Can only install one of: laravel/framework[4.1.x-dev, v5.1.27].
    - Can only install one of: laravel/framework[4.2.x-dev, v5.1.27].
    - don't install illuminate/support 4.0.x-dev|don't install laravel/framework v5.1.27
    - don't install illuminate/support 4.1.x-dev|don't install laravel/framework v5.1.27
    - don't install illuminate/support 4.2.x-dev|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.0|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.0-BETA2|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.0-BETA3|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.0-BETA4|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.1|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.10|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.2|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.3|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.4|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.5|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.6|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.7|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.8|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.0.9|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.0|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.1|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.10|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.11|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.12|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.13|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.14|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.15|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.16|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.17|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.18|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.19|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.2|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.20|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.21|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.22|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.23|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.24|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.25|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.26|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.27|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.28|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.29|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.3|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.30|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.4|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.5|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.6|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.7|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.8|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.1.9|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.0-BETA1|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.1|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.12|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.16|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.17|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.2|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.3|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.4|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.5|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.6|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.7|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.8|don't install laravel/framework v5.1.27
    - don't install illuminate/support v4.2.9|don't install laravel/framework v5.1.27
    - Installation request for laravel/framework == 5.1.27.0 -> satisfiable by laravel/framework[v5.1.27].


Installation failed, reverting ./composer.json to its original content.

Nested relations

How i can add nested relations in $cloneable_relations?

now i use this
protected $cloneable_relations = [ 'domains', 'technology_experience.technology.technology_category', 'technology_experience.category', 'projects', 'projects.roles', 'foreign_languages', 'certifications' ];

Self Relational Clone

Is there anyway to clone a model that has a self relational field:

id
parent_id

If I set up the protected $cloneable_relations property It doubles up on everything. If i keep that off, it doesn't update the parent_id and keeps it the same as the original element.

Any ideas on how to accomplish this?

Thanks

onCloned

i dont know if i understand it wrong, but onCloned is called to early and also it should have the new model as an argument.

When i clone a model with relations after its cloned i want change some of the data on the new relation. But the new relation is not yet cloned neither

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.