loquor 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 937168fc0385f2a0842aa6d6a6dcacd2d9ea529d
4
- data.tar.gz: 6c1be377cbe87ac489c55b936b4ba89ef71c60b9
3
+ metadata.gz: 070654de10baeadaf8cdb835f456d178456077c0
4
+ data.tar.gz: 0d3e50f2eabba9f9aa1e16f5b4cf56fe14cb5afe
5
5
  SHA512:
6
- metadata.gz: 6c067e8417007a642691acaa979ec7b26ecb77f2f77037e03ebd18b78ba2cc979a27b366e35c2299133d8ab373df7927093942dba961cfa487229b0025372375
7
- data.tar.gz: 807ed1e17a3931d46b864b32de2d4b18badc6d82fbdcab05750566d00ab1c948d6c73a680a82978d895c62bd18349b1933e91340898cabdf01dbf3aeb7249982
6
+ metadata.gz: 8a5ced6b3668a0ad27d4c00c3c7294737b593e909a3663b147565d2b628b0528912d385705a00e8419440b1f3c0b10953f0c95fec583e5d8375ec8e464ea8bbf
7
+ data.tar.gz: 74d3922223e408c2a89cc5134593df7cfc2316a83d6873f968392e8a26fda795a73b15aaf3b12b6ecf21abc8d42ac3ff789c3b9556c33d1fdec79c7744635d85
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Loquor
1
+ # Loquor - Meducation API Dispatcher
2
2
 
