thebigdb 1.1.0 → 1.2.0

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.
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - 2.0.0
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- thebigdb (1.1.0)
4
+ thebigdb (1.2.0)
5
5
  rack (~> 1.4)
6
6
 
7
7
  GEM
@@ -29,6 +29,7 @@ GEM
29
29
  method_source (~> 0.8)
30
30
  slop (~> 3.4)
31
31
  rack (1.5.2)
32
+ rake (10.0.3)
32
33
  rb-fchange (0.0.6)
33
34
  ffi
34
35
  rb-fsevent (0.9.3)
@@ -54,6 +55,7 @@ PLATFORMS
54
55
 
55
56
  DEPENDENCIES
56
57
  guard-rspec (~> 2.3)
58
+ rake (~> 10.0.3)
57
59
  rb-fchange
58
60
  rb-fsevent
59
61
  rb-inotify
data/README.md CHANGED
@@ -1,49 +1,41 @@
1
1
  # TheBigDB Ruby Wrapper
2
2
 
3
- A simple ruby wrapper for making requests to the API of [TheBigDB.com][0].
3
+ [![Build Status](https://secure.travis-ci.org/thebigdb/thebigdb-ruby.png)](http://travis-ci.org/thebigdb/thebigdb-ruby)
4
+
5
+ A simple ruby wrapper for making requests to the API of [TheBigDB.com](http://thebigdb.com). [Full API documentation](http://developers.thebigdb.com/api).
4
6
 
5
7
  ## Install
6
8
 
7
9
  gem install thebigdb
8
10
 
9
- ## Usage
10
-
11
- Make your requests using this structure:
12
-
11
+ ## Simple usage
13
12
 
14
- TheBigDB::Statement(action, parameters)
13
+ The following actions return a TheBigDB::StatementRequest object, on which you can add params using ``.with(hash_of_params)``.
14
+ The request will be executed once you call regular methods of Hash on it (``each_pair``, ``[key]``, etc.), or force it with ``execute``.
15
+ The Hash returned represents the server's JSON response.
15
16
 
17
+ ### Search \([api doc](http://developers.thebigdb.com/api#statements-search)\)
16
18
 
17
- **[action]** => String of the action as described in the API (e.g. "search", "show", ...)
18
- **[parameters]** => Hash. Request parameters as described in the API. Tip: Arrays like ``["abc", "def"]`` will automatically be converted to ``{"0" => "abc", "1" => "def"}``
19
+ TheBigDB.search("iPhone").with(page: 2)
20
+ TheBigDB.search({match: "James"}, "job", "President of the United States")
21
+ TheBigDB.search({match: "Facebook"}, "job", {match: "Executive"})
19
22
 
23
+ ### Create \([api doc](http://developers.thebigdb.com/api#statements-create)\)
20
24
 
21
- Examples:
22
-
23
- request = TheBigDB::Statement(:search,
24
- {
25
- nodes: [{search: ""}, "job", "President of the United States"],
26
- period: {from: "2000-01-01 00:00:00", to: "2002-01-01 00:00:00"}
27
- }
28
- )
29
-
30
- puts request.response
25
+ TheBigDB.create("iPhone 5", "weight", "112 grams")
26
+ TheBigDB.create("Bill Clinton", "job", "President of the United States").with(period: {from: "1993-01-20 12:00:00", to: "2001-01-20 11:59:59"})
31
27
 
32
- Will print something like:
28
+ ### Show \([api doc](http://developers.thebigdb.com/api#statements-show)\), Upvote \([api doc](http://developers.thebigdb.com/api#statements-upvote)\) and Downvote \([api doc](http://developers.thebigdb.com/api#statements-downvote)\)
33
29
 
34
- {
35
- "status" => "success",
36
- "statements" => [
37
- {"nodes" => ["Bill Clinton", "job", "President of the United States"], "id" => "8e6aec890c942b6f7854d2d7a9f0d002f5ddd0c0", "period"=>{"from" => "1993-01-20 00:00:00", "to" => "2001-01-20 00:00:00"}},
38
- {"nodes" => ["George W. Bush", "job", "President of the United States"], "id" => "3f27673816455054032bd46e65bbe4db8ccf9076", "period"=>{"from" => "2001-01-20 00:00:00", "to" => "2009-01-20 00:00:00"}}
39
- ]
40
- }
30
+ TheBigDB.show("id-of-the-sentence")
31
+ TheBigDB.upvote("id-of-the-sentence")
32
+ TheBigDB.downvote("id-of-the-sentence")
41
33
 
42
34
  That's it!
43
35
 
44
- ## The TheBigDB::Request object
36
+ ## TheBigDB::Request object
45
37
 
46
- Every request you make will return a ``TheBigDB::Request`` object.
38
+ If you want more details on what is sent and what is received, you can use the generic TheBigDB::Statement method. It returns a TheBigDB::Request object.
47
39
  It has several readable attributes:
48
40
 
49
41
  request = TheBigDB::Statement(:search, {nodes: ["iPhone", "weight"]})
@@ -59,20 +51,26 @@ It has several readable attributes:
59
51
  You can access other parts of the API in the same way as statements:
60
52
 
61
53
  TheBigDB::User(action, parameters)
62
- TheBigDB::Toolbox::Unit(action, parameters)
63
54
 
64
55
  # Examples
65
56
  TheBigDB::User(:show, {login: "christophe"}).response["user"]["karma"]
66
- TheBigDB::Toolbox::Unit(:compare, {values: ["100 g", "1.2 kg"]}).response["result"]
67
57
 
68
58
  You can modify the TheBigDB module with several configuration options:
69
59
 
70
60
  TheBigDB.api_key = "your-private-api-key" # default: nil
71
61
  TheBigDB.use_ssl = true # default: false
72
62
 
63
+ # If true, and a request response has {"status" => "error"}, it will raise a TheBigDB::Request::ApiStatusError exception with the API error code
64
+ TheBigDB.raise_on_api_status_error = true # default: false
65
+
73
66
  # Both of them take a Proc or a Lambda, the TheBigDB::Request instance is passed as argument
74
- TheBigDB.before_request_execution = ->(request){ Logger.foo(request) } # default: Proc.new{}
75
- TheBigDB.after_request_execution = ->(request){ Logger.foo(request) } # default: Proc.new{}
67
+ TheBigDB.before_request_execution = ->(request){ logger.info(request.data_sent) } # default: Proc.new{}
68
+ TheBigDB.after_request_execution = ->(request){ logger.info(request.data_received) } # default: Proc.new{}
69
+
70
+ # You can also modify the configuration temporarily
71
+ TheBigDB.with_configuration(use_ssl: true) do
72
+ # your code here
73
+ end
76
74
 
77
75
 
78
76
  ## Contributing
@@ -86,6 +84,3 @@ Don't hesitate to send a pull request !
86
84
  ## License
87
85
 
88
86
  This software is distributed under the MIT License. Copyright (c) 2013, Christophe Maximin <christophe@thebigdb.com>
89
-
90
-
91
- [0]: http://thebigdb.com
@@ -0,0 +1,49 @@
1
+ module TheBigDB
2
+ module Helpers
3
+
4
+ # serialize_query_params({house: "bricks", animals: ["cat", "dog"], computers: {cool: true, drives: ["hard", "flash"]}})
5
+ # => house=bricks&animals%5B%5D=cat&animals%5B%5D=dog&computers%5Bcool%5D=true&computers%5Bdrives%5D%5B%5D=hard&computers%5Bdrives%5D%5B%5D=flash
6
+ # which will be read by the server as:
7
+ # => house=bricks&animals[]=cat&animals[]=dog&computers[cool]=true&computers[drives][]=hard&computers[drives][]=flash
8
+ def self.serialize_query_params(params, prefix = nil)
9
+ ret = []
10
+ params.each_pair do |key, value|
11
+ param_key = prefix ? "#{prefix}[#{key}]" : key
12
+
13
+ if value.is_a?(Hash)
14
+ ret << self.serialize_query_params(value, param_key.to_s)
15
+ elsif value.is_a?(Array)
16
+ sub_hash = {}
17
+ value.each_with_index do |value_item, i|
18
+ sub_hash[i.to_s] = value_item
19
+ end
20
+ ret << self.serialize_query_params(sub_hash, param_key.to_s)
21
+ else
22
+ ret << URI.encode_www_form_component(param_key.to_s) + "=" + URI.encode_www_form_component(value.to_s)
23
+ end
24
+ end
25
+ ret.join("&")
26
+ end
27
+
28
+ # flatten_params_keys({house: "bricks", animals: ["cat", "dog"], computers: {cool: true, drives: ["hard", "flash"]}})
29
+ # => {"house" => "bricks", "animals[0]" => "cat", "animals[1]" => "dog", "computers[cool]" => "true", "computers[drives][0]" => "hard", "computers[drives][1]" => "flash"}
30
+ def self.flatten_params_keys(params)
31
+ serialized_params = self.serialize_query_params(params)
32
+ new_params = {}
33
+ serialized_params.split("&").each do |assign|
34
+ key, value = assign.split("=")
35
+ new_params[URI.decode(key)] = URI.decode(value)
36
+ end
37
+ new_params
38
+ end
39
+
40
+ # Inspired by on ActiveSupport's stringify_keys
41
+ def self.stringify_keys(hash)
42
+ hash.inject({}) do |options, (key, value)|
43
+ options[key.to_s] = value
44
+ options
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -1,5 +1,7 @@
1
1
  module TheBigDB
2
2
  class Request
3
+ class ApiStatusError < StandardError; end
4
+
3
5
  attr_reader :http, :http_request, :http_response, :data_sent, :data_received, :response
4
6
 
5
7
  # Prepares the basic @http object with the current values of the module (host, port, ...)
@@ -24,11 +26,11 @@ module TheBigDB
24
26
  request_uri = "/v#{TheBigDB.api_version}" + (request_uri.start_with?("/") ? request_uri : "/#{request_uri}")
25
27
 
26
28
  if method == "get"
27
- encoded_params = TheBigDB::Request::serialize_query_params(params)
29
+ encoded_params = TheBigDB::Helpers::serialize_query_params(params)
28
30
  @http_request = Net::HTTP::Get.new(request_uri + "?" + encoded_params)
29
31
  elsif method == "post"
30
32
  @http_request = Net::HTTP::Post.new(request_uri)
31
- @http_request.set_form_data(TheBigDB::Request::flatten_params_keys(params))
33
+ @http_request.set_form_data(TheBigDB::Helpers::flatten_params_keys(params))
32
34
  else
33
35
  raise ArgumentError, "The request method must be 'get' or 'post'"
34
36
  end
@@ -50,28 +52,14 @@ module TheBigDB
50
52
  # Actually makes the request prepared in @http_request, and sets @http_response
51
53
  def execute
52
54
  # Here is the order of operations:
55
+ # -> setting @data_sent
53
56
  # -> executing before_request_execution callback
54
57
  # -> executing the HTTP request
55
58
  # -> setting @response
56
- # -> setting @data_sent
57
59
  # -> setting @data_received
58
60
  # -> executing after_request_execution callback
59
61
 
60
- # Executing callback
61
- TheBigDB.before_request_execution.call(self)
62
-
63
- # Here is where the request is actually executed
64
- @http_response = @http.request(@http_request)
65
-
66
- # Setting @response
67
- begin
68
- # We parse the JSON answer and return it.
69
- @response = JSON(@http_response.body)
70
- rescue JSON::ParserError => e
71
- @response = {"error" => {"code" => "0000", "description" => "The server gave an invalid JSON body:\n#{@http_response.body}"}}
72
- end
73
-
74
- # Setting @data_sent and @data_received
62
+ # Setting @data_sent
75
63
  params = Rack::Utils.parse_nested_query(URI.parse(@http_request.path).query)
76
64
  # Since that's how it will be interpreted anyway on the server, we merge the POST params to the GET params,
77
65
  # but it's not supposed to happen: either every params is prepared for GET/query params, or as POST body
@@ -92,54 +80,36 @@ module TheBigDB
92
80
  "params" => params
93
81
  }
94
82
 
83
+ # Executing callback
84
+ TheBigDB.before_request_execution.call(self)
85
+
86
+ # Here is where the request is actually executed
87
+ @http_response = @http.request(@http_request)
88
+
89
+ # Setting @response
90
+ begin
91
+ # We parse the JSON answer and return it.
92
+ @response = JSON(@http_response.body)
93
+ rescue JSON::ParserError => e
94
+ @response = {"status" => "error", "error" => {"code" => "0000", "description" => "The server gave an invalid JSON body:\n#{@http_response.body}"}}
95
+ end
96
+
97
+ # Setting @data_received
95
98
  @data_received = {
96
99
  "headers" => Hash[@http_response.to_hash.map{|k,v| [k, v.join] }],
97
100
  "content" => @response
98
101
  }
99
102
 
103
+ # Executing callback
100
104
  TheBigDB.after_request_execution.call(self)
101
105
 
102
- self
103
- end
104
-
105
- ##############
106
- ## Engine Helpers
107
- ##############
108
-
109
- # serialize_query_params({house: "bricks", animals: ["cat", "dog"], computers: {cool: true, drives: ["hard", "flash"]}})
110
- # => house=bricks&animals%5B%5D=cat&animals%5B%5D=dog&computers%5Bcool%5D=true&computers%5Bdrives%5D%5B%5D=hard&computers%5Bdrives%5D%5B%5D=flash
111
- # which will be read by the server as:
112
- # => house=bricks&animals[]=cat&animals[]=dog&computers[cool]=true&computers[drives][]=hard&computers[drives][]=flash
113
- def self.serialize_query_params(params, prefix = nil)
114
- ret = []
115
- params.each_pair do |key, value|
116
- param_key = prefix ? "#{prefix}[#{key}]" : key
117
-
118
- if value.is_a?(Hash)
119
- ret << self.serialize_query_params(value, param_key.to_s)
120
- elsif value.is_a?(Array)
121
- sub_hash = {}
122
- value.each_with_index do |value_item, i|
123
- sub_hash[i.to_s] = value_item
124
- end
125
- ret << self.serialize_query_params(sub_hash, param_key.to_s)
126
- else
127
- ret << URI.encode_www_form_component(param_key.to_s) + "=" + URI.encode_www_form_component(value.to_s)
128
- end
106
+ # Raising exception if asked
107
+ if TheBigDB.raise_on_api_status_error and @response["status"] == "error"
108
+ raise ApiStatusError.new(@response["error"]["code"])
129
109
  end
130
- ret.join("&")
131
- end
132
110
 
133
- # flatten_params_keys({house: "bricks", animals: ["cat", "dog"], computers: {cool: true, drives: ["hard", "flash"]}})
134
- # => {"house" => "bricks", "animals[0]" => "cat", "animals[1]" => "dog", "computers[cool]" => "true", "computers[drives][0]" => "hard", "computers[drives][1]" => "flash"}
135
- def self.flatten_params_keys(params)
136
- serialized_params = self.serialize_query_params(params)
137
- new_params = {}
138
- serialized_params.split("&").each do |assign|
139
- key, value = assign.split("=")
140
- new_params[URI.decode(key)] = URI.decode(value)
141
- end
142
- new_params
111
+ self
143
112
  end
113
+
144
114
  end
145
115
  end
@@ -1,4 +1,5 @@
1
1
  module TheBigDB
2
+ # Generic request to statements executor
2
3
  def self.Statement(action, params)
3
4
  method = ["get", "show", "search"].include?(action.to_s) ? "GET" : "POST"
4
5
  path = "/statements/#{action}"
@@ -7,4 +8,57 @@ module TheBigDB
7
8
  request.prepare(method, path, params)
8
9
  request.execute
9
10
  end
11
+
12
+ # Beautified builder
13
+ class StatementRequest
14
+ attr_reader :action, :params
15
+
16
+ def initialize(action)
17
+ @action = action
18
+ @params = {}
19
+ @response = nil
20
+ end
21
+
22
+ def with(params = {})
23
+ @response = nil
24
+ @params.merge!(TheBigDB::Helpers::stringify_keys(params))
25
+ self
26
+ end
27
+
28
+ def method_missing(method_name, *arguments, &block)
29
+ @response ||= TheBigDB::Statement(@action, @params).response
30
+ @response.send(method_name, *arguments, &block)
31
+ end
32
+
33
+ def execute
34
+ to_hash # goes through method_missing
35
+ end
36
+ alias_method :response, :execute
37
+
38
+ def execute! # forces the request to be re-executed
39
+ @response = nil
40
+ to_hash
41
+ end
42
+ end
43
+
44
+ # Shortcuts to actions
45
+ def self.search(*nodes)
46
+ StatementRequest.new("search").with(nodes: nodes)
47
+ end
48
+
49
+ def self.create(*nodes)
50
+ StatementRequest.new("create").with(nodes: nodes)
51
+ end
52
+
53
+ def self.show(id = "")
54
+ StatementRequest.new("show").with(id: id)
55
+ end
56
+
57
+ def self.upvote(id = "")
58
+ StatementRequest.new("upvote").with(id: id)
59
+ end
60
+
61
+ def self.downvote(id = "")
62
+ StatementRequest.new("downvote").with(id: id)
63
+ end
10
64
  end
@@ -1,7 +1,7 @@
1
1
  module TheBigDB
2
2
  module VERSION
3
3
  MAJOR = 1
4
- MINOR = 1
4
+ MINOR = 2
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].compact.join('.')
data/lib/thebigdb.rb CHANGED
@@ -7,9 +7,9 @@ require "rack"
7
7
  aliases
8
8
  request
9
9
  version
10
+ helpers
10
11
  resources/statement
11
12
  resources/user
12
- resources/toolbox
13
13
  ).each do |file_name|
