reflect 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 928aa43cbfd50fdfcd1843a1233bbf704a45e509
4
- data.tar.gz: d5afdd92cf542be18c98a47b02096ef6be285695
3
+ metadata.gz: 8195355dc7c3a4cc55fb41608d89c917f613ad7d
4
+ data.tar.gz: 40ffa0b99ac7b34ae6e74310ceb7441188d76256
5
5
  SHA512:
6
- metadata.gz: c044b1a3ec63e1110f16af6b69a78569d84d573e39d2e5e3be1907441a8feca2dca3c5715a73f44aac91bd39fb9123e4995be2f2bdfd25cb72d00b34787f5e62
7
- data.tar.gz: 322204507bcdbe50df45c8b028a2e31c54303b0d643d8a766fcfb4bd7da6dec045d9dce8f350464a231d489fe3db6b07ad5cbbbbf27e31af60882b26a39a5a7a
6
+ metadata.gz: 9cd4a2ae7c8e72e656e307fc95e0a8ed604036c99d7d2685866760adbb26038949a21d160c65c5701f760d82126d0de0bf82349bf3ef0e740bcfd467920645c7
7
+ data.tar.gz: aedb80cdd4c7f38ab93fa4272b73cddc21cff62e97b4ebcc4d63cf3e67a78275193adf2370a5194140715b2cf6b9332722a738fb8ffb6f2c8403625da67a3eaa
@@ -1,9 +1,10 @@
1
1
  $:.unshift(File.expand_path("../", __FILE__))
2
2
 
3
- require 'reflect/key_list'
3
+ require 'openssl'
4
+ require 'base64'
5
+
6
+ require 'reflect/parameter'
4
7
  require 'reflect/request_error'
5
- require 'reflect/keyspace'
6
- require 'reflect/field'
7
8
  require 'reflect/client'
8
9
 
9
10
  module Reflect
@@ -28,4 +29,23 @@ module Reflect
28
29
  def self.logger
29
30
  @logger ||= Logger.new("/dev/null")
30
31
  end
32
+
33
+ def self.generate_token(secret_key, parameters=[])
34
+ data = parameters.map do |param|
35
+ is_arr = param.value.is_a? Array
36
+
37
+ val = if !is_arr then param.value.to_s else '' end
38
+ vals = if is_arr then param.value.map(&:to_s).sort else [] end
39
+
40
+ JSON.generate([param.field, param.op, val, vals])
41
+ end
42
+
43
+ digest = OpenSSL::Digest.new('sha256')
44
+ hmac = OpenSSL::HMAC.new(secret_key, digest)
45
+ .update("V2\n")
46
+ .update(data.sort.join("\n"))
47
+ .digest
48
+
49
+ "=2=#{Base64.encode64(hmac).strip}"
50
+ end
31
51
  end
@@ -13,17 +13,6 @@ module Reflect
13
13
  @token = token
14
14
  end
15
15
 
16
- def keyspace(slug)
17
- res = get("/v1/keyspaces/#{slug}")
18
-
19
- if res.response.code == "200"
20
- Keyspace.new(self, JSON.parse(res.body))
21
- else
22
- # TODO: What happens if we failed to look this up or whatever?
23
- raise Reflect::RequestError, Reflect._format_error_message(res)
24
- end
25
- end
26
-
27
16
  def get(path)
28
17
  self.class.get(URI.encode(path), options)
29
18
  end
@@ -0,0 +1,13 @@
1
+ module Reflect
2
+ class Parameter
3
+ attr_reader :field
4
+ attr_reader :op
5
+ attr_accessor :value
6
+
7
+ def initialize(field, op, value=nil)
8
+ @field = field
9
+ @op = op
10
+ @value = value
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module Reflect
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reflect
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brad Heller
@@ -60,9 +60,7 @@ extra_rdoc_files: []
60
60
  files:
61
61
  - lib/reflect.rb
62
62
  - lib/reflect/client.rb
63
- - lib/reflect/field.rb
64
- - lib/reflect/key_list.rb
65
- - lib/reflect/keyspace.rb
63
+ - lib/reflect/parameter.rb
66
64
  - lib/reflect/request_error.rb
67
65
  - lib/reflect/version.rb
68
66
  - reflect.gemspec
@@ -85,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
83
  version: '0'
86
84
  requirements: []
87
85
  rubyforge_project:
88
- rubygems_version: 2.4.8
86
+ rubygems_version: 2.6.10
89
87
  signing_key:
90
88
  specification_version: 3
91
89
  summary: Reflect.io API Ruby client
