ordino_sdk 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # Ordino SDK
2
+
3
+ [![Build Status](https://travis-ci.org/meducation/ordino_sdk.png)](https://travis-ci.org/meducation/ordino_sdk)
4
+ [![Dependencies](https://gemnasium.com/meducation/ordino_sdk.png?travis)](https://gemnasium.com/meducation/ordino_sdk)
5
+ [![Code Climate](https://codeclimate.com/github/meducation/ordino_sdk.png)](https://codeclimate.com/github/meducation/ordino_sdk)
6
+
7
+ A wrapper for Ordino's SDK.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'ordino_sdk'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ ## Usage
22
+
23
+ Resources accept the following methods:
24
+
25
+ ```ruby
26
+ OrdinoSDK::MediaFile.find(id)
27
+ OrdinoSDK::MediaFile.find_each #=> do ... end
28
+ OrdinoSDK::MediaFile.where(foo: 'bar') #=> []
29
+ OrdinoSDK::MediaFile.where(foo: 'bar').select([:id, :name]) #=> []
30
+ OrdinoSDK::MediaFile.create(foo: 'bar')
31
+ ```
32
+
33
+ The following objects are currently supported:
34
+
35
+ ```ruby
36
+ User
37
+ ```
38
+
39
+ ### Is it any good?
40
+
41
+ [Yes.](http://news.ycombinator.com/item?id=3067434)
42
+
43
+ ## Contributing
44
+
45
+ Firstly, thank you!! :heart::sparkling_heart::heart:
46
+
47
+ We'd love to have you involved. Please read our [contributing guide](https://github.com/meducation/propono/tree/master/CONTRIBUTING.md) for information on how to get stuck in.
48
+
49
+ ### Contributors
50
+
51
+ This project is managed by the [Meducation team](http://company.meducation.net/about#team).
52
+
53
+ These individuals have come up with the ideas and written the code that made this possible:
54
+
55
+ - [Jeremy Walker](http://github.com/iHID)
56
+
57
+ ## Licence
58
+
59
+ Copyright (C) 2013 New Media Education Ltd
60
+
61
+ This program is free software: you can redistribute it and/or modify
62
+ it under the terms of the GNU Affero General Public License as published by
63
+ the Free Software Foundation, either version 3 of the License, or
64
+ (at your option) any later version.
65
+
66
+ This program is distributed in the hope that it will be useful,
67
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
68
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
69
+ GNU Affero General Public License for more details.
70
+
71
+ A copy of the GNU Affero General Public License is available in [Licence.md](https://github.com/meducation/propono/blob/master/LICENCE.md)
72
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = "test/**/*_test.rb"
6
+ end
7
+ task default: :test
8
+
@@ -0,0 +1,43 @@
1
+ module OrdinoSDK
2
+ class OrdinoSDKError < StandardError
3
+ end
4
+ class OrdinoSDKConfigurationError < OrdinoSDKError
5
+ end
6
+
7
+ class Configuration
8
+
9
+ SETTINGS = [
10
+ :logger
11
+ ]
12
+
13
+ attr_writer *SETTINGS
14
+
15
+ def initialize
16
+ self.logger = Filum.logger
17
+ end
18
+
19
+ [:access_id, :secret_key, :endpoint, :cache].each do |setting|
20
+ define_method "#{setting}=" do |val|
21
+ Loquor.config.send("#{setting}=", val)
22
+ end
23
+ end
24
+
25
+ def logger=(val)
26
+ @logger = val
27
+ Loquor.config.logger = val
28
+ end
29
+
30
+ SETTINGS.each do |setting|
31
+ define_method setting do
32
+ get_or_raise(setting)
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def get_or_raise(setting)
39
+ instance_variable_get("@#{setting.to_s}") ||
40
+ raise(OrdinoSDKConfigurationError.new("Configuration for #{setting} is not set"))
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,6 @@
1
+ module OrdinoSDK
2
+ EmailShortcodes = {
3
+ "b_nwusr" => "New User",
4
+ "b_pswdr" => "Password Reset"
5
+ }
6
+ end
@@ -0,0 +1,27 @@
1
+ module OrdinoSDK
2
+ module Helpers
3
+ SDK_TO_SPI_MAPPINGS = {}
4
+
5
+ def sdk_class_for(spi_type)
6
+ sdk_type_for(spi_type).constantize
7
+ end
8
+
9
+ def sdk_type_for(spi_type)
10
+ if SDK_TO_SPI_MAPPINGS.has_value?(spi_type)
11
+ SDK_TO_SPI_MAPPINGS.key(spi_type)
12
+ else
13
+ "OrdinoSDK::#{spi_type.gsub("::", "")}"
14
+ end
15
+ end
16
+
17
+ def spi_type_for(sdk_type)
18
+ sdk_type = sdk_type.gsub(/Mock$/, "")
19
+ if SDK_TO_SPI_MAPPINGS.has_key?(sdk_type)
20
+ SDK_TO_SPI_MAPPINGS[sdk_type]
21
+ else
22
+ sdk_type.gsub("OrdinoSDK::", "")
23
+ end
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,72 @@
1
+ module OrdinoSDK
2
+ class Mocker
3
+ def self.mock!
4
+ RESOURCES.each do |resource|
5
+ new(resource).mock!
6
+ end
7
+ end
8
+
9
+ def self.unmock!
10
+ RESOURCES.each do |resource|
11
+ new(resource).unmock!
12
+ end
13
+ end
14
+
15
+ def initialize(resource_name)
16
+ @resource_name = resource_name
17
+ end
18
+
19
+ def mock!
20
+ return if mock_module.const_defined?(original_class_name)
21
+
22
+ resource = "#{mock_module_name}::#{resource_class_name}".constantize
23
+ mock = "#{mock_module_name}::#{mock_class_name}".constantize
24
+
25
+ mock_module.const_set(original_class_name, resource)
26
+ mock_module.send(:remove_const, resource_class_name)
27
+ mock_module.const_set(resource_class_name, mock)
28
+ mock_module.send(:remove_const, mock_class_name)
29
+ end
30
+
31
+ def unmock!
32
+ return unless mock_module.const_defined?(original_class_name)
33
+
34
+ original = "#{mock_module_name}::#{original_class_name}".constantize
35
+ resource = "#{mock_module_name}::#{resource_class_name}".constantize
36
+
37
+ mock_module.const_set(mock_class_name, resource)
38
+ mock_module.send(:remove_const, resource_class_name)
39
+ mock_module.const_set(resource_class_name, original)
40
+ mock_module.send(:remove_const, original_class_name)
41
+ end
42
+
43
+ private
44
+ def resource_class_name
45
+ @resource_class_name ||= @resource_name.camelize.split("::").last
46
+ end
47
+
48
+ def mock_class_name
49
+ @mock_class_name ||= "#{@resource_name}_mock".camelize.split("::").last
50
+ end
51
+
52
+ def original_class_name
53
+ @original_class_name ||= "#{@resource_name}_original".camelize.split("::").last
54
+ end
55
+
56
+ def mock_module
57
+ @mock_module ||= mock_module_name.constantize
58
+ end
59
+
60
+ def mock_module_name
61
+ @mock_module_name ||= begin
62
+ parts = @resource_name.camelize.split("::")
63
+ if parts.size == 1
64
+ "OrdinoSDK"
65
+ else
66
+ parts.pop
67
+ "OrdinoSDK::#{parts.join("::")}"
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,26 @@
1
+ module OrdinoSDK
2
+ class Resource < Loquor::Resource
3
+ include Helpers
4
+
5
+ def self.spi_type=(type)
6
+ Helpers::SDK_TO_SPI_MAPPINGS[self.name] = type
7
+ end
8
+
9
+ def created_at
10
+ DateTime.parse(@data[:created_at])
11
+ end
12
+
13
+ def updated_at
14
+ DateTime.parse(@data[:updated_at])
15
+ end
16
+ end
17
+ end
18
+
19
+ RESOURCES = %w{
20
+ entry
21
+ user
22
+ web_page
23
+ }
24
+ RESOURCES.each do |resource|
25
+ require "ordino_sdk/resources/#{resource}"
26
+ end
@@ -0,0 +1,26 @@
1
+ module OrdinoSDK
2
+ class Entry < Resource
3
+ self.path = "/entries"
4
+
5
+ def user
6
+ @user ||= User.find(user_id)
7
+ end
8
+
9
+ def resource
10
+ @resource ||= sdk_class_for(resource_type).find(resource_id)
11
+ end
12
+ end
13
+
14
+ class EntryMock < Entry
15
+ extend Loquor::ResourceMock
16
+
17
+ self.attributes = {
18
+ id: 50,
19
+ user_id: 30660,
20
+ resource_type: "WebPage",
21
+ resource_id: 17,
22
+ binder_id: 11,
23
+ order_value: 100
24
+ }
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ module OrdinoSDK
2
+ class User < Resource
3
+ self.path = "/users"
4
+ end
5
+
6
+ class UserMock < User
7
+ extend Loquor::ResourceMock
8
+
9
+ self.attributes = {
10
+ id: 1,
11
+ email: "jez.walker@gmail.com",
12
+ name: "Jeremy Walker"
13
+ }
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ module OrdinoSDK
2
+ class WebPage < Resource
3
+ self.path = "/web_pages"
4
+
5
+ def entries
6
+ Entry.where(resource_type: "WebPage", resource_id: self.id)
7
+ end
8
+
9
+ def self.reimport_metadata(id)
10
+ new Loquor.post("#{path}/#{id}/reimport_metadata", {})
11
+ end
12
+
13
+ end
14
+
15
+ class WebPageMock < WebPage
16
+ extend Loquor::ResourceMock
17
+
18
+ self.attributes = {
19
+ id: 1,
20
+ created_by_id: 1,
21
+ site_name: 'FooTube',
22
+ url: 'http://footube.example.com/foo/bar',
23
+ title: 'Foo Bar Baz',
24
+ description: 'The Foo Bar Baz mock external resource is a great FooTube video.'
25
+ }
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module OrdinoSDK
2
+ VERSION = "0.0.6"
3
+ end
data/lib/ordino_sdk.rb ADDED
@@ -0,0 +1,25 @@
1
+ require 'active_support/all'
2
+ require 'loquor'
3
+
4
+ require 'ordino_sdk/version'
5
+ require 'ordino_sdk/configuration'
6
+ require 'ordino_sdk/mocker'
7
+
8
+ require 'ordino_sdk/helpers'
9
+ require 'ordino_sdk/resource'
10
+ require 'ordino_sdk/email_shortcodes'
11
+
12
+ module OrdinoSDK
13
+ def self.config
14
+ @config ||= Configuration.new
15
+ if block_given?
16
+ yield @config
17
+ else
18
+ @config
19
+ end
20
+ end
21
+
22
+ def self.mock!
23
+ OrdinoSDK::Mocker.mock!
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ordino_sdk/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ordino_sdk"
8
+ spec.version = OrdinoSDK::VERSION
9
+ spec.authors = ["Jeremy Walker"]
10
+ spec.email = ["jez.walker@gmail.com"]
11
+ spec.description = "Ordino's SDK"
12
+ spec.summary = "The SDK for Ordino"
13
+ spec.homepage = "http://github.com/meducation/ordino_sdk"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "activesupport", '>= 3.2.15'
22
+ spec.add_dependency "loquor", '~> 1.2'
23
+ spec.add_dependency "filum", '~> 2.0'
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.3"
26
+ spec.add_development_dependency "rake"
27
+ spec.add_development_dependency "minitest", '~> 5.0.8'
28
+ spec.add_development_dependency "mocha"
29
+ end
@@ -0,0 +1,9 @@
1
+ require_relative 'test_helper'
2
+ module OrdinoSDK
3
+ class ArbitaryTest < Minitest::Test
4
+ def test_shit_happens
5
+ skip
6
+ MediaFile.update(8, title: "Foobar to the Malcy Max")
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,51 @@
1
+ require_relative 'test_helper'
2
+
3
+ module OrdinoSDK
4
+ class ConfigurationTest < Minitest::Test
5
+
6
+ def setup
7
+ super
8
+ OrdinoSDK.instance_variable_set("@config", nil)
9
+ end
10
+
11
+ def test_obtaining_singletion
12
+ refute OrdinoSDK.config.nil?
13
+ end
14
+
15
+ def test_block_syntax
16
+ test_key = "foobar-123-access"
17
+ OrdinoSDK.config do |config|
18
+ config.access_id = test_key
19
+ end
20
+ assert_equal test_key, Loquor.config.access_id
21
+ end
22
+
23
+ def test_endpoint_is_set_correctly
24
+ Configuration.new
25
+ assert_equal "http://localhost:3000/spi", Loquor.config.endpoint
26
+ end
27
+
28
+ def test_retry_404s_is_set_correctly
29
+ Configuration.new
30
+ assert_equal false, Loquor.config.retry_404s
31
+ end
32
+
33
+ def test_access_id_proxies_to_loquor
34
+ access_id = "test-access-id"
35
+ OrdinoSDK.config.access_id = access_id
36
+ assert_equal access_id, Loquor.config.access_id
37
+ end
38
+
39
+ def test_secret_key_proxies_to_loquor
40
+ key = "test-secret-key"
41
+ OrdinoSDK.config.secret_key = key
42
+ assert_equal key, Loquor.config.secret_key
43
+ end
44
+
45
+ def test_cache_proxies_to_loquor
46
+ cache = mock()
47
+ OrdinoSDK.config.cache = cache
48
+ assert_equal cache, Loquor.config.cache
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'test_helper'
2
+
3
+ module OrdinoSDK
4
+ class MockerTest < Minitest::Test
5
+
6
+ def test_mock_switches_classes
7
+ OrdinoSDK.mock!
8
+ assert OrdinoSDK.const_defined?(:UserOriginal)
9
+ assert OrdinoSDK.const_defined?(:User)
10
+ refute OrdinoSDK.const_defined?(:UserMock)
11
+ ensure
12
+ OrdinoSDK::Mocker.unmock!
13
+ end
14
+
15
+ def test_mock_substitutes_in_mock_classes
16
+ OrdinoSDK.mock!
17
+
18
+ id = 1
19
+ Loquor::HttpAction::Get.expects(:get).never
20
+ assert id, User.find('id').id
21
+ ensure
22
+ OrdinoSDK::Mocker.unmock!
23
+ end
24
+
25
+ def test_mock_sample_returns_media_file_with_attributes
26
+ OrdinoSDK.mock!
27
+
28
+ user = User.sample
29
+ assert_equal user.email, "jez.walker@gmail.com"
30
+ assert_equal user.name, "Jeremy Walker"
31
+ ensure
32
+ OrdinoSDK::Mocker.unmock!
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ require_relative 'test_helper'
2
+ module OrdinoSDK
3
+ class ResourceTest < Minitest::Test
4
+ def self.test_resource(klass, url)
5
+ define_method :klass do klass end
6
+ define_method :url do url end
7
+
8
+ class_eval do
9
+ def test_path
10
+ assert_equal url, klass.path
11
+ end
12
+
13
+ def test_generates_find_url
14
+ id = 7
15
+ Loquor::HttpAction::Get.expects(:get).with("#{url}/#{id}", anything())
16
+ klass.find(id)
17
+ end
18
+ end
19
+ end
20
+ define_method 'test_helpers_included' do
21
+ assert Resource.new({}).respond_to?(:sdk_class_for)
22
+ end
23
+
24
+ def test_created_at_is_a_datetime
25
+ resource = Resource.new(created_at: '2014-02-23T23:34:49Z')
26
+ assert resource.created_at.is_a?(DateTime)
27
+ assert_equal DateTime.new(2014, 2, 23, 23, 34, 49), resource.created_at
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../test_helper'
2
+ require_relative '../resource_test'
3
+
4
+ module OrdinoSDK
5
+ class EntryTest < ResourceTest
6
+ test_resource(Entry, '/entries')
7
+
8
+ def test_user_calls_sdk
9
+ entry = Entry.new(user_id: 2)
10
+ OrdinoSDK::User.expects(:find).with(2)
11
+ entry.user
12
+ end
13
+
14
+ def test_resource_calls_sdk
15
+ entry = Entry.new(resource_id: 2, resource_type: "WebPage")
16
+ OrdinoSDK::WebPage.expects(:find).with(2)
17
+ entry.resource
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,10 @@
1
+ require_relative '../test_helper'
2
+ require_relative '../resource_test'
3
+
4
+ module OrdinoSDK
5
+ class UserTest < ResourceTest
6
+ test_resource(User, '/users')
7
+ end
8
+ end
9
+
10
+
@@ -0,0 +1,15 @@
1
+ require_relative '../test_helper'
2
+ require_relative '../resource_test'
3
+
4
+ module OrdinoSDK
5
+ class WebPageTest < ResourceTest
6
+ test_resource(WebPage, '/web_pages')
7
+
8
+ def test_can_retrigger_metadata_load
9
+ Loquor.expects(:post).with('/web_pages/12/reimport_metadata', {})
10
+ WebPage.reimport_metadata(12)
11
+ end
12
+ end
13
+ end
14
+
15
+
@@ -0,0 +1,29 @@
1
+ gem 'minitest'
2
+ require 'minitest/autorun'
3
+ require 'minitest/pride'
4
+ require 'minitest/mock'
5
+ require 'mocha/setup'
6
+
7
+ lib = File.expand_path('../../lib', __FILE__)
8
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
9
+
10
+ require 'ordino_sdk'
11
+ require_relative 'resources/user_test.rb'
12
+
13
+ class Minitest::Test
14
+ def setup
15
+ Filum.setup("./log/test.log")
16
+ OrdinoSDK.config do |config|
17
+ config.logger = mock()
18
+ config.logger.stubs(:debug)
19
+ config.logger.stubs(:info)
20
+ config.logger.stubs(:error)
21
+ end
22
+ Loquor.config do |config|
23
+ config.logger = OrdinoSDK.config.logger
24
+ config.access_id = "Sermo"
25
+ config.secret_key = "foobar"
26
+ config.endpoint = "http://localhost:3000/spi"
27
+ end
28
+ end
29
+ end