14
14
  require File.join(File.dirname(__FILE__), 'thebigdb', file_name)
15
15
  end
@@ -23,7 +23,8 @@ module TheBigDB
23
23
  "use_ssl" => false,
24
24
  "verify_ssl_certificates" => false,
25
25
  "before_request_execution" => Proc.new{},
26
- "after_request_execution" => Proc.new{}
26
+ "after_request_execution" => Proc.new{},
27
+ "raise_on_api_status_error" => false
27
28
  }
28
29
 
29
30
  DEFAULT_CONFIGURATION.each_key do |configuration_key|
@@ -66,8 +67,11 @@ module TheBigDB
66
67
  def self.with_configuration(new_configuration, &block)
67
68
  current_configuration = Hash[DEFAULT_CONFIGURATION.keys.map{|k| [k, send(k)] }]
68
69
  new_configuration.each_pair{|k,v| send(k.to_s + "=", v) }
69
- yield
70
- current_configuration.each_pair{|k,v| send(k.to_s + "=", v) }
70
+ begin
71
+ yield
72
+ ensure
73
+ current_configuration.each_pair{|k,v| send(k.to_s + "=", v) }
74
+ end
71
75
  end
72
76
 
73
77
 
@@ -0,0 +1,72 @@
1
+ require "spec_helper"
2
+
3
+ describe "Helpers" do
4
+ describe "serialize_query_params" do
5
+ it "works with simple a=b&c=d params" do
6
+ TheBigDB::Helpers::serialize_query_params(a: "b", c: "d").should == "a=b&c=d"
7
+ end
8
+
9
+ it "works with more complex imbricated params" do
10
+ TheBigDB::Helpers::serialize_query_params({
11
+ house: "bricks",
12
+ animals: ["cat", "dog"],
13
+ computers: {cool: true, drives: ["hard", "flash"]}
14
+ }).should == "house=bricks&animals%5B0%5D=cat&animals%5B1%5D=dog&computers%5Bcool%5D=true&computers%5Bdrives%5D%5B0%5D=hard&computers%5Bdrives%5D%5B1%5D=flash"
15
+
16
+ # and with a hash instead of an array
17
+ TheBigDB::Helpers::serialize_query_params({
18
+ house: "bricks",
19
+ animals: {"0" => "cat", "1" => "dog"},
20
+ computers: {cool: true, drives: ["hard", "flash"]}
21
+ }).should == "house=bricks&animals%5B0%5D=cat&animals%5B1%5D=dog&computers%5Bcool%5D=true&computers%5Bdrives%5D%5B0%5D=hard&computers%5Bdrives%5D%5B1%5D=flash"
22
+ end
23
+ end
24
+
25
+ describe "flatten_params_keys" do
26
+ it "works with simple a=b&c=d params" do
27
+ TheBigDB::Helpers::flatten_params_keys(a: "b", c: "d").should == {"a" => "b", "c" => "d"}
28
+ end
29
+
30
+ it "works with more complex imbricated params" do
31
+ TheBigDB::Helpers::flatten_params_keys({
32
+ house: "bricks",
33
+ animals: ["cat", "dog"],
34
+ computers: {cool: true, drives: ["hard", "flash"]}
35
+ }).should == {
36
+ "house" => "bricks",
37
+ "animals[0]" => "cat",
38
+ "animals[1]" => "dog",
39
+ "computers[cool]" => "true",
40
+ "computers[drives][0]" => "hard",
41
+ "computers[drives][1]" => "flash"
42
+ }
43
+
44
+ # and with a hash instead of an array
45
+ TheBigDB::Helpers::flatten_params_keys({
46
+ house: "bricks",
47
+ animals: {"0" => "cat", "1" => "dog"},
48
+ computers: {cool: true, drives: ["hard", "flash"]}
49
+ }).should == {
50
+ "house" => "bricks",
51
+ "animals[0]" => "cat",
52
+ "animals[1]" => "dog",
53
+ "computers[cool]" => "true",
54
+ "computers[drives][0]" => "hard",
55
+ "computers[drives][1]" => "flash"
56
+ }
57
+ end
58
+ end
59
+
60
+ describe "stringify_keys" do
61
+ it "works with simple mixed hash" do
62
+ TheBigDB::Helpers::stringify_keys({
63
+ :a => "foo",
64
+ "b" => "bar",
65
+ "a" => "foo2"
66
+ }).should == {
67
+ "a" => "foo2",
68
+ "b" => "bar"
69
+ }
70
+ end
71
+ end
72
+ end
data/spec/request_spec.rb CHANGED
@@ -82,6 +82,15 @@ describe "executing" do
82
82
  end