@@ -1,19 +0,0 @@
1
- module Reflect
2
- class Field
3
- attr_accessor :name
4
- attr_accessor :column_type
5
- attr_accessor :type
6
- attr_accessor :description
7
- attr_accessor :fields
8
- attr_accessor :created_at
9
- attr_accessor :updated_at
10
-
11
- def initialize(client, attrs={})
12
- @client = client
13
-
14
- attrs.each do |k, v|
15
- self.send("#{k}=".to_s, v)
16
- end
17
- end
18
- end
19
- end
@@ -1,21 +0,0 @@
1
- module Reflect
2
- class KeyList
3
- include Enumerable
4
-
5
- attr_reader :keys
6
- attr_reader :next
7
-
8
- def initialize(keys, continuation)
9
- @keys = keys || []
10
- @next = continuation
11
- end
12
-
13
- def each(&blk)
14
- keys.each(&blk)
15
- end
16
-
17
- def empty?
18
- keys.count < 1
19
- end
20
- end
21
- end
@@ -1,144 +0,0 @@
1
- require 'time'
2
- require 'reflect/field'
3
-
4
- module Reflect
5
- class Keyspace
6
- attr_reader :client
7
-
8
- attr_accessor :name
9
- attr_accessor :slug
10
- attr_accessor :statistics_key
11
- attr_accessor :description
12
- attr_accessor :fields
13
- attr_accessor :status
14
- attr_accessor :created_at
15
- attr_accessor :updated_at
16
-
17
- def initialize(client, attrs={})
18
- @client = client
19
-
20
- # If we have fields, we'll need to populate them individually.
21
- fields = attrs.delete("fields")
22
-
23
- attrs['updated_at'] = Time.parse(attrs['updated_at']) if attrs['updated_at']
24
- attrs['created_at'] = Time.parse(attrs['created_at']) if attrs['created_at']
25
-
26
- attrs.each do |k, v|
27
- self.send("#{k}=".to_s, v)
28
- end
29
-
30
- if fields
31
- self.fields = fields.map { |f| Field.new(f) }
32
- end
33
- end
34
-
35
- def keys(continuation=nil)
36
- resp = client.get(keys_path(slug, continuation))
37
-
38
- if resp.response.code != "200"
39
- raise Reflect::RequestError, Reflect._format_error_message(resp)
40
- end
41
-
42
- json = JSON.parse(resp.body)
43
-
44
- if json["keys"].nil? || json["keys"].empty?
45
- nil
46
- else
47
- KeyList.new(json["keys"], json["next"])
48
- end
49
- end
50
-
51
- # Appends records to a tablet. If the tablet doesn't exist it will be
52
- # created. records can be either a single object or an array of objects. A
53
- # single object represents a single row.
54
- #
55
- # @param String key the key to create
56
- # @param Array|Hash records the records to create
57
- #
58
- def append(key, records)
59
- resp = client.put(path(slug, key), records)
60
-
61
- if resp.response.code != "202"
62
- raise Reflect::RequestError, Reflect._format_error_message(resp)
63
- end
64
- end
65
-
66
- # Replaces the existing records in a tablet with a net set of records.
67
- # records can be either a single object or an array of objects. A single
68
- # object represents a single row.
69
- #
70
- # @param String key the key to create
71
- # @param Array|Hash records the records to create
72
- #
73
- def replace(key, records)
74
- resp = client.post(path(slug, key), records)
75
-
76
- if resp.response.code != "202"
77
- raise Reflect::RequestError, Reflect._format_error_message(resp)
78
- end
79
- end
80
-
81
- # Patches the existing records in a tablet with a net set of records. The
82
- # criteria parameter indicates which records to match existing records on.
83
- # In the Reflect API, if no existing records match the supplied records
84
- # then those records are dropped.
85
- #
86
- # @param String key the key to create
87
- # @param Array|Hash records the records to create
88
- # @param Array criteria an array of field names within a record to match
89
- #
90
- def patch(key, records, criteria)
91
- resp = client.patch(path(slug, key), records, "X-Criteria" => criteria.join(", "))
92
-
93
- if resp.response.code != "202"
94
- raise Reflect::RequestError, Reflect._format_error_message(resp)
95
- end
96
- end
97
-
98
- # Patch the existing records in a tablet with a new set of records and
99
- # insert any that aren't matched. The criteria parameter indicates which
100
- # records to match existing records on.
101
- #
102
- # @param String key the key to create
103
- # @param Array|Hash records the records to create
104
- # @param Array criteria an array of field names within a record to match
105
- #
106
- def upsert(key, records, criteria)
107
- headers = {
108
- "X-Criteria" => criteria.join(", "),
109
- "X-Insert-Missing" => true
110
- }
111
-
112
- resp = client.patch(path(slug, key), records, headers)
113
-
114
- if resp.response.code != "202"
115
- raise Reflect::RequestError, Reflect._format_error_message(resp)
116
- end
117
- end
118
-
119
-
120
- # Deletes a key within a keyspace.
121
- #
122
- # @param String key the key to delete
123
- #
124
- def delete(key)
125
- resp = client.delete(path(slug, key))
126
-
127
- if resp.response.code != "202"
128
- raise Reflect::RequestError, Reflect._format_error_message(resp)
129
- end
130
- end
131
-
132
- private
133
-
134
- def path(slug, key)
135
- "/v1/keyspaces/#{slug}/tablets/#{key}"
136
- end
137
-
138
- def keys_path(slug, continuation=nil)
139
- base = "/v1/keyspaces/#{slug}/keys"
140
- base += "?next=#{continuation}" if continuation
141
- base
142
- end
143
- end
144
- end