3
3
  [![Build Status](https://travis-ci.org/meducation/loquor.png)](https://travis-ci.org/meducation/loquor)
4
4
  [![Dependencies](https://gemnasium.com/meducation/loquor.png?travis)](https://gemnasium.com/meducation/loquor)
@@ -10,16 +10,14 @@ Handles calls to the Meducation API via an ActiveRecord-style interface
10
10
 
11
11
  Add this line to your application's Gemfile:
12
12
 
13
- gem 'loquor'
13
+ ```ruby
14
+ gem 'loquor'
15
+ ```
14
16
 
15
17
  And then execute:
16
18
 
17
19
  $ bundle
18
20
 
19
- Or install it yourself as:
20
-
21
- $ gem install loquor
22
-
23
21
 
24
22
  ## Usage
25
23
 
@@ -32,16 +30,16 @@ Loquor.config do |config|
32
30
  end
33
31
  ```
34
32
 
35
- Now you make requests to get, create, update, destroy and list a range of objects, like this:
33
+ Now you can make requests to get, create, update, destroy and list a range of objects, like this:
36
34
 
37
35
  ```ruby
38
- User.where(email: "jeremy@meducation.net").where(name: "Jeremy").each do |user|
36
+ Loquor::User.where(email: "jeremy@meducation.net").where(name: "Jeremy").each do |user|
39
37
  p "The user with id ##{user['id']} is #{user['name']}."
40
38
  end
41
39
 
42
- User.find(2) # => {id: 2, name: "Jeremy Walker"}
40
+ Loquor::User.find(2) # => {id: 2, name: "Jeremy Walker"}
43
41
 
44
- User.create(name: "Jeremy Walker", email: "jeremy@meducation.net") # => {id: 2, name: "Jeremy Walker", email "jeremy@meducation.net"}
42
+ Loquor::User.create(name: "Jeremy Walker", email: "jeremy@meducation.net") # => {id: 2, name: "Jeremy Walker", email "jeremy@meducation.net"}
45
43
  ```
46
44
 
47
45
  ### Supported Objects
data/lib/loquor.rb CHANGED
@@ -5,14 +5,20 @@ require 'filum'
5
5
  require "loquor/version"
6
6
  require "loquor/configuration"
7
7
  require "loquor/client"
8
- require 'loquor/path_builder'
9
8
  require 'loquor/representation'
10
- require 'loquor/representations'
11
9
 
12
10
  require 'loquor/api_call'
13
11
  require "loquor/http_action"
14
12
 
15
13
  module Loquor
14
+
15
+ Representations = {
16
+ "GroupDiscussion" => "/group_discussions",
17
+ "GroupDiscussionPost" => "/group_discussion_posts",
18
+ "MediaFile" => "/media_files",
19
+ "User" => "/users"
20
+ }
21
+
16
22
  def self.config
17
23
  if block_given?
18
24
  yield loquor.config
@@ -35,3 +41,5 @@ module Loquor
35
41
  @loquor ||= Client.new
36
42
  end
37
43
  end
44
+
45
+ require 'loquor/representations'
@@ -1,11 +1,11 @@
1
1
  module Loquor
2
2
  class ApiCall
3
- include Loquor::PathBuilder
4
3
  def initialize(path)
5
- setup_path_builder(path)
4
+ @path = path
6
5
  end
7
6
  end
8
7
  end
9
8
 
9
+ require 'loquor/api_calls/create'
10
10
  require 'loquor/api_calls/show'
11
11
  require 'loquor/api_calls/index'
@@ -0,0 +1,14 @@
1
+ module Loquor
2
+ class ApiCall::Create < ApiCall
3
+
4
+ def initialize(path, payload)
5
+ super(path)
6
+ @payload = payload
7
+ end
8
+
9
+ def execute
10
+ Loquor.post(@path, @payload)
11
+ end
12
+ end
13
+ end
14
+
@@ -40,7 +40,7 @@ module Loquor
40
40
  raise LoquorError.new("Filter values must be strings or arrays.")
41
41
  end
42
42
  }.join("&")
43
- "#{build_path}?#{query_string}"
43
+ "#{@path}?#{query_string}"
44
44
  end
45
45
  end
46
46
  end
@@ -7,7 +7,7 @@ module Loquor
7
7
  end
8
8
 
9
9
  def execute
10
- Loquor.get("#{build_path}/#{@id}")
10
+ Loquor.get("#{@path}/#{@id}")
11
11
  end
12
12
  end
13
13
  end
@@ -6,6 +6,7 @@ module Loquor
6
6
  end
7
7
 
8
8
  def signed_request
9
+ @config.logger.info "Signing request."
9
10
  ApiAuth.sign!(request, @config.access_id, @config.secret_key)
10
11
  end
11
12
  end
@@ -9,7 +9,10 @@ module Loquor
9
9
  end
10
10
 
11
11
  def get
12
- JSON.parse(signed_request.execute)
12
+ @config.logger.info "Making GET request to: #{@url}"
13
+ response = JSON.parse(signed_request.execute)
14
+ @config.logger.info "Signed request executed. Response: #{response}"
15
+ response
13
16
  end
14
17
 
15
18
  private
@@ -19,4 +22,3 @@ module Loquor
19
22
  end
20
23
  end
21
24
  end
22
-
@@ -10,7 +10,10 @@ module Loquor
10
10
  end
11
11
 
12
12
  def post
13
- JSON.parse(signed_request.execute)
13
+ @config.logger.info "Making POST request to: #{@url}"
14
+ response = JSON.parse(signed_request.execute)
15
+ @config.logger.info "Signed request executed. Response: #{response}"
16
+ response
14
17
  end
15
18
 
16
19
  private
@@ -1,8 +1,7 @@
1
1
  module Loquor
2
2
  module Representation
3
3
  module ClassMethods
4
-
5
- [:find, :where].each do |proxy|
4
+ [:find, :where, :create].each do |proxy|
6
5
  define_method proxy do |*args|
7
6
  new.send proxy, *args
8
7
  end
@@ -17,6 +16,10 @@ module Loquor
17
16
  def where(*args)
18
17
  ApiCall::Index.new(self.class.path).where(*args)
19
18
  end
19
+
20
+ def create(payload)
21
+ ApiCall::Create.new(self.class.path, payload).execute
22
+ end
20
23
  end
21
24
  end
22
25
  end
@@ -1,16 +1,13 @@
1
- {
2
- "Group::Discussion" => "/group/:group_id/discussions",
3
- "Group::DiscussionPost" => "/group/:group_id/discussion",
4
- "MediaFile" => "/media_files",
5
- "User" => "/users"
6
- }.each do |name, path|
1
+ Loquor::Representations.each do |name, path|
7
2
  klass = Class.new(Object) do
8
3
  extend Loquor::Representation::ClassMethods
9
4
  include Loquor::Representation::InstanceMethods
10
5
 
11
- define_method :path do
12
- path
13
- end
6
+ instance_eval <<-EOS
7
+ def path
8
+ "#{path}"
9
+ end
10
+ EOS
14
11
  end
15
12
 
16
13
  # Split off the Group and Discussion parts
@@ -1,3 +1,3 @@
1
1
  module Loquor
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,22 @@
1
+ module Loquor
2
+ class HttpAction::Test < Minitest::Test
3
+ def setup
4
+ super
5
+ @access_id = "123"
6
+ @secret_key = "Foobar132"
7
+ @endpoint = "http://www.thefoobar.com"
8
+ end
9
+
10
+ def deps
11
+ logger = mock()
12
+ logger.stubs(info: nil)
13
+
14
+ config = mock()
15
+ config.stubs(logger: logger)
16
+ config.stubs(access_id: @access_id)
17
+ config.stubs(secret_key: @secret_key)
18
+ config.stubs(endpoint: @endpoint)
19
+ {config: config}
20
+ end
21
+ end
22
+ end
@@ -1,7 +1,8 @@
1
1
  require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Loquor
4
- class HttpAction::GetTest < Minitest::Test
4
+ class HttpAction::GetTest < HttpAction::Test
5
+
5
6
  def test_get_should_call_new
6
7
  url = "foobar"
7
8
  deps = {x: true}
@@ -17,32 +18,24 @@ module Loquor
17
18
  def test_get_parses_request
18
19
  output = {'foo' => 'bar'}
19
20
  json = output.to_json
20
- gets = HttpAction::Get.new("", {})
21
+
22
+ gets = HttpAction::Get.new("", deps)
21
23
  gets.expects(signed_request: mock(execute: json))
22
24
  assert_equal output, gets.get
23
25
  end
24
26
 
25
27
  def test_request_is_generated_correctly
26
28
  url = "/foobar"
27
- endpoint = "http://thefoobar.com"
28
- config = mock(endpoint: endpoint)
29
- full_url = "#{endpoint}#{url}"
30
- deps = {config: config}
31
-
29
+ full_url = "#{@endpoint}#{url}"
32
30
  RestClient::Request.expects(:new).with(url: full_url, method: :get)
33
31
  HttpAction::Get.new(url, deps).send(:request)
34
32
  end
35
33
 
36
34
  def test_request_is_signed_correctly
37
- access_id = "foobar1"
38
- secret_key = "foobar2"
39
- config = mock(access_id: access_id, secret_key: secret_key)
40
- deps = {config: config}
41
-
42
35
  gets = HttpAction::Get.new("", deps)
43
36
  request = RestClient::Request.new(url: "http://localhost:3000", method: :get)
44
37
  gets.expects(request: request)
45
- ApiAuth.expects(:sign!).with(request, access_id, secret_key)
38
+ ApiAuth.expects(:sign!).with(request, @access_id, @secret_key)
46
39
  gets.send(:signed_request)
47
40
  end
48
41
  end
@@ -1,7 +1,7 @@
1
1
  require File.expand_path('../../test_helper', __FILE__)
2
2
 
3
3
  module Loquor
4
- class HttpAction::PostTest < Minitest::Test
4
+ class HttpAction::PostTest < HttpAction::Test
5
5
  def test_post_should_call_new
6
6
  url = "foobar"
7
7
  payload = {y: false}
@@ -26,10 +26,7 @@ module Loquor
26
26
  def test_request_is_generated_correctly
27
27
  url = "/foobar"
28
28
  payload = {foo: true, bar: false}
29
- endpoint = "http://thefoobar.com"
30
- config = mock(endpoint: endpoint)
31
- full_url = "#{endpoint}#{url}"
32
- deps = {config: config}
29
+ full_url = "#{@endpoint}#{url}"
33
30
 
34
31
  RestClient::Request.expects(:new).with(
35
32
  url: full_url,
@@ -42,15 +39,10 @@ module Loquor
42
39
  end
43
40
 
44
41
  def test_request_is_signed_correctly
45
- access_id = "foobar1"
46
- secret_key = "foobar2"
47
- config = mock(access_id: access_id, secret_key: secret_key)
48
- deps = {config: config}
49
-
50
42
  posts = HttpAction::Post.new("", {}, deps)
51
43
  request = RestClient::Request.new(url: "http://localhost:3000", method: :post)
52
44
  posts.expects(request: request)
53
- ApiAuth.expects(:sign!).with(request, access_id, secret_key)
45
+ ApiAuth.expects(:sign!).with(request, @access_id, @secret_key)
54
46
  posts.send(:signed_request)
55
47
  end
56
48
 
@@ -6,10 +6,16 @@ module Loquor
6
6
  {
7
7
  MediaFile: "/media_files",
8
8
  User: "/users"
9
+ GroupDiscussion: "/group_discussions"
10
+ GroupDiscussionPost: "/group_discussion_posts"
9
11
  }.each do |klass, path|
10
12
  define_method "test_#{klass}_set_up_correctly" do
11
13
  assert Loquor.const_defined?(klass)
12
14
  end
15
+
16
+ define_method "test_#{klass}_stores_path_up_correctly" do
17
+ assert_equal path, Loquor.const_get(klass).path
18
+ end
13
19
  end
14
20
  end
15
21
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loquor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Walker
@@ -123,6 +123,7 @@ files:
123
123
  - Rakefile
124
124
  - lib/loquor.rb
125
125
  - lib/loquor/api_call.rb
126
+ - lib/loquor/api_calls/create.rb
126
127
  - lib/loquor/api_calls/index.rb
127
128
  - lib/loquor/api_calls/show.rb
128
129
  - lib/loquor/client.rb
@@ -130,7 +131,6 @@ files:
130
131
  - lib/loquor/http_action.rb
131
132
  - lib/loquor/http_actions/get.rb
132
133
  - lib/loquor/http_actions/post.rb
133
- - lib/loquor/path_builder.rb
134
134
  - lib/loquor/representation.rb
135
135
  - lib/loquor/representations.rb
136
136
  - lib/loquor/version.rb
@@ -138,9 +138,9 @@ files:
138
138
  - test/api_calls/index_test.rb
139
139
  - test/client_test.rb
140
140
  - test/configuration_test.rb
141
+ - test/http_action_test.rb
141
142
  - test/http_actions/get_test.rb
142
143
  - test/http_actions/post_test.rb
143
- - test/path_builder_test.rb
144
144
  - test/representation_test.rb
145
145
  - test/representations_test.rb
146
146
  - test/test_helper.rb
@@ -172,9 +172,9 @@ test_files:
172
172
  - test/api_calls/index_test.rb
173
173
  - test/client_test.rb
174
174
  - test/configuration_test.rb
175
+ - test/http_action_test.rb
175
176
  - test/http_actions/get_test.rb
176
177
  - test/http_actions/post_test.rb
177
- - test/path_builder_test.rb
178
178
  - test/representation_test.rb
179
179
  - test/representations_test.rb
180
180
  - test/test_helper.rb
@@ -1,44 +0,0 @@
1
- module Loquor
2
-
3
- class MissingUrlComponentError < LoquorError
4
- def initialize(url_component)
5
- @url_component = url_component
6
- end
7
-
8
- def message
9
- "#{url_component} has not been set. Use Object.for_#{url_component}"
10
- end
11
- end
12
-
13
- module PathBuilder
14
- PATH_PART_REGEX = /:[a-z0-9_]+/
15
-
16
- def setup_path_builder(path)
17
- path.split('/').each do |path_part|
18
- next unless path_part =~ PATH_PART_REGEX
19
- path_part = path_part[1..-1]
20
- method_name = "for_#{path_part}"
21
-
22
- self.class.send :define_method, method_name do |id|
23
- @path_parts ||= {}
24
- @path_parts[path_part.to_sym] = id
25
- self
26
- end
27
-
28
- self.class.class_eval <<-EOS
29
- def self.#{method_name}(*args)
30
- new.#{method_name}(*args)
31
- end
32
- EOS
33
- end
34
-
35
- self.class.send :define_method, :build_path do
36
- path.gsub(PATH_PART_REGEX) do |path_part|
37
- path_part = path_part[1..-1].to_sym
38
- @path_parts ||= {}
39
- @path_parts.fetch(path_part) { raise MissingUrlComponentError.new(path_part) }
40
- end
41
- end
42
- end
43
- end
44
- end
@@ -1,46 +0,0 @@
1
- require File.expand_path('../test_helper', __FILE__)
2
-
3
- module Loquor
4
- class PathBuilderTest < Minitest::Test
5
- class SimplePathRepresentation
6
- include PathBuilder
7
-
8
- def initialize
9
- setup_path_builder("/foobar123")
10
- end
11
- end
12
-
13
- class ComplexPathRepresentation
14
- include PathBuilder
15
-
16
- def initialize
17
- setup_path_builder("/groups/:group_id/discussions")
18
- end
19
- end
20
-
21
- def test_find_should_get_correct_path_with_simple_path
22
- id = 8
23
- assert_equal "/foobar123", SimplePathRepresentation.new.send(:build_path)
24
- end
25
-
26
- def test_path_part_methods_are_created
27
- rep = ComplexPathRepresentation.new
28
- assert rep.respond_to?(:for_group_id)
29
- end
30
-
31
- def test_find_should_get_correct_path_with_complex_path
32
- group_id = 5
33
- rep = ComplexPathRepresentation.new
34
- rep.for_group_id(5)
35
- assert_equal "/groups/#{group_id}/discussions", rep.send(:build_path)
36
- end
37
-
38
- def test_find_should_get_raise_exception_without_path_parts
39
- rep = ComplexPathRepresentation.new
40
- assert_raises(Loquor::MissingUrlComponentError) do
41
- rep.send :build_path
42
- end
43
- end
44
- end
45
- end
46
-