83
83
  end
84
84
 
85
+ context "failing requests" do
86
+ it "can raise an exception" do
87
+ stub_request(:get, /#{TheBigDB.api_host}/).to_return(:body => "invalid json")
88
+
89
+ TheBigDB.raise_on_api_status_error = true
90
+ lambda { TheBigDB.send_request(:get, "/") }.should raise_error(TheBigDB::Request::ApiStatusError, "0000")
91
+ end
92
+ end
93
+
85
94
  context "GET requests" do
86
95
  context "with basic params" do
87
96
  before do
@@ -253,63 +262,4 @@ describe "executing" do
253
262
  end
254
263
  end
255
264
  end
256
- end
257
-
258
- describe "Request helper" do
259
- describe "serialize_query_params" do
260
- it "works with simple a=b&c=d params" do
261
- TheBigDB::Request.serialize_query_params(a: "b", c: "d").should == "a=b&c=d"
262
- end
263
-
264
- it "works with more complex imbricated params" do
265
- TheBigDB::Request.serialize_query_params({
266
- house: "bricks",
267
- animals: ["cat", "dog"],
268
- computers: {cool: true, drives: ["hard", "flash"]}
269
- }).should == "house=bricks&animals%5B0%5D=cat&animals%5B1%5D=dog&computers%5Bcool%5D=true&computers%5Bdrives%5D%5B0%5D=hard&computers%5Bdrives%5D%5B1%5D=flash"
270
-
271
- # and with a hash instead of an array
272
- TheBigDB::Request.serialize_query_params({
273
- house: "bricks",
274
- animals: {"0" => "cat", "1" => "dog"},
275
- computers: {cool: true, drives: ["hard", "flash"]}
276
- }).should == "house=bricks&animals%5B0%5D=cat&animals%5B1%5D=dog&computers%5Bcool%5D=true&computers%5Bdrives%5D%5B0%5D=hard&computers%5Bdrives%5D%5B1%5D=flash"
277
- end
278
- end
279
-
280
- describe "flatten_params_keys" do
281
- it "works with simple a=b&c=d params" do
282
- TheBigDB::Request.flatten_params_keys(a: "b", c: "d").should == {"a" => "b", "c" => "d"}
283
- end
284
-
285
- it "works with more complex imbricated params" do
286
- TheBigDB::Request.flatten_params_keys({
287
- house: "bricks",
288
- animals: ["cat", "dog"],
289
- computers: {cool: true, drives: ["hard", "flash"]}
290
- }).should == {
291
- "house" => "bricks",
292
- "animals[0]" => "cat",
293
- "animals[1]" => "dog",
294
- "computers[cool]" => "true",
295
- "computers[drives][0]" => "hard",
296
- "computers[drives][1]" => "flash"
297
- }
298
-
299
- # and with a hash instead of an array
300
- TheBigDB::Request.flatten_params_keys({
301
- house: "bricks",
302
- animals: {"0" => "cat", "1" => "dog"},
303
- computers: {cool: true, drives: ["hard", "flash"]}
304
- }).should == {
305
- "house" => "bricks",
306
- "animals[0]" => "cat",
307
- "animals[1]" => "dog",
308
- "computers[cool]" => "true",
309
- "computers[drives][0]" => "hard",
310
- "computers[drives][1]" => "flash"
311
- }
312
- end
313
- end
314
- end
315
-
265
+ end
@@ -3,27 +3,77 @@ require "spec_helper"
3
3
  describe "Statement" do
4
4
  context "basic request executing" do
5
5
  before do
6
- stub_request(:get, /#{TheBigDB.api_host}\/v#{TheBigDB.api_version}\/statements\/search/).to_return(:body => '{"server_says": "hello world"}')
6
+ stub_request(:get, @request_path.call("search")).to_return(:body => '{"server_says": "hello world"}')
7
7
 
8
8
  @request = TheBigDB::Statement(:search, nodes: ["a", "b"])
9
9
  end
10
10
 
11
11
  it "sets the correct data_sent instance variable" do
12
12
  @request.data_sent.should == {
13
- "headers" => Hash[@request.http_request.to_hash.map{|k,v| [k, v.join] }],
14
- "host" => TheBigDB.api_host,
15
- "port" => TheBigDB.api_port,
16
- "path" => "/v#{TheBigDB.api_version}/statements/search",
17
- "method" => "GET",
18
- "params" => {"nodes" => {"0" => "a", "1" => "b"}}
19
- }
13
+ "headers" => Hash[@request.http_request.to_hash.map{|k,v| [k, v.join] }],
14
+ "host" => TheBigDB.api_host,
15
+ "port" => TheBigDB.api_port,
16
+ "path" => "/v#{TheBigDB.api_version}/statements/search",
17
+ "method" => "GET",
18
+ "params" => {"nodes" => {"0" => "a", "1" => "b"}}
19
+ }
20
20
  end
21
21
 
22
22
  it "sets the correct data_received instance variable" do
23
23
  @request.data_received.should include({
24
- "headers" => Hash[@request.http_response.to_hash.map{|k,v| [k, v.join] }],
25
- "content" => {"server_says" => "hello world"}
26
- })
24
+ "headers" => Hash[@request.http_response.to_hash.map{|k,v| [k, v.join] }],
25
+ "content" => {"server_says" => "hello world"}
26
+ })
27
27
  end
