heft 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/adapters/internet.rb CHANGED
@@ -2,8 +2,15 @@ require "t"
2
2
 
3
3
  module Adapters
4
4
  class Internet
5
+ require 'audible'; include Audible;
6
+
7
+ def initialize
8
+ @internet = T::Internet.new
9
+ relay @internet, :requesting
10
+ end
11
+
5
12
  def execute(request)
6
- T::Internet.new.execute request
13
+ @internet.execute request
7
14
  end
8
15
  end
9
16
  end
data/lib/heft.rb CHANGED
@@ -1,5 +1,5 @@
1
- require "heft/version"
1
+ dir = File.join(File.dirname(__FILE__))
2
2
 
3
- module Heft
4
-
5
- end
3
+ Dir.glob(File.join(dir, "heft", "**", "*.rb")).each {|f| require f}
4
+
5
+ module Heft; end
data/lib/heft/data.rb ADDED
@@ -0,0 +1,62 @@
1
+ module Heft
2
+ class Key
3
+ attr_reader :id, :type
4
+
5
+ def initialize(opts={})
6
+ @id = opts[:id] || fail("You must supply :id")
7
+ @type = opts[:type] || fail("You must supply :type")
8
+ end
9
+ end
10
+
11
+ class DataItem
12
+ attr_reader :key, :value
13
+
14
+ def initialize(opts={})
15
+ @key = opts[:key] || fail("You must supply :key")
16
+ @value = opts[:value] || fail("You must supply :value")
17
+ end
18
+ end
19
+
20
+ class Data # http://docs.hoi.io/data/overview/api/data-api
21
+ class << self
22
+ def save(item)
23
+ reply = hoist.post(
24
+ :uri => earl(item.key),
25
+ :body => item.value
26
+ )
27
+
28
+ fail "Failed to save item. #{reply.body}" if reply.code > 299
29
+ end
30
+
31
+ def get(key)
32
+ reply = hoist.get :uri => earl(key)
33
+
34
+ return nil if reply.code === 404
35
+
36
+ fail "Failed to fetch item with key <#{key}>. #{reply.body}" if reply.code > 299
37
+
38
+ JSON.parse reply.body
39
+ end
40
+
41
+ def delete(key)
42
+ reply = hoist.delete :uri => earl(key)
43
+
44
+ fail "Failed delete item with key <#{key}>. #{reply.body}" if reply.code > 299
45
+ end
46
+
47
+ private
48
+
49
+ def earl(key)
50
+ "https://data.hoi.io/#{URI.escape(key.type)}/#{URI.escape(key.id)}"
51
+ end
52
+
53
+ def hoist
54
+ Heft::Internal::HoistConnection.new :internet => internet, :api_key => ENV['APIKEY']
55
+ end
56
+
57
+ def internet
58
+ Adapters::Internet.new
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,35 @@
1
+ module Heft
2
+ module Internal
3
+ class HoistConnection
4
+ def initialize(opts={})
5
+ @internet = opts[:internet] || fail("You need to supply :internet")
6
+ @api_key = opts[:api_key] || fail("You need to supply :api_key")
7
+ end
8
+
9
+ [:get, :post, :delete].each do |m|
10
+ define_method m do |opts|
11
+ execute m, opts
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def execute(verb, opts={})
18
+ @internet.execute T::Request.new(
19
+ :headers => headers,
20
+ :uri => opts[:uri],
21
+ :verb => verb,
22
+ :body => opts[:body]
23
+ )
24
+ end
25
+
26
+ def headers
27
+ {
28
+ 'Authorization' => "HOIST #{@api_key}",
29
+ 'Content-Type' => 'application/json',
30
+ 'Accept' => 'application/json'
31
+ }
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/heft/users.rb ADDED
@@ -0,0 +1,44 @@
1
+ module Heft
2
+ class Users
3
+ require File.join '.', 'adapters', 'internet'
4
+
5
+ class << self
6
+ def add(opts={})
7
+ reply = add_core opts
8
+
9
+ fail "Failed => #{reply.body}" if reply.code > 299
10
+ end
11
+
12
+ def delete(email)
13
+ reply = hoist.delete :uri => "https://auth.hoi.io/user/#{URI.escape(email)}"
14
+
15
+ fail "Failed to delete user. #{reply}" if reply.code > 299
16
+ end
17
+
18
+ def contain?(email)
19
+ reply = add_core :email => email, :password => "******"
20
+
21
+ json = JSON.parse reply.body
22
+
23
+ error_message = json['message']
24
+
25
+ reply.code === 400 and error_message.match /already a user with that email address/
26
+ end
27
+
28
+ private
29
+
30
+ def hoist
31
+ Heft::Internal::HoistConnection.new :internet => internet, :api_key => ENV['APIKEY']
32
+ end
33
+
34
+ def internet; Adapters::Internet.new; end
35
+
36
+ def add_core(opts={})
37
+ hoist.post(
38
+ :uri => 'https://auth.hoi.io/user',
39
+ :body => opts
40
+ )
41
+ end
42
+ end
43
+ end
44
+ end
data/lib/heft/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Heft
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,39 @@
1
+ require 'helper'
2
+
3
+ describe "Hoistapps and data" do
4
+ it "can store an item" do
5
+ key = Heft::Key.new(:id => "chicken pie", :type => "recipe")
6
+
7
+ item = Heft::DataItem.new(
8
+ :key => key,
9
+ :value => {"a" => "value a"}.to_json
10
+ )
11
+
12
+ Heft::Data.save item
13
+
14
+ result = Heft::Data.get key
15
+
16
+ expect(result).to_not be_nil
17
+ expect(result["a"]).to eql "value a"
18
+ end
19
+
20
+ # Be sure to add permission on deletes: https://go.hoistapps.com/open-attempt/members/roles.
21
+ # Looks like we are connecting as anonymous user type.
22
+ it "can delete an item" do
23
+ key = Heft::Key.new(:id => "tacos", :type => "recipe")
24
+
25
+ item = Heft::DataItem.new(
26
+ :key => key,
27
+ :value => {}.to_json
28
+ )
29
+
30
+ Heft::Data.save item
31
+
32
+ Heft::Data.delete key
33
+
34
+ expect(Heft::Data.get key).to be_nil
35
+ end
36
+
37
+ it "data MUST be json otherwise you get error"
38
+ it "can update an item"
39
+ end
@@ -1,77 +1,35 @@
1
1
  require 'helper'
