You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2016/10/24 13:06:01 UTC

[16/83] [abbrv] usergrid git commit: Moving older SDKs to a difference location and updating main README to link to new SDK locations.

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/src/Native/Facades/Usergrid.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/src/Native/Facades/Usergrid.php b/sdks/other/php5/apache-usergrid/src/Native/Facades/Usergrid.php
new file mode 100644
index 0000000..fbfcffe
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/src/Native/Facades/Usergrid.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Native\Facades;
+
+
+use Apache\Usergrid\Native\UsergridBootstrapper;
+
+/**
+ * Class Usergrid
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class Usergrid
+{
+    /**
+     * The Native Bootstrap instance.
+     *
+     * @var \Apache\Usergrid\Native\UsergridBootstrapper
+     */
+    protected static $instance;
+    /**
+     * The Usergrid API instance.
+     *
+     * @var \Apache\Usergrid\Api\Usergrid
+     */
+    protected $usergrid;
+
+    /**
+     * Constructor.
+     *
+     * @param  \Apache\Usergrid\Native\UsergridBootstrapper $bootstraper
+     * @return \Apache\Usergrid\Native\Facades\Usergrid
+     */
+    public function __construct(UsergridBootstrapper $bootstraper = null)
+    {
+        if (!$bootstraper) {
+            $bootstraper = new UsergridBootstrapper;
+        }
+
+        $this->usergrid = $bootstraper->createUsergrid();
+    }
+
+    /**
+     * Handle dynamic, static calls to the object.
+     *
+     * @param  string $method
+     * @param  array $args
+     * @return mixed
+     */
+    public static function __callStatic($method, $args)
+    {
+        $instance = static::instance()->getUsergrid();
+
+        switch (count($args)) {
+            case 0:
+                return $instance->{$method}();
+
+            case 1:
+                return $instance->{$method}($args[0]);
+
+            case 2:
+                return $instance->{$method}($args[0], $args[1]);
+
+            case 3:
+                return $instance->{$method}($args[0], $args[1], $args[2]);
+
+            case 4:
+                return $instance->{$method}($args[0], $args[1], $args[2], $args[3]);
+
+            default:
+                return call_user_func_array([$instance, $method], $args);
+        }
+    }
+
+    /**
+     * Creates a new Native Bootstraper instance.
+     *
+     * @param  \Apache\Usergrid\Native\UsergridBootstrapper $bootstrapper
+     * @return static
+     */
+    public static function instance(UsergridBootstrapper $bootstrapper = null)
+    {
+        if (static::$instance === null) {
+            static::$instance = new static($bootstrapper);
+        }
+
+        return static::$instance;
+    }
+
+    /**
+     * Returns the Usergrid API instance.
+     *
+     * @return \Apache\Usergrid\Api\Usergrid
+     */
+    public function getUsergrid()
+    {
+        return $this->usergrid;
+    }
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/src/Native/UsergridBootstrapper.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/src/Native/UsergridBootstrapper.php b/sdks/other/php5/apache-usergrid/src/Native/UsergridBootstrapper.php
new file mode 100644
index 0000000..0f71b78
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/src/Native/UsergridBootstrapper.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Native;
+
+
+use Apache\Usergrid\Api\Usergrid;
+use Apache\Usergrid\Guzzle\Plugin\Oauth2\GrantType\ClientCredentials;
+use Apache\Usergrid\Guzzle\Plugin\Oauth2\GrantType\PasswordCredentials;
+use Apache\Usergrid\Guzzle\Plugin\Oauth2\GrantType\RefreshToken;
+use Apache\Usergrid\Guzzle\Plugin\Oauth2\Oauth2Plugin;
+use Guzzle\Http\Client;
+
+/**
+ * Class UsergridBootstrapper
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class UsergridBootstrapper
+{
+    /**
+     * The Usergrid configuration.
+     *
+     * @var array
+     */
+    protected $config;
+
+    /**
+     * The Oauth2 Plugin.
+     *
+     * @var \Apache\Usergrid\Guzzle\Plugin\Oauth2\Oauth2Plugin
+     */
+    protected $oauth2Plugin = null;
+
+    /**
+     * Constructor.
+     *
+     * @param  mixed $config
+     * @return \Apache\Usergrid\Native\UsergridBootstrapper
+     */
+    public function __construct($config = null)
+    {
+        $this->config = $config ?: new ConfigRepository($config);
+    }
+
+    /**
+     * Creates the Usergrid instance.
+     *
+     * @return \Apache\Usergrid\Api\Usergrid
+     */
+    public function createUsergrid()
+    {
+        $baseUrl = array_get($this->config, 'usergrid.url');
+
+        $orgName = array_get($this->config, 'usergrid.orgName');
+
+        $appName = array_get($this->config, 'usergrid.appName');
+
+        $manifestPath = array_get($this->config, 'usergrid.manifestPath');
+
+        $version = array_get($this->config, 'usergrid.version');
+
+        $enable_oauth2_plugin = array_get($this->config, 'usergrid.enable_oauth2_plugin');
+
+        //check if user wants to manage there own Oauth 2 auth flow
+        if ($enable_oauth2_plugin) {
+
+            $this->createOauth2Plugin();
+
+            return new Usergrid($orgName, $appName, $manifestPath, $version, $baseUrl, $this->oauth2Plugin);
+        } else {
+            return new Usergrid($orgName, $appName, $manifestPath, $version, $baseUrl);
+        }
+
+    }
+
+    private function createOauth2Plugin()
+    {
+        $base_url = array_get($this->config, 'usergrid.url');
+
+        $client_id = array_get($this->config, 'usergrid.clientId');
+
+        $client_secret = array_get($this->config, 'usergrid.clientSecret');
+
+        $grant_type = array_get($this->config, 'usergrid.grant_type');
+
+        $auth_type = array_get($this->config, 'usergrid.auth_type');
+
+        $username = array_get($this->config, 'usergrid.username');
+
+        $password = array_get($this->config, 'usergrid.password');
+
+
+        $org_name = array_get($this->config, 'usergrid.orgName');
+
+        $app_name = array_get($this->config, 'usergrid.appName');
+
+        if ($auth_type == 'organization') {
+
+            $url = $base_url . '/management/token';
+
+        } elseif ($auth_type == 'application') {
+            $url = $base_url . '/' . $org_name . '/' . $app_name . '/token';
+        }
+
+        $oauth2Client = new Client($url);
+
+
+        if ($grant_type == 'client_credentials') {
+            $config = [
+                'client_id' => $client_id,
+                'client_secret' => $client_secret,
+
+            ];
+            $grantType = new ClientCredentials($oauth2Client, $config);
+            $refreshTokenGrantType = new RefreshToken($oauth2Client, $config);
+            $this->oauth2Plugin = new Oauth2Plugin($grantType, $refreshTokenGrantType);
+
+        } elseif ($grant_type == 'password') {
+            $config = [
+                'username' => $username,
+                'password' => $password,
+                'client_id' => $client_id,
+                'client_secret' => $client_secret
+            ];
+            $grantType = new PasswordCredentials($oauth2Client, $config);
+            $refreshTokenGrantType = new RefreshToken($oauth2Client, $config);
+            $this->oauth2Plugin = new Oauth2Plugin($grantType, $refreshTokenGrantType);
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/src/config/config.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/src/config/config.php b/sdks/other/php5/apache-usergrid/src/config/config.php
new file mode 100644
index 0000000..75a886f
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/src/config/config.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+return [
+
+    'usergrid' => [
+
+        'url' => 'https://api.usergrid.com',
+        'version' => '1.0.0',
+        'orgName' => null,
+        'appName' => null,
+        'manifestPath' => null,
+        //its better not to set the real values here if using laravel set them in a .env file or
+        // if your not using Laravel set them as environment variable and include them here using $_ENV global.
+        // so that way you can be sure not to commit privates ID to a public repo
+        'clientId' => null,
+        'clientSecret' => null,
+        'username' => null,
+        'password' => null,
+        /**
+         * The Auth Type setting is the Oauth 2 end point you want to get the OAuth 2
+         * Token from.  You have two options here one is 'application' the other is 'organization'
+         *
+         *  organization will get the the token from http://example.com/management using  client_credentials or password grant type
+         *  application will get the token from http://example.com/managment/org_name/app_name using client_credentials or password grant type
+         */
+        'auth_type' => 'organization',
+        /** The Grant Type to use
+         *
+         * This has to be set to one of the 2 grant types that Apache Usergrid
+         * supports which at the moment is client_credentials or password but at
+         * 2 level organization or application
+         */
+        'grant_type' => 'client_credentials',
+        /**
+         * if you want to manage your own auth flow by calling the token api and setting the token your self just set this to false
+         * */
+        'enable_oauth2_plugin' => true
+    ]
+];

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/ApplicationTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/ApplicationTest.php b/sdks/other/php5/apache-usergrid/tests/Api/ApplicationTest.php
new file mode 100644
index 0000000..d25a205
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/ApplicationTest.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api;
+
+
+use Apache\Usergrid\Api\Exception\UsergridException;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class ApplicationTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class ApplicationTest extends PHPUnit_Framework_TestCase
+{
+
+    /**
+     * Usergrid client
+     *
+     * @var Usergrid $usergrid
+     */
+    protected $usergrid;
+
+    protected $config;
+
+    /**
+     *
+     */
+    public function setUp()
+    {
+        $this->usergrid = $GLOBALS['usergrid'];
+    }
+
+    /**
+     * @test
+     * @group internet
+     */
+    public function it_can_get_entity()
+    {
+
+        $error = null;
+
+        try {
+            $this->usergrid->application()->EntityGet(['collection' => 'users']);
+        } catch (UsergridException  $e) {
+            $error = $e;
+        }
+
+        $this->assertNull($error, 'Exception should be null');
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/AttributeTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/AttributeTest.php b/sdks/other/php5/apache-usergrid/tests/Api/AttributeTest.php
new file mode 100644
index 0000000..cc1f29e
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/AttributeTest.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api;
+
+
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class AttributeTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class AttributeTest extends PHPUnit_Framework_TestCase
+{
+    /** @var  Usergrid Api Client */
+    protected $usergrid;
+
+
+    /**
+     * Setup resources and dependencies
+     *
+     * @return void
+     */
+    public function setup()
+    {
+        $this->usergrid = $GLOBALS['usergrid'];
+    }
+
+    /**
+     * @test
+     * @group internet
+     */
+    public function it_should_have_attribute()
+    {
+        $this->assertTrue(method_exists('Apache\Usergrid\Api\Models\User', 'deviceAttribute'),
+            'Class does not have method Attribute Method'
+        );
+    }
+}
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/Exception/BadRequestExceptionTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/Exception/BadRequestExceptionTest.php b/sdks/other/php5/apache-usergrid/tests/Api/Exception/BadRequestExceptionTest.php
new file mode 100644
index 0000000..b716e3d
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/Exception/BadRequestExceptionTest.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api\Exception;
+
+use Apache\Usergrid\Api\Exception\BadRequestException;
+use Guzzle\Http\Message\Response;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class BadRequestExceptionTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class BadRequestExceptionTest extends PHPUnit_Framework_TestCase
+{
+
+    /** @test */
+    public function it_can_create_the_exception()
+    {
+        $command = $this->getMock('Guzzle\Service\Command\CommandInterface');
+        $command
+            ->expects($this->once())
+            ->method('getRequest')
+            ->will($this->returnValue(
+                $this->getMock('Guzzle\Http\Message\Request', [], [], '', false)
+            ));
+
+        $response = new Response(400);
+        $response->setBody('');
+
+        /** @noinspection PhpParamsInspection */
+        $exception = BadRequestException::fromCommand($command, $response);
+
+        $this->assertInstanceOf(
+            'Apache\Usergrid\Api\Exception\BadRequestException',
+            $exception
+        );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/Exception/InvalidIdExceptionTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/Exception/InvalidIdExceptionTest.php b/sdks/other/php5/apache-usergrid/tests/Api/Exception/InvalidIdExceptionTest.php
new file mode 100644
index 0000000..b74aa64
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/Exception/InvalidIdExceptionTest.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api\Exception;
+
+use Apache\Usergrid\Api\Exception\InvalidIdException;
+use Guzzle\Http\Message\Response;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class InvalidIdExceptionTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class InvalidIdExceptionTest extends PHPUnit_Framework_TestCase
+{
+    /** @test */
+    public function it_can_create_the_exception()
+    {
+        $command = $this->getMock('Guzzle\Service\Command\CommandInterface');
+        $command
+            ->expects($this->once())
+            ->method('getRequest')
+            ->will($this->returnValue(
+                $this->getMock('Guzzle\Http\Message\Request', [], [], '', false)
+            ));
+
+        $response = new Response(400);
+        $response->setBody('');
+
+        /** @noinspection PhpParamsInspection */
+        $exception = InvalidIdException::fromCommand($command, $response);
+
+        $this->assertInstanceOf(
+            'Apache\Usergrid\Api\Exception\InvalidIdException',
+            $exception
+        );
+    }
+
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/Exception/NotFoundExceptionTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/Exception/NotFoundExceptionTest.php b/sdks/other/php5/apache-usergrid/tests/Api/Exception/NotFoundExceptionTest.php
new file mode 100644
index 0000000..c264751
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/Exception/NotFoundExceptionTest.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api\Exception;
+
+use Apache\Usergrid\Api\Exception\NotFoundException;
+use Guzzle\Http\Message\Response;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class UnauthorizedExceptionTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class NotFoundExceptionTest extends PHPUnit_Framework_TestCase
+{
+    /** @test */
+    public function it_can_create_the_exception()
+    {
+        $command = $this->getMock('Guzzle\Service\Command\CommandInterface');
+        $command
+            ->expects($this->once())
+            ->method('getRequest')
+            ->will($this->returnValue(
+                $this->getMock('Guzzle\Http\Message\Request', [], [], '', false)
+            ));
+
+        $response = new Response(404);
+        $response->setBody('');
+
+        /** @noinspection PhpParamsInspection */
+        $exception = NotFoundException::fromCommand($command, $response);
+
+        $this->assertInstanceOf(
+            'Apache\Usergrid\Api\Exception\NotFoundException',
+            $exception
+        );
+    }
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/Exception/ServerErrorExceptionTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/Exception/ServerErrorExceptionTest.php b/sdks/other/php5/apache-usergrid/tests/Api/Exception/ServerErrorExceptionTest.php
new file mode 100644
index 0000000..514288f
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/Exception/ServerErrorExceptionTest.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api\Exception;
+
+use Apache\Usergrid\Api\Exception\ServerErrorException;
+use Guzzle\Http\Message\Response;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class ServerErrorException
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class ServerErrorExceptionTest extends PHPUnit_Framework_TestCase
+{
+    /** @test */
+    public function it_can_create_the_exception()
+    {
+        $command = $this->getMock('Guzzle\Service\Command\CommandInterface');
+        $command
+            ->expects($this->once())
+            ->method('getRequest')
+            ->will($this->returnValue(
+                $this->getMock('Guzzle\Http\Message\Request', [], [], '', false)
+            ));
+
+        $response = new Response(400);
+        $response->setBody('');
+
+        /** @noinspection PhpParamsInspection */
+        $exception = ServerErrorException::fromCommand($command, $response);
+
+        $this->assertInstanceOf(
+            'Apache\Usergrid\Api\Exception\ServerErrorException',
+            $exception
+        );
+    }
+
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/Exception/UnauthorizedExceptionTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/Exception/UnauthorizedExceptionTest.php b/sdks/other/php5/apache-usergrid/tests/Api/Exception/UnauthorizedExceptionTest.php
new file mode 100644
index 0000000..889e7de
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/Exception/UnauthorizedExceptionTest.php
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api\Exception;
+
+
+use Apache\Usergrid\Api\Exception\UnauthorizedException;
+use Guzzle\Http\Message\Response;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class UnauthorizedExceptionTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class UnauthorizedExceptionTest extends PHPUnit_Framework_TestCase
+{
+    /** @test */
+    public function it_can_create_the_exception()
+    {
+        $command = $this->getMock('Guzzle\Service\Command\CommandInterface');
+        $command
+            ->expects($this->once())
+            ->method('getRequest')
+            ->will($this->returnValue(
+                $this->getMock('Guzzle\Http\Message\Request', [], [], '', false)
+            ));
+
+        $response = new Response(401);
+        $response->setBody('');
+
+        /** @noinspection PhpParamsInspection */
+        $exception = UnauthorizedException::fromCommand($command, $response);
+
+        $this->assertInstanceOf(
+            'Apache\Usergrid\Api\Exception\UnauthorizedException',
+            $exception
+        );
+    }
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/Filters/BooleanTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/Filters/BooleanTest.php b/sdks/other/php5/apache-usergrid/tests/Api/Filters/BooleanTest.php
new file mode 100644
index 0000000..1550a55
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/Filters/BooleanTest.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api\Filters;
+
+
+use Apache\Usergrid\Api\Filters\Boolean;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class BooleanTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class BooleanTest extends PHPUnit_Framework_TestCase
+{
+
+    /** @test */
+    public function it_can_convert_booleans()
+    {
+        $this->assertEquals('true', Boolean::convert(1));
+        $this->assertEquals('true', Boolean::convert(true));
+
+        $this->assertEquals('false', Boolean::convert(0));
+        $this->assertEquals('false', Boolean::convert(false));
+    }
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/Filters/DateTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/Filters/DateTest.php b/sdks/other/php5/apache-usergrid/tests/Api/Filters/DateTest.php
new file mode 100644
index 0000000..13d37f6
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/Filters/DateTest.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api\Filters;
+
+
+use Apache\Usergrid\Api\Filters\Date;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class DateTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class DateTest extends PHPUnit_Framework_TestCase
+{
+    /** @test */
+    public function it_can_convert_dates()
+    {
+
+        $this->assertEquals('Tue, Oct 14, 2014 3:55 AM', Date::convert(1413258923819));
+    }
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/ManagementTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/ManagementTest.php b/sdks/other/php5/apache-usergrid/tests/Api/ManagementTest.php
new file mode 100644
index 0000000..46ea21c
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/ManagementTest.php
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api;
+
+
+use Apache\Usergrid\Api\Exception\UsergridException;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class ManagementTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class ManagementTest extends PHPUnit_Framework_TestCase
+{
+    protected $usergrid;
+    protected $config;
+
+    public function setUp()
+    {
+        $this->usergrid = $GLOBALS['usergrid'];
+    }
+
+    /**
+     * @test
+     * @group internet
+     */
+    public function it_can_make_management_call()
+    {
+        $error = null;
+
+        try {
+            $this->usergrid->management()->OrgAppsGet();
+        } catch (UsergridException $e) {
+            $error = $e;
+        }
+
+        $this->assertNull($error, "Should be no exception if  manifest files exits and sdk can make management calls");
+    }
+} 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/QueryAggregatorTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/QueryAggregatorTest.php b/sdks/other/php5/apache-usergrid/tests/Api/QueryAggregatorTest.php
new file mode 100644
index 0000000..eaa7b0b
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/QueryAggregatorTest.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api;
+
+
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class QueryAggregatorTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class QueryAggregatorTest extends PHPUnit_Framework_TestCase
+{
+
+    /** @test */
+    public function it_can_test_the_aggregate_method()
+    {
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Api/UsergridTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Api/UsergridTest.php b/sdks/other/php5/apache-usergrid/tests/Api/UsergridTest.php
new file mode 100644
index 0000000..0c7a340
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Api/UsergridTest.php
@@ -0,0 +1,153 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+namespace Apache\Usergrid\Tests\Api;
+
+use Apache\Usergrid\Api\Exception\UnauthorizedException;
+use PHPUnit_Framework_TestCase;
+
+/**
+ * Class UsergridTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class UsergridTest extends PHPUnit_Framework_TestCase
+{
+
+    /** @var  Usergrid Api Client */
+    protected $usergrid;
+
+    protected $config;
+
+    /**
+     * Setup resources and dependencies
+     *
+     * @return void
+     */
+    public function setup()
+    {
+        $this->usergrid = $GLOBALS['usergrid'];
+    }
+
+    /**
+     * @test
+     * @group internet
+     */
+    public function it_can_retrieve_oauth2_token()
+    {
+        $error = null;
+
+        try {
+            $this->usergrid->application()->EntityGet(['collection' => 'roles']);
+        } catch (UnauthorizedException $e) {
+            $error = $e;
+        }
+
+        $this->assertNull($error, 'Exception should be null if authorized');
+    }
+
+    /** @test */
+    public function it_can_set_the_oauth2_token()
+    {
+        $this->usergrid->setToken('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890');
+
+        $this->assertEquals('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890', $this->usergrid->getToken());
+    }
+
+    /** @test */
+    public function it_can_retrieve_user_agent()
+    {
+
+        $this->assertEquals('BaaS-Usergrid/1.0.0', $this->usergrid->getUserAgent());
+    }
+
+    /** @test */
+    public function it_can_set_the_user_agent()
+    {
+
+        $this->usergrid->setUserAgent('Foo/Bar');
+
+        $this->assertEquals('Foo/Bar', $this->usergrid->getUserAgent());
+    }
+
+    /** @test */
+    public function it_can_retrieve_the_manifest_path()
+    {
+
+        $this->assertEquals($this->usergrid->getManifestPath(), $this->usergrid->getManifestPath());
+    }
+
+    /** @test */
+    public function it_can_set_the_manifest_path()
+    {
+        $this->usergrid->setManifestPath('/usr/foo/bar');
+
+        $this->assertEquals('/usr/foo/bar', $this->usergrid->getManifestPath());
+    }
+
+    /** @test */
+    public function it_can_retrieve_api_version()
+    {
+        $this->assertEquals('1.0.1', $this->usergrid->getVersion());
+    }
+
+    /** @test */
+    public function it_can_set_api_version()
+    {
+        $this->usergrid->setVersion('1.0.1');
+
+        $this->assertEquals('1.0.1', $this->usergrid->getVersion());
+    }
+
+
+    /** @test */
+    public function it_can_retrieve_the_client_header()
+    {
+        $headers = $this->usergrid->getHeaders();
+
+        $expected = [
+            'Usergrid-Version' => '1.0.1',
+            'Authorization' => 'Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
+        ];
+
+        $this->assertEquals($headers, $expected);
+    }
+
+    /** @test */
+    public function it_can_set_client_headers()
+    {
+        $this->usergrid->setHeaders([
+            'some-header' => 'foo-bar',
+        ]);
+
+        $headers = $this->usergrid->getHeaders();
+
+        $expected = [
+            'Usergrid-Version' => '1.0.1',
+            'Authorization' => 'Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890',
+            'some-header' => 'foo-bar',
+        ];
+
+        $this->assertEquals($headers, $expected);
+    }
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/Laravel/Facades/UsergridTest.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/Laravel/Facades/UsergridTest.php b/sdks/other/php5/apache-usergrid/tests/Laravel/Facades/UsergridTest.php
new file mode 100644
index 0000000..3362bfc
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/Laravel/Facades/UsergridTest.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+namespace Apache\Usergrid\Tests\Laravel\Facades;
+
+use PHPUnit_Framework_TestCase;
+use ReflectionClass;
+
+/**
+ * Class UsergridTest
+ *
+ * @package    Apache/Usergrid
+ * @version    1.0.0
+ * @author     Jason Kristian <ja...@gmail.com>
+ * @license    Apache License, Version  2.0
+ * @copyright  (c) 2008-2014, Baas Platform Pty. Ltd
+ * @link       http://baas-platform.com
+ */
+class UsergridTest extends PHPUnit_Framework_TestCase
+{
+    /** @test */
+    public function it_can_test_it_is_a_facade()
+    {
+        $facade = new ReflectionClass('Illuminate\Support\Facades\Facade');
+
+        $reflection = new ReflectionClass('Apache\Usergrid\Laravel\Facades\Usergrid');
+
+        $this->assertTrue($reflection->isSubclassOf($facade));
+    }
+
+    /** @test */
+    public function it_can_test_it_is_a_facade_accessor()
+    {
+        $reflection = new ReflectionClass('Apache\Usergrid\Laravel\Facades\Usergrid');
+
+        $method = $reflection->getMethod('getFacadeAccessor');
+        $method->setAccessible(true);
+
+
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/php5/apache-usergrid/tests/bootstrap.php
----------------------------------------------------------------------
diff --git a/sdks/other/php5/apache-usergrid/tests/bootstrap.php b/sdks/other/php5/apache-usergrid/tests/bootstrap.php
new file mode 100644
index 0000000..edc11d1
--- /dev/null
+++ b/sdks/other/php5/apache-usergrid/tests/bootstrap.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright 2010-2014 baas-platform.com, Pty Ltd. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+include('vendor/autoload.php');
+
+use Apache\Usergrid\Native\UsergridBootstrapper;
+
+$config = [
+
+    'usergrid' => [
+
+        'url' => 'https://api.usergrid.com',
+        'version' => '1.0.1',
+        'orgName' => null,
+        'appName' => null,
+        'manifestPath' => null,
+        //its better not to set the real values here if using laravel set them in a .env file or
+        // if your not using Laravel set them as environment variable and include them here using $_ENV global.
+        // so that way you can be sure not to commit privates ID to a public repo
+        'clientId' => null,
+        'clientSecret' => null,
+        'username' => null,
+        'password' => null,
+        /**
+         * The Auth Type setting is the Oauth 2 end point you want to get the OAuth 2
+         * Token from.  You have two options here one is 'application' the other is 'organization'
+         *
+         *  organization will get the the token from http://example.com/management using  client_credentials or password grant type
+         *  application will get the token from http://example.com/managment/org_name/app_name using client_credentials or password grant type
+         */
+        'auth_type' => 'organization',
+        /** The Grant Type to use
+         *
+         * This has to be set to one of the 2 grant types that Apache Usergrid
+         * supports which at the moment is client_credentials or password but at
+         * 2 level organization or application
+         */
+        'grant_type' => 'client_credentials',
+        /**
+         * if you want to manage your own auth flow by calling the token api and setting the token your self just set this to false
+         * */
+        'enable_oauth2_plugin' => true
+    ]
+];
+
+$boot = new UsergridBootstrapper($config);
+$usergrid = $boot->createUsergrid();
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ruby-on-rails/Gemfile
----------------------------------------------------------------------
diff --git a/sdks/other/ruby-on-rails/Gemfile b/sdks/other/ruby-on-rails/Gemfile
new file mode 100644
index 0000000..60aff2b
--- /dev/null
+++ b/sdks/other/ruby-on-rails/Gemfile
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+source 'https://rubygems.org'
+
+# Specify your gem's dependencies in usergrid_ironhorse.gemspec
+gemspec

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ruby-on-rails/LICENSE.txt
----------------------------------------------------------------------
diff --git a/sdks/other/ruby-on-rails/LICENSE.txt b/sdks/other/ruby-on-rails/LICENSE.txt
new file mode 100644
index 0000000..ae1e83e
--- /dev/null
+++ b/sdks/other/ruby-on-rails/LICENSE.txt
@@ -0,0 +1,14 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ruby-on-rails/README.md
----------------------------------------------------------------------
diff --git a/sdks/other/ruby-on-rails/README.md b/sdks/other/ruby-on-rails/README.md
new file mode 100644
index 0000000..dce855b
--- /dev/null
+++ b/sdks/other/ruby-on-rails/README.md
@@ -0,0 +1,212 @@
+# Apache Usergrid_ironhorse
+
+Usergrid_ironhorse is based on Usergrid_iron and enables Ruby or Rails applications
+native Rails-style access to Apigee's App Services (aka Usergrid) REST API.
+
+## Compatibility
+
+**Usergrid_ironhorse is currently only compatible with Ruby on Rails 3.2.**
+
+Thus, if you are using Rails 4.x, you must use Usergrid_iron (the low-level API for Ruby).
+Alternatively, we would welcome your contributions to make Usergrid_ironhorse compatible with Rails 4.x. Thanks!
+
+## Installation
+
+Add this line to your application's Gemfile:
+
+    gem 'usergrid_ironhorse'
+
+And then execute:
+
+    $ bundle
+
+Or install it yourself as:
+
+    $ gem install usergrid_ironhorse
+
+
+## Usage
+
+### Not familiar with Usergrid's App Services?
+
+#### It's great stuff! Check it out, here:
+
+  Docs: <https://usergrid.apache.org/docs/>  
+  Open source: <https://github.com/usergrid/usergrid/>
+
+### Getting started with the Usergrid_ironhorse SDK is super simple!
+
+#### Setup
+
+* Add 'gem usergrid_ironhorse' to your Gemfile
+* Create a 'config/usergrid.yml' file that looks something like this (the
+auth_token is your application token):
+
+```
+development:
+  application_url: http://localhost:8080/my-organization/my-application
+  client_id: YXA6BVYasLdNEeKBd1A2yYstg
+  client_secret: YXA60Dnbzaxg1ObkE8ffsIxsGzsSo8
+  require_login: false
+
+test:
+  application_url: http://localhost:8080/my-organization/my-application
+  client_id: YXA6BVYasLdNEeKBd1A2yYstg
+  client_secret: YXA60Dnbzaxg1ObkE8ffsIxsGzsSo8
+  require_login: false
+
+production:
+  application_url: http://api.usergrid.com/my-organization/my-application
+  client_id: YXA6BVYasLdNEeKBd1A2yYstg
+  client_secret: YXA60Dnbzaxg1ObkE8ffsIxsGzsSo8
+  require_login: false
+```
+
+#### Get going!
+
+* Subclass Usergrid::Ironhorse::Base for your models.
+Your models will automatically be stored in a collection according to the name of your
+class as defined by Rails' ActiveModel::Naming module. (Which you may override by
+implementing model_name if desired.)
+
+```
+class Developer < Usergrid::Ironhorse::Base
+  validates :name, :presence => true  # Yes, of course you can use validation
+
+end
+```
+
+* Now just use the Rails methods you're already familiar with:
+
+```
+
+    dev = Developer.new language: 'Ruby'
+    dev.valid? # nope!
+    dev.errors # {:name=>["can't be blank"]}
+    dev.name = 'Scott'
+    dev.save!
+
+    dev = Developer.find_or_create_by_name 'Scott'
+    dev.favorite_color = 'green' # assign new attributes automatically
+
+    dev = Developer.find_by_name 'Scott'
+```
+
+* BTW: If you need to do management tasks, wrapping the work in an as_admin block
+will use the auth_token from your settings:
+
+```
+User.as_admin do
+  # do protected task
+end
+```
+
+
+#### (Optional) Need to have user-specific logins to UserGrid?
+
+* Create a User model and subclass `Usergrid::Ironhorse::Base` and `extend
+Usergrid::Ironhorse::UserContext` like so:
+
+```
+class User < Usergrid::Ironhorse::Base
+  extend Usergrid::Ironhorse::UserContext
+  ...
+end
+```
+
+* Set up your authentication
+	* Use `User.authenticate(username, password, session)` to login.
+	* Use `User.clear_authentication(session)` to log out.
+* Propogate the authentication in your ApplicationController:
+
+```
+before_filter :set_user_context
+def set_user_context
+  User.set_context session
+end
+```
+
+* Optionally, if you need to access the User from your view, you may add something
+like the following to your ApplicationController:
+
+```
+helper_method :current_user
+def current_user
+  User.current_user
+end
+```
+
+## Contributing
+
+We welcome your enhancements!
+
+1. Fork it
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Write some broken rspecs.
+4. Fix the rspecs with your new code.
+3. Commit your changes (`git commit -am 'Added some feature'`)
+4. Push your changes to the upstream branch (`git push origin my-new-feature`)
+5. Create new Pull Request
+
+We're shooting for 100% rspec coverage, so keep that in mind!
+
+In order to run the tests, check out the Usergrid open source project
+(https://github.com/usergrid/usergrid/), build, and launch it locally.
+
+(Note: If you change your local Usergrid settings from the default, be sure to update
+usergrid_ironhorse/spec/spec_settings.yaml to match.)
+
+
+## Release notes
+
+### 0.1.1
+* New Features
+  1. Now prefer application client_id and client_secret (instead of auth_token) in usergrid.yml.
+
+### 0.1.0
+* New Features
+  1. next_page() added to return the next page of results from the server. An example of this used in conjunction
+     with to_a() is in base_spec.rb (see "should be able to page through results").
+* Incompatible changes
+  1. each() iteration will now transparently cross page boundaries (as generally expected by Rails users).
+     You may use limit(n) to restrict the result set, but note that limit will retrieve the number of entities
+     specified as a single batch (no paging).
+
+### 0.0.5
+* New Features
+  1. support MassAssignmentSecurity (attr_accessible & attr_protected)
+
+### 0.0.4
+* New Features
+  1. add require_login to config (with ability to skip individual logins)
+
+### 0.0.3
+* Internal
+  1. Improve authentication and user propagation
+
+### 0.0.2
+* New Features
+  1. Authentication and user propagation features
+
+### 0.0.1
+* Initial commit
+  1. Support for most ActiveModel stuff including Validations
+  1. No scoping support
+
+
+## License
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+the ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ruby-on-rails/Rakefile
----------------------------------------------------------------------
diff --git a/sdks/other/ruby-on-rails/Rakefile b/sdks/other/ruby-on-rails/Rakefile
new file mode 100644
index 0000000..632aa48
--- /dev/null
+++ b/sdks/other/ruby-on-rails/Rakefile
@@ -0,0 +1,22 @@
+#!/usr/bin/env rake
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+require "bundler/gem_tasks"
+
+require 'rspec/core/rake_task'
+RSpec::Core::RakeTask.new(:spec)
+
+RSpec::Core::RakeTask.new("spec:coverage")

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ruby-on-rails/lib/extensions/hash.rb
----------------------------------------------------------------------
diff --git a/sdks/other/ruby-on-rails/lib/extensions/hash.rb b/sdks/other/ruby-on-rails/lib/extensions/hash.rb
new file mode 100644
index 0000000..a82062a
--- /dev/null
+++ b/sdks/other/ruby-on-rails/lib/extensions/hash.rb
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+class Hash
+
+  def nested_under_indifferent_access
+    self
+  end
+
+end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ruby-on-rails/lib/extensions/resource.rb
----------------------------------------------------------------------
diff --git a/sdks/other/ruby-on-rails/lib/extensions/resource.rb b/sdks/other/ruby-on-rails/lib/extensions/resource.rb
new file mode 100644
index 0000000..b858b92
--- /dev/null
+++ b/sdks/other/ruby-on-rails/lib/extensions/resource.rb
@@ -0,0 +1,66 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# overrides methods dealing with auth_token to operate on a thread basis
+module Usergrid
+  class Resource
+
+    def options
+      options = @options.clone
+      require_login = Ironhorse::Base.settings[:require_login] != false
+      if require_login
+        auth_token = Thread.current[:usergrid_auth_token]
+      else
+        unless Ironhorse::Base.settings[:auth_token]
+          as_admin {}
+        end
+        auth_token = Ironhorse::Base.settings[:auth_token]
+      end
+      options[:headers].delete :Authorization
+      options[:headers][:Authorization] = "Bearer #{auth_token}" if auth_token
+      options
+    end
+
+    def as_admin(&block)
+      save_auth_token = Thread.current[:usergrid_auth_token]
+      begin
+        unless Ironhorse::Base.settings[:auth_token]
+          resource = RestClient::Resource.new Ironhorse::Base.settings[:application_url]
+          response = resource['token'].post grant_type: 'client_credentials', client_id: Ironhorse::Base.settings[:client_id], client_secret: Ironhorse::Base.settings[:client_secret]
+          Ironhorse::Base.settings[:auth_token] = MultiJson.load(response)['access_token']
+        end
+        Thread.current[:usergrid_auth_token] = Ironhorse::Base.settings[:auth_token]
+        yield block
+      ensure
+        Thread.current[:usergrid_auth_token] = save_auth_token
+      end
+    end
+
+    # gets user token and automatically set auth header for future requests on this Thread
+    # precondition: resource must already be set to the correct context (application or management)
+    def login(username, password)
+      params = { grant_type: "password", username: username, password: password }
+      response = self['token'].get({ params: params })
+      user_uuid = response.data['user']['uuid']
+      user_access_token = response.data['access_token']
+      Thread.current[:usergrid_user_id] = user_uuid
+      Thread.current[:usergrid_auth_token] = user_access_token
+      @current_user = self["/users/#{user_uuid}"].get.entity
+      response
+    end
+
+  end
+end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ruby-on-rails/lib/usergrid_ironhorse.rb
----------------------------------------------------------------------
diff --git a/sdks/other/ruby-on-rails/lib/usergrid_ironhorse.rb b/sdks/other/ruby-on-rails/lib/usergrid_ironhorse.rb
new file mode 100644
index 0000000..0dde1d1
--- /dev/null
+++ b/sdks/other/ruby-on-rails/lib/usergrid_ironhorse.rb
@@ -0,0 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+require 'logger'
+require 'active_model'
+require 'rest-client'
+require 'active_support'
+require 'usergrid_iron'
+require 'active_record/errors'
+
+module Usergrid
+  module Ironhorse
+
+    Dir[Pathname.new(File.dirname(__FILE__)).join("extensions/**/*.rb")].each { |f| require f }
+
+    USERGRID_PATH = File.join File.dirname(__FILE__), 'usergrid_ironhorse'
+
+    def self.usergrid_path *path
+      File.join USERGRID_PATH, *path
+    end
+
+    require usergrid_path('base')
+    require usergrid_path('query')
+
+    autoload :UserContext, usergrid_path('user_context')
+  end
+end

http://git-wip-us.apache.org/repos/asf/usergrid/blob/867060fa/sdks/other/ruby-on-rails/lib/usergrid_ironhorse/base.rb
----------------------------------------------------------------------
diff --git a/sdks/other/ruby-on-rails/lib/usergrid_ironhorse/base.rb b/sdks/other/ruby-on-rails/lib/usergrid_ironhorse/base.rb
new file mode 100644
index 0000000..aa6f4d9
--- /dev/null
+++ b/sdks/other/ruby-on-rails/lib/usergrid_ironhorse/base.rb
@@ -0,0 +1,370 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+require 'active_record/validations'
+require 'active_record/errors'
+require 'active_record/callbacks'
+
+module Usergrid
+  module Ironhorse
+
+    class Base
+      include ActiveModel::AttributeMethods
+      include ActiveModel::Conversion
+      include ActiveModel::Validations
+      include ActiveModel::Dirty
+      include ActiveModel::Serialization
+      include ActiveModel::MassAssignmentSecurity
+      extend  ActiveModel::Naming
+      extend  ActiveModel::Callbacks
+
+      RESERVED_ATTRIBUTES = %w(metadata created modified uuid type uri)
+
+      define_model_callbacks :create, :destroy, :save, :update
+
+      # todo: determine the subset to support...
+      # unsupported: :group, :joins, :preload, :eager_load, :includes, :from, :lock,
+      #              :having, :create_with, :uniq, :references, :none, :count,
+      #              :average, :minimum, :maximum, :sum, :calculate, :ids
+      #              :find_each, :find_in_batches, :offset, :readonly
+
+      #delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, :to => :all
+      #delegate :first_or_create, :first_or_create!, :first_or_initialize, :to => :all
+      #delegate :find_by, :find_by!, :to => :all
+      #delegate :destroy, :destroy_all, :delete, :delete_all, :update, :update_all, :to => :all
+      #delegate :find_each, :find_in_batches, :to => :all
+      #delegate :select, :group, :order, :except, :reorder, :limit, :offset,
+      #         :where, :preload, :eager_load, :includes, :from, :lock, :readonly,
+      #         :having, :create_with, :uniq, :references, :none, :to => :all
+      #delegate :count, :average, :minimum, :maximum, :sum, :calculate, :pluck, :ids, :to => :all
+
+      @@settings ||= nil
+
+      attr_accessor :attributes
+
+      HashWithIndifferentAccess = ActiveSupport::HashWithIndifferentAccess
+      RecordNotSaved = ActiveRecord::RecordNotSaved
+
+      def initialize(attrs=nil)
+        @attributes = HashWithIndifferentAccess.new
+        assign_attributes attrs if attrs
+      end
+
+      def self.configure!(application_url, auth_token)
+        @@settings = HashWithIndifferentAccess.new application_url: application_url, auth_token: auth_token
+      end
+
+      def self.settings
+        return @@settings if @@settings
+        path = "config/usergrid.yml"
+        environment = defined?(Rails) && Rails.respond_to?(:env) ? Rails.env : ENV['RACK_ENV']
+        @@settings = HashWithIndifferentAccess.new YAML.load(ERB.new(File.new(path).read).result)[environment]
+      end
+
+      # forward to all
+      def self.method_missing(method, *args, &block)
+        all.send method, *args, &block
+      end
+
+      # forward to all
+      def method_missing(method, *args, &block)
+        if args.size == 0
+          attributes[method]
+        elsif args.size == 1 && method[-1] == '='
+          attr = method[0..-2]
+          if attributes[attr] != args[0]
+            attribute_will_change!(attr)
+            attributes[attr] = args[0]
+          end
+        else
+          all.send method, *args, &block
+        end
+      end
+
+      # todo: scopes
+      def self.all
+        unscoped
+      end
+
+      #def self.scope(symbol, scope)
+      #  @scopes[symbol] = scope
+      #end
+
+      #def self.current_scope
+      #  @current_scope ||= default_scope
+      #end
+      #
+      #def self.current_scope=(scope)
+      #  @current_scope = scope
+      #end
+      #
+      #def self.default_scope
+      #  @default_scope ||= unscoped
+      #end
+
+      def self.unscoped
+        Query.new(self)
+      end
+
+      def self.create(attributes=nil, options=nil, &block)
+        if attributes.is_a?(Array)
+          attributes.collect { |attr| create(attr, options, &block) }
+        else
+          object = new(attributes, &block)
+          object.save
+          object
+        end
+      end
+
+      def self.create!(attributes=nil, options=nil, &block)
+        if attributes.is_a?(Array)
+          attributes.collect {|attr| create!(attr, options, &block)}
+        else
+          object = new(attributes)
+          yield(object) if block_given?
+          object.save!
+          object
+        end
+      end
+
+      def self.class_attributes
+        @class_attributes ||= {}
+      end
+
+      # Returns true if the record is persisted, i.e. it's not a new record and it was
+      # not destroyed, otherwise returns false.
+      def persisted?
+        !(new_record? || destroyed?)
+      end
+
+      def new_record?
+        !self.uuid
+      end
+
+      def self.group
+        model_name.plural.downcase
+      end
+
+      # Creates a Usergrid::Resource
+      def self.resource
+        app = Usergrid::Application.new settings[:application_url]
+        #app.auth_token = Thread.current[:usergrid_auth_token]
+        app[group]
+      end
+
+      # Saves the model.
+      #
+      # If the model is new a record gets created in the database, otherwise
+      # the existing record gets updated.
+      #
+      # By default, save always run validations. If any of them fail the action
+      # is cancelled and +save+ returns +false+. However, if you supply
+      # :validate => false, validations are bypassed altogether. See
+      # ActiveRecord::Validations for more information.
+      #
+      # There's a series of callbacks associated with +save+. If any of the
+      # <tt>before_*</tt> callbacks return +false+ the action is cancelled and
+      # +save+ returns +false+. See ActiveRecord::Callbacks for further
+      # details.
+      def save
+        begin
+          create_or_update
+        rescue ActiveRecord::RecordInvalid
+          false
+        end
+      end
+
+      # Saves the model.
+      #
+      # If the model is new a record gets created in the database, otherwise
+      # the existing record gets updated.
+      #
+      # With <tt>save!</tt> validations always run. If any of them fail
+      # ActiveRecord::RecordInvalid gets raised. See ActiveRecord::Validations
+      # for more information.
+      #
+      # There's a series of callbacks associated with <tt>save!</tt>. If any of
+      # the <tt>before_*</tt> callbacks return +false+ the action is cancelled
+      # and <tt>save!</tt> raises ActiveRecord::RecordNotSaved. See
+      # ActiveRecord::Callbacks for further details.
+      def save!
+        create_or_update or raise RecordNotSaved
+      end
+
+      # Deletes the record in the database and freezes this instance to
+      # reflect that no changes should be made (since they can't be
+      # persisted). Returns the frozen instance.
+      #
+      # The row is simply removed with a +DELETE+ statement on the
+      # record's primary key, and no callbacks are executed.
+      #
+      # To enforce the object's +before_destroy+ and +after_destroy+
+      # callbacks, Observer methods, or any <tt>:dependent</tt> association
+      # options, use <tt>#destroy</tt>.
+      def delete
+        self.class.delete(id) if persisted?
+        @destroyed = true
+        freeze
+      end
+
+      # Deletes the record in the database and freezes this instance to reflect
+      # that no changes should be made (since they can't be persisted).
+      #
+      # There's a series of callbacks associated with <tt>destroy</tt>. If
+      # the <tt>before_destroy</tt> callback return +false+ the action is cancelled
+      # and <tt>destroy</tt> returns +false+. See
+      # ActiveRecord::Callbacks for further details.
+      def destroy
+        raise ReadOnlyRecord if readonly?
+        # todo: callbacks?
+        instance_resource.delete if persisted?
+        @destroyed = true
+        freeze
+      end
+
+      # Deletes the record in the database and freezes this instance to reflect
+      # that no changes should be made (since they can't be persisted).
+      #
+      # There's a series of callbacks associated with <tt>destroy!</tt>. If
+      # the <tt>before_destroy</tt> callback return +false+ the action is cancelled
+      # and <tt>destroy!</tt> raises ActiveRecord::RecordNotDestroyed. See
+      # ActiveRecord::Callbacks for further details.
+      def destroy!
+        destroy || raise(ActiveRecord::RecordNotDestroyed)
+      end
+
+      # Returns true if this object has been destroyed, otherwise returns false.
+      def destroyed?
+        !!@destroyed
+      end
+
+      # Reloads the attributes of this object from the database.
+      def reload
+        return false if !persisted?
+        fresh_object = self.class.find(id)
+        refresh_data fresh_object.instance_variable_get('@attributes')
+        self
+      end
+
+      # Updates the attributes of the model from the passed-in hash and saves the
+      # record, all wrapped in a transaction. If the object is invalid, the saving
+      # will fail and false will be returned.
+      def update_attributes(attributes)
+        assign_attributes attributes
+        save
+      end
+
+      # Updates its receiver just like +update_attributes+ but calls <tt>save!</tt> instead
+      # of +save+, so an exception is raised if the record is invalid.
+      def update_attributes!(attributes)
+        assign_attributes attributes
+        save!
+      end
+
+      # Note that whenever you include ActiveModel::AttributeMethods in your class,
+      # it requires you to implement an +attributes+ method which returns a hash
+      # with each attribute name in your model as hash key and the attribute value as
+      # hash value.
+      #
+      # Hash keys must be strings.
+      def attributes
+        @attributes ||= self.class.class_attributes.clone
+      end
+
+      def id; self.uuid end
+      def created_at; self.created end
+      def updated_at; self.modified end
+
+
+      protected
+
+
+      def assign_attributes(attrs)
+        attrs = sanitize_for_mass_assignment(attrs)
+        attrs.each do |attr,value|
+          attr = attr.to_s
+          unless attributes[attr] == value
+            attribute_will_change!(attr) unless RESERVED_ATTRIBUTES.include? attr
+            attributes[attr] = value
+          end
+        end
+      end
+
+      def create_or_update
+        raise ReadOnlyRecord if readonly?
+        if valid?
+          run_callbacks :save do
+            return new_record? ? do_create : do_update
+          end
+        end
+        false
+      end
+
+      def do_create
+        group_resource.post(unsaved_attributes) do |resp, req, res, &block|
+          if resp.code.to_s == "200" || resp.code.to_s == "201"
+            refresh_data resp.entity_data
+            return true
+          else
+            errors.add(resp.code.to_s, resp)
+            return false
+          end
+        end
+      end
+
+      def do_update
+        return false unless changed?
+
+        instance_resource.put(unsaved_attributes) do |resp, req, res, &block|
+          if resp.code.to_s == "200" || resp.code.to_s == "201"
+            refresh_data resp.entity_data
+            return true
+          else
+            errors.add(resp.code, resp)
+            return false
+          end
+        end
+      end
+
+      def unsaved_attributes
+        HashWithIndifferentAccess[changed.collect {|k| [k, attributes[k]]}]
+      end
+
+      def group_resource
+        self.class.resource
+      end
+
+      def instance_resource
+        self.class.resource["#{self.id}"]
+      end
+
+      def refresh_data(entity_data)
+        @previously_changed = changes
+        @changed_attributes.clear
+        @attributes = HashWithIndifferentAccess.new entity_data
+      end
+
+      def attribute_will_change!(attr)
+        begin
+          value = __send__(attr)
+          value = value.duplicable? ? value.clone : value
+        rescue TypeError, NoMethodError
+        end
+
+        changed_attributes[attr] = value unless changed_attributes.include?(attr)
+      end
+    end
+  end
+end