28
28
  end
29
+ end
30
+
31
+ describe "StatementRequest" do
32
+ before do
33
+ end
34
+
35
+ it "makes normal requests" do
36
+ @search = TheBigDB.search("a", "b", {match: "blue"})
37
+ @search.with(page: 2)
38
+ @search.params.should == {"nodes" => ["a", "b", {match: "blue"}], "page" => 2}
39
+ end
40
+
41
+ it "cache the response unless the params are modified, or asked to" do
42
+ stub_request(:get, @request_path.call("search")).to_return(:body => '{status: "success", statements: []}')
43
+
44
+ response = TheBigDB.search("a", "b", {match: "blue"}).with(page: 2)
45
+ response.execute
46
+ response.execute
47
+
48
+ response = TheBigDB.search("a", "b", {match: "red"}).with(page: 2)
49
+ response.execute
50
+ response.execute!
51
+
52
+ a_request(:get, @request_path.call("search"))
53
+ .with(query: hash_including({"nodes" => ["a", "b", {match: "blue"}], "page" => "2"})).should have_been_made.once
54
+
55
+ a_request(:get, @request_path.call("search"))
56
+ .with(query: hash_including({"nodes" => ["a", "b", {match: "red"}], "page" => "2"})).should have_been_made.times(2)
57
+ end
58
+
59
+ it "has standard actions correctly binded" do
60
+ stub_request(:get, @request_path.call("search")).to_return(:body => '{status: "success", statements: []}')
61
+ stub_request(:get, @request_path.call("show")).to_return(:body => '{status: "success"}')
62
+ stub_request(:post, @request_path.call("create")).to_return(:body => '{status: "success"}')
63
+ stub_request(:post, @request_path.call("upvote")).to_return(:body => '{status: "success"}')
64
+ stub_request(:post, @request_path.call("downvote")).to_return(:body => '{status: "success"}')
65
+
66
+ TheBigDB.search("a", "b", {match: "blue"}).execute
67
+ TheBigDB.show("foobar").execute
68
+ TheBigDB.create("foobar").execute
69
+ TheBigDB.upvote("foobar").execute
70
+ TheBigDB.downvote("foobar").execute
71
+
72
+ a_request(:get, @request_path.call("search")).should have_been_made.once
73
+ a_request(:get, @request_path.call("show")).should have_been_made.once
74
+ a_request(:post, @request_path.call("create")).should have_been_made.once
75
+ a_request(:post, @request_path.call("upvote")).should have_been_made.once
76
+ a_request(:post, @request_path.call("downvote")).should have_been_made.once
77
+ end
78
+
29
79
  end
data/spec/spec_helper.rb CHANGED
@@ -8,6 +8,8 @@ RSpec.configure do |config|
8
8
  config.before(:each) do
9
9
  TheBigDB::DEFAULT_CONFIGURATION["api_host"] = "fake.test.host"
10
10
  TheBigDB.reset_default_configuration
11
+
12
+ @request_path = ->(action){ /#{TheBigDB.api_host}\/v#{TheBigDB.api_version}\/statements\/#{action}/ }
11
13
  end
12
14
 
13
15
  config.after(:each) do
data/thebigdb.gemspec CHANGED
@@ -4,7 +4,6 @@ require "thebigdb/version"
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "thebigdb"
6
6
  s.version = TheBigDB::VERSION::STRING
7
- s.date = "2013-03-12"
8
7
  s.summary = "Ruby bindings for TheBigDB API"
9
8
  s.description = "TheBigDB a simply structured open database of real life facts. See http://thebigdb.com for details."
10
9
  s.authors = ["Christophe Maximin"]
@@ -15,6 +14,7 @@ Gem::Specification.new do |s|
15
14
 
16
15
  s.add_runtime_dependency "rack", "~> 1.4"
17
16
 
17
+ s.add_development_dependency "rake", "~> 10.0.3"
18
18
  s.add_development_dependency "rspec", "~> 2.12"
19
19
  s.add_development_dependency "guard-rspec", "~> 2.3"
20
20
  s.add_development_dependency "rb-inotify"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thebigdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-12 00:00:00.000000000 Z
12
+ date: 2013-04-01 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: '1.4'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 10.0.3
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 10.0.3
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: rspec
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -132,6 +148,7 @@ extra_rdoc_files: []
132
148
  files:
133
149
  - .gitignore
134
150
  - .rspec
151
+ - .travis.yml
135
152
  - Gemfile
136
153
  - Gemfile.lock
137
154
  - Guardfile
@@ -140,15 +157,15 @@ files:
140
157
  - Rakefile
141
158
  - lib/thebigdb.rb
142
159
  - lib/thebigdb/aliases.rb
160
+ - lib/thebigdb/helpers.rb
143
161
  - lib/thebigdb/module_attribute_accessors.rb
144
162
  - lib/thebigdb/request.rb
145
163
  - lib/thebigdb/resources/statement.rb
146
- - lib/thebigdb/resources/toolbox.rb
147
164
  - lib/thebigdb/resources/user.rb
148
165
  - lib/thebigdb/version.rb
166
+ - spec/helpers_spec.rb
149
167
  - spec/request_spec.rb
150
168
  - spec/resources/statement_spec.rb
151
- - spec/resources/toolbox_spec.rb
152
169
  - spec/resources/user_spec.rb
153
170
  - spec/spec_helper.rb
154
171
  - spec/thebigdb_spec.rb
@@ -178,9 +195,9 @@ signing_key:
178
195
  specification_version: 3
179
196
  summary: Ruby bindings for TheBigDB API
180
197
  test_files:
198
+ - spec/helpers_spec.rb
181
199
  - spec/request_spec.rb
182
200
  - spec/resources/statement_spec.rb
183
- - spec/resources/toolbox_spec.rb
184
201
  - spec/resources/user_spec.rb
185
202
  - spec/spec_helper.rb
186
203
  - spec/thebigdb_spec.rb
@@ -1,12 +0,0 @@
1
- module TheBigDB
2
- module Toolbox
3
- def self.Unit(action, params)
4
- method = "GET"
5
- path = "/toolbox/units/#{action}"
6
-
7
- request = TheBigDB::Request.new
8
- request.prepare(method, path, params)
9
- request.execute
10
- end
11
- end
12
- end
@@ -1,29 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "Toolbox Units" do
4
- context "basic request executing" do
5
- before do
6
- stub_request(:get, /#{TheBigDB.api_host}\/v#{TheBigDB.api_version}\/toolbox\/units\/convert/).to_return(:body => '{"server_says": "hello world"}')
7
-
8
- @request = TheBigDB::Toolbox::Unit(:convert, :value => "100 ly", :new_unit => "cm")
9
- end
10
-
11
- it "sets the correct data_sent instance variable" do
12
- @request.data_sent.should == {
13
- "headers" => Hash[@request.http_request.to_hash.map{|k,v| [k, v.join] }],
14
- "host" => TheBigDB.api_host,
15
- "port" => TheBigDB.api_port,
16
- "path" => "/v#{TheBigDB.api_version}/toolbox/units/convert",
17
- "method" => "GET",
18
- "params" => {"value" => "100 ly", "new_unit" => "cm"}
19
- }
20
- end
21
-
22
- it "sets the correct data_received instance variable" do
23
- @request.data_received.should include({
24
- "headers" => Hash[@request.http_response.to_hash.map{|k,v| [k, v.join] }],
25
- "content" => {"server_says" => "hello world"}
26
- })
27
- end
28
- end
29
- end