2
2
 
3
- module Heft
4
- class Users
5
- require File.join '.', 'adapters', 'internet'
6
-
7
- class << self
8
- def add(opts={})
9
- headers = {'Authorization' => "HOIST #{ENV['APIKEY']}"}
10
-
11
- reply = Adapters::Internet.new.execute T::Request.new(
12
- :headers => headers,
13
- :uri => 'https://auth.hoi.io/user',
14
- :body => opts,
15
- :verb => :post
16
- )
17
-
18
- fail "Failed => #{reply.body}" if reply.code > 299
19
- end
20
-
21
- def contain?(email)
22
- headers = {'Authorization' => "HOIST #{ENV['APIKEY']}"}
23
-
24
- reply = Adapters::Internet.new.execute T::Request.new(
25
- :headers => headers,
26
- :uri => 'https://auth.hoi.io/user',
27
- :body => {:email => email, :password => "******"},
28
- :verb => :post
29
- )
30
-
31
- json = JSON.parse reply.body
32
-
33
- error_message = json['message']
3
+ describe "Hoistapps and users" do
4
+ it "can be asked to add a new one" do # see: http://docs.hoi.io/authentication/overview/api/authentication-api
5
+ email = UniqueEmail.next
34
6
 
35
- reply.code === 400 and error_message.match /already a user with that email address/
36
- end
7
+ Heft::Users.add :email => email, :password => "xxx_not_a_password_xxx"
37
8
 
38
- private
9
+ expect(Heft::Users.contain? email).to be_true, "User was not found"
10
+ end
39
11
 
40
- def all
41
- headers = {'Authorization' => "HOIST #{ENV['APIKEY']}", 'Accept' => 'application/json'}
12
+ it "fails when user exists already with the same email" do
13
+ email = UniqueEmail.next
42
14
 
43
- reply = Adapters::Internet.new.execute T::Request.new(
44
- :headers => headers,
45
- :uri => 'https://auth.hoi.io/users',
46
- )
15
+ any_password = "******"
47
16
 
48
- fail "Failed => #{reply.body}" if reply.code > 299
17
+ Heft::Users.add :email => email, :password => any_password
49
18
 
50
- puts reply.body
51
- end
52
- end
19
+ expect{ Heft::Users.add :email => email, :password => any_password }.to raise_error /already a user with that email address/
53
20
  end
54
- end
21
+
22
+ it "can delete a user" do
23
+ email = UniqueEmail.next
55
24
 
56
- class UniqueEmail
57
- class << self
58
- def next
59
- require 'securerandom'
60
- "#{SecureRandom.uuid.to_s}@example.test.com"
61
- end
62
- end
63
- end
25
+ any_password = "******"
64
26
 
65
- describe "Hoistapps and users" do
66
- it "can be asked to add a new one" do # see: http://docs.hoi.io/authentication/overview/api/authentication-api
67
- email = UniqueEmail.next
27
+ Heft::Users.add :email => email, :password => any_password
68
28
 
69
- Heft::Users.add :email => email, :password => "xxx_not_a_password_xxx"
29
+ Heft::Users.delete email
70
30
 
71
- expect(Heft::Users.contain? email).to be_true, "User was not found"
31
+ expect{ Heft::Users.add :email => email, :password => any_password }.to_not raise_error
72
32
  end
73
-
74
- it "fails when user exists already with the same email"
75
- it "can be asked to delete a user"
33
+
76
34
  it "fails unless password is <= 6 characters long"
77
35
  end
data/spec/helper.rb CHANGED
@@ -1,2 +1,11 @@
1
1
  require 'rspec'
2
2
  require 'heft'
3
+
4
+ class UniqueEmail
5
+ class << self
6
+ def next
7
+ require 'securerandom'
8
+ "#{SecureRandom.uuid.to_s}@example.test.com"
9
+ end
10
+ end
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heft
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -58,7 +58,11 @@ files:
58
58
  - adapters/internet.rb
59
59
  - heft.gemspec
60
60
  - lib/heft.rb
61
+ - lib/heft/data.rb
62
+ - lib/heft/internal/hoist_connection.rb
63
+ - lib/heft/users.rb
61
64
  - lib/heft/version.rb
65
+ - spec/acceptance.tests/data/can_store_spec.rb
62
66
  - spec/acceptance.tests/users/the_basics_spec.rb
63
67
  - spec/helper.rb
64
68
  homepage: ''
@@ -76,7 +80,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
80
  version: '0'
77
81
  segments:
78
82
  - 0
79
- hash: 1012179731
83
+ hash: 34913681
80
84
  required_rubygems_version: !ruby/object:Gem::Requirement
81
85
  none: false
82
86
  requirements:
@@ -85,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
89
  version: '0'
86
90
  segments:
87
91
  - 0
88
- hash: 1012179731
92
+ hash: 34913681
89
93
  requirements: []
90
94
  rubyforge_project:
91
95
  rubygems_version: 1.8.23
@@ -93,5 +97,6 @@ signing_key:
93
97
  specification_version: 3
94
98
  summary: A Hoistapps connector
95
99
  test_files:
100
+ - spec/acceptance.tests/data/can_store_spec.rb
96
101
  - spec/acceptance.tests/users/the_basics_spec.rb
97
102
  - spec/helper.rb