runivedo 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 43460292ce7c5b583ebf0ddaeb46a1049efebbb1
4
+ data.tar.gz: 76101f17ccee144a1d8a9a6d453861d3c36e9fc8
5
+ SHA512:
6
+ metadata.gz: 3164087316cf788bce75733234a91ef251bff97fb8fa592ae0241905f4d972483a93e85590962d9e779b81e07ffbc09ca87c569d8d6c429705790976237bcfda
7
+ data.tar.gz: 4df3cc67fdade3ef41debb681becbf81ce8b129d60ae960e7dfbed4e5e2314f63291e86668690296a17eb0c7edb3800858e930328beea0833851e90639773b49
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ junit.xml
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012-2014 Lucas Clemente
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,13 @@
1
+ # Runivedo - Univedo Ruby Binding
2
+
3
+ ## Installation
4
+
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem 'runivedo'
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ TODO
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.pattern = "test/*_test.rb"
6
+ t.libs.push "test"
7
+ end
8
+
9
+ task default: :test
@@ -0,0 +1,4 @@
1
+ module Runivedo
2
+ class SqlError < RuntimeError; end
3
+ class ConnectionError < RuntimeError; end
4
+ end
@@ -0,0 +1,43 @@
1
+ require 'thread'
2
+
3
+ module Runivedo
4
+ class Future
5
+ def initialize
6
+ @mutex = Mutex.new
7
+ @cond = ConditionVariable.new
8
+ @success = nil
9
+ @value = nil
10
+ end
11
+
12
+ def get
13
+ @mutex.synchronize do
14
+ @cond.wait(@mutex) while @success.nil?
15
+ end
16
+ if @success
17
+ @value
18
+ else
19
+ raise @value
20
+ end
21
+ end
22
+
23
+ def fail(exception)
24
+ @mutex.synchronize do
25
+ @success = false
26
+ @value = exception
27
+ @cond.broadcast
28
+ end
29
+ end
30
+
31
+ def complete(value)
32
+ @mutex.synchronize do
33
+ @success = true
34
+ @value = value
35
+ @cond.broadcast
36
+ end
37
+ end
38
+
39
+ def is_complete?
40
+ !@success.nil?
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,119 @@
1
+ module Runivedo
2
+ class RemoteObject
3
+ OPERATION_CALL_ROM = 1
4
+ OPERATION_ANSWER_CALL = 2
5
+ OPERATION_NOTIFY = 3
6
+ OPERATION_DELETE = 4
7
+
8
+ module MethodMissing
9
+ def method_missing(name, *args, &block)
10
+ camelizedName = name.to_s.gsub(/_([a-z])/) { $1.capitalize }
11
+ if camelizedName.start_with?('set')
12
+ send_notification(camelizedName, *args)
13
+ else
14
+ call_rom(camelizedName, *args, &block)
15
+ end
16
+ end
17
+ end
18
+
19
+ def initialize(session, id)
20
+ @session = session
21
+ @open = true
22
+ @id = id
23
+ @call_id = 0
24
+ @calls = {}
25
+ @notifications = {}
26
+ @mutex = Mutex.new
27
+ end
28
+
29
+ def send_notification(name, *args)
30
+ @mutex.synchronize do
31
+ check_open
32
+ @session.send :send_message, [@id, OPERATION_NOTIFY, name.to_s, args]
33
+ end
34
+ end
35
+
36
+ def call_rom(name, *args)
37
+ call_result = nil
38
+ @mutex.synchronize do
39
+ check_open
40
+ call_result = Future.new
41
+ @calls[@call_id] = call_result
42
+ @session.send :send_message, [@id, OPERATION_CALL_ROM, @call_id, name, args]
43
+ @call_id += 1
44
+ end
45
+ result = call_result.get
46
+ if result.is_a?(RemoteObject) && block_given?
47
+ begin
48
+ yield result
49
+ ensure
50
+ result.close
51
+ end
52
+ else
53
+ result
54
+ end
55
+ end
56
+
57
+ def on(notification_name, &block)
58
+ @notifications[notification_name.to_s] = block
59
+ end
60
+
61
+ def closed?
62
+ !@open
63
+ end
64
+
65
+ def close
66
+ @session.send :delete_ro, @id
67
+ onclose(Runivedo::ConnectionError.new("remote object closed"))
68
+ @session.send :send_message, [@id, OPERATION_DELETE]
69
+ end
70
+
71
+ private
72
+
73
+ def check_open
74
+ raise Runivedo::ConnectionError.new("remote object closed") unless @open
75
+ end
76
+
77
+ def onclose(reason)
78
+ @mutex.synchronize do
79
+ return unless @open
80
+ @open = false
81
+ @calls.each_value do |c|
82
+ c.fail(reason)
83
+ end
84
+ end
85
+ end
86
+
87
+ def receive(data)
88
+ opcode = data.shift
89
+ case opcode
90
+ when OPERATION_ANSWER_CALL
91
+ call_id = data.shift
92
+ future = @calls[call_id]
93
+ raise Runivedo::ConnectionError.new("unknown call id #{call_id}") unless future
94
+ @calls.delete(call_id)
95
+ status = data.shift
96
+ case status
97
+ when 0
98
+ result = data.shift
99
+ future.complete(result)
100
+ when 2
101
+ error = data.shift
102
+ future.fail Runivedo::SqlError.new(error)
103
+ else
104
+ raise Runivedo::ConnectionError.new("unknown status #{status}")
105
+ end
106
+ when OPERATION_NOTIFY
107
+ name = data.shift
108
+ args = data.shift
109
+ if block = @notifications[name]
110
+ block.call(*args)
111
+ else
112
+ raise Runivedo::ConnectionError.new("unknown notification #{name}")
113
+ end
114
+ else
115
+ raise Runivedo::ConnectionError.new("received invalid opcode #{opcode}")
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,109 @@
1
+ require "rfc-ws-client"
2
+ require "uuidtools"
3
+ require "cbor"
4
+
5
+ # Record Id Tag
6
+ # https://github.com/lucas-clemente/cbor-specs/blob/master/db_id.md
7
+ CBOR.register_tag(38) {|raw| raw}
8
+
9
+ module Runivedo
10
+ @@ro_classes = {}
11
+
12
+ def self.register_ro_class(name, klass)
13
+ @@ro_classes[name] = klass
14
+ end
15
+
16
+ def self.ro_classes
17
+ @@ro_classes
18
+ end
19
+
20
+ class Session
21
+ attr_reader :error
22
+
23
+ def initialize(url, args = {})
24
+ @remote_objects = {}
25
+ @ws = RfcWebSocket::WebSocket.new(url)
26
+ Thread.new { handle_ws }
27
+ @urologin = RemoteObject.new(self, 0)
28
+ @remote_objects[0] = @urologin
29
+ @session_remote = @urologin.call_rom('getSession', args)
30
+ end
31
+
32
+ def ping(v)
33
+ @session_remote.ping(v)
34
+ end
35
+
36
+ def get_perspective(name, &block)
37
+ @session_remote.get_perspective name, &block
38
+ end
39
+
40
+ def apply_uts(uts)
41
+ @session_remote.apply_uts uts
42
+ end
43
+
44
+ def close
45
+ @ws.close
46
+ close_ros(Runivedo::ConnectionError.new("connection closed"))
47
+ end
48
+
49
+ def closed?
50
+ @ws.closed?
51
+ end
52
+
53
+ private
54
+
55
+ def handle_ws
56
+ loop do
57
+ msg, binary = @ws.receive
58
+ raise Runivedo::ConnectionError.new("connection closed") if msg.nil?
59
+ raise Runivedo::ConnectionError.new("received empty message") if msg.empty?
60
+
61
+ # Read message to an array
62
+ io = StringIO.new(msg)
63
+ data = []
64
+ session = self
65
+ data << CBOR.load(io, 27 => method(:receive_ro)) while !io.eof?
66
+
67
+ # Find remote object
68
+ ro_id = data.shift
69
+ ro = @remote_objects[ro_id]
70
+ if ro.nil?
71
+ # We cannot detect whether this is an unknown ro_id or a
72
+ # previously closed one, so we just ignore it.
73
+ next
74
+ else
75
+ ro.send :receive, data
76
+ end
77
+ end
78
+ rescue => e
79
+ @error = e
80
+ close_ros(e)
81
+ end
82
+
83
+ def close_ros(reason)
84
+ @remote_objects.each_value {|ro| ro.send :onclose, reason}
85
+ end
86
+
87
+ def send_message(data)
88
+ @ws.send_message(data.map{|d| CBOR.dump(d)}.join, binary: true)
89
+ end
90
+
91
+ def receive_ro(raw)
92
+ name, id = raw
93
+ if klass = Runivedo.ro_classes[name]
94
+ ro = klass.new(self, id)
95
+ else
96
+ ro = RemoteObject.new(self, id)
97
+ ro.extend RemoteObject::MethodMissing
98
+ ro
99
+ end
100
+ @remote_objects[id] = ro
101
+ ro
102
+ end
103
+
104
+ # Sent from RemoteObject.close
105
+ def delete_ro(id)
106
+ @remote_objects.delete(id)
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,72 @@
1
+ module Runivedo
2
+ class Statement < RemoteObject
3
+ Runivedo.register_ro_class('com.univedo.statement', self)
4
+ include Runivedo::RemoteObject::MethodMissing
5
+
6
+ def initialize(*args)
7
+ super(*args)
8
+ @column_names = Future.new
9
+ on('setColumnNames') {|cols| @column_names.complete(cols)}
10
+ end
11
+
12
+ def column_names
13
+ @column_names.get
14
+ end
15
+
16
+ def execute(binds = {}, &block)
17
+ call_rom("execute", binds, &block)
18
+ end
19
+ end
20
+
21
+ class Result < RemoteObject
22
+ Runivedo.register_ro_class('com.univedo.result', self)
23
+ include Enumerable
24
+
25
+ def initialize(*args)
26
+ super(*args)
27
+ @rows = Queue.new
28
+ @record_id = Future.new
29
+ @n_affected = Future.new
30
+
31
+ self.on('setError') do |msg|
32
+ err = RunivedoSqlError.new(msg)
33
+ @rows << err
34
+ @record_id.fail(err)
35
+ @n_affected.fail(err)
36
+ end
37
+
38
+ # SELECT
39
+ self.on('setComplete') { complete_futures }
40
+ self.on('setTuple') { |t| @rows << t }
41
+
42
+ # UPDATE, DELETE, LINK
43
+ self.on('setNAffectedRecords') { |n| complete_futures(n_affected: n) }
44
+
45
+ # INSERT
46
+ self.on('setId') { |id| complete_futures(record_id: id) }
47
+ end
48
+
49
+ def num_affected_rows
50
+ @n_affected.get
51
+ end
52
+
53
+ def last_inserted_id
54
+ @record_id.get
55
+ end
56
+
57
+ def each(&block)
58
+ while row = @rows.pop
59
+ raise row if row.is_a? Exception
60
+ block.call(row)
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def complete_futures(values = {})
67
+ @n_affected.complete(values[:n_affected]) unless @n_affected.is_complete?
68
+ @record_id.complete(values[:record_id]) unless @record_id.is_complete?
69
+ @rows << nil
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,3 @@
1
+ module Runivedo
2
+ VERSION = "0.1.0"
3
+ end
data/lib/runivedo.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "runivedo/version"
2
+ require "runivedo/error"
3
+ require "runivedo/future"
4
+ require "runivedo/remote_object"
5
+ require "runivedo/session"
6
+ require "runivedo/sql"
data/runivedo.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'runivedo/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "runivedo"
8
+ spec.version = Runivedo::VERSION
9
+ spec.authors = ["Lucas Clemente"]
10
+ spec.email = ["lucas@univedo.com"]
11
+ spec.summary = %q{Ruby binding for Univedo}
12
+ spec.homepage = "https://github.com/univedo/runivedo"
13
+ spec.license = 'MIT'
14
+
15
+ spec.files = `git ls-files`.split($/)
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.add_dependency "rfc-ws-client", '~> 1.2'
20
+ spec.add_dependency "cbor-simple", "~> 1.2.0"
21
+ spec.add_dependency "uuidtools", "~> 2.1"
22
+ spec.add_development_dependency 'minitest'
23
+ spec.add_development_dependency 'minitest-emoji'
24
+ spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rake"
26
+ end
@@ -0,0 +1,55 @@
1
+ require "test_helper"
2
+
3
+ class MockSession
4
+ attr_accessor :msg, :onmsg
5
+
6
+ def send_message(msg)
7
+ @msg = msg
8
+ @onmsg.call if @onmsg
9
+ end
10
+
11
+ def delete_ro(id); end
12
+ end
13
+
14
+ class RemoteObjectTest < MiniTest::Test
15
+ def test_sending_notifications
16
+ session = MockSession.new
17
+ ro = Runivedo::RemoteObject.new(session, 23)
18
+ ro.send_notification "foo", 1, "2", 3
19
+ assert_equal [23, 3, "foo", [1, "2", 3]], session.msg
20
+ end
21
+
22
+ def test_receiving_notifications
23
+ res = nil
24
+ session = MockSession.new
25
+ ro = Runivedo::RemoteObject.new(session, 23)
26
+ ro.on("foo") {|a, b, c| res = [a, b, c]}
27
+ ro.send :receive, [3, "foo", [1, "2", 3]]
28
+ assert_equal [1, "2", 3], res
29
+ end
30
+
31
+ def test_rom_calls
32
+ session = MockSession.new
33
+ ro = Runivedo::RemoteObject.new(session, 23)
34
+ session.onmsg = -> {ro.send :receive, [2, 0, 0, 42]}
35
+ assert_equal 42, ro.call_rom("foo", 1, "2", 3)
36
+ assert_equal [23, 1, 0, "foo", [1, "2", 3]], session.msg
37
+ end
38
+
39
+ def test_rom_errors
40
+ assert_raises Runivedo::SqlError do
41
+ session = MockSession.new
42
+ ro = Runivedo::RemoteObject.new(session, 23)
43
+ session.onmsg = -> {ro.send :receive, [2, 0, 2, "boom"]}
44
+ assert_equal 42, ro.call_rom("foo", 1, "2", 3)
45
+ assert_equal [23, 1, 0, "foo", [1, "2", 3]], session.msg
46
+ end
47
+ end
48
+
49
+ def test_closes
50
+ session = MockSession.new
51
+ ro = Runivedo::RemoteObject.new(session, 23)
52
+ ro.close
53
+ assert_equal [23, 4], session.msg
54
+ end
55
+ end
@@ -0,0 +1,43 @@
1
+ require "test_helper"
2
+
3
+ class SessionTest < MiniTest::Test
4
+ def setup
5
+ @session = Runivedo::Session.new TEST_URL, TEST_AUTH
6
+ end
7
+
8
+ def teardown
9
+ @session.close unless @session.closed?
10
+ end
11
+
12
+ def ping(v)
13
+ assert_equal v, @session.ping(v), "pings #{v.inspect}"
14
+ end
15
+
16
+ def test_connect
17
+ assert !@session.closed?
18
+ end
19
+
20
+ def test_pings_null
21
+ ping nil
22
+ ping true
23
+ ping false
24
+ ping 42
25
+ ping -42
26
+ ping 1.1
27
+ ping "foobar"
28
+ ping [1, 2]
29
+ ping Time.now
30
+ end
31
+
32
+ def test_close
33
+ @session.close
34
+ assert @session.closed?
35
+ end
36
+
37
+ def test_error_closed
38
+ @session.close
39
+ assert_raises Runivedo::ConnectionError do
40
+ @session.ping("foo")
41
+ end
42
+ end
43
+ end
data/test/sql_test.rb ADDED
@@ -0,0 +1,75 @@
1
+ require "test_helper"
2
+
3
+ class SqlTest < MiniTest::Test
4
+ def setup
5
+ @session = Runivedo::Session.new TEST_URL, TEST_AUTH
6
+ @perspective = @session.get_perspective "cefb4ed2-4ce3-4825-8550-b68a3c142f0a"
7
+ end
8
+
9
+ def teardown
10
+ @session.close
11
+ end
12
+
13
+ def test_connection
14
+ assert !@perspective.closed?
15
+ end
16
+
17
+ def test_empty_select
18
+ @perspective.query do |query|
19
+ query.prepare "select * from dummy where dummy_uuid = '1AF6B99E-5908-4516-A5FA-B22AFD27E003'" do |stmt|
20
+ stmt.execute do |result|
21
+ assert [], result.to_a
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ def test_column_names
28
+ @perspective.query do |query|
29
+ query.prepare "select dummy_id, dummy_int8 from dummy" do |stmt|
30
+ assert %w(dummy_id dummy_int8), stmt.column_names
31
+ end
32
+ end
33
+ end
34
+
35
+ def test_system_select
36
+ @session.get_perspective("6e5a3a08-9bb0-4d92-ad04-7c6fed3874fa") do |persp|
37
+ persp.query do |query|
38
+ query.prepare "select * from fields" do |stmt|
39
+ stmt.execute do |result|
40
+ assert result.to_a.count > 100
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def test_selects
48
+ @perspective.query do |query|
49
+ query.prepare "select * from fields_inclusive" do |stmt|
50
+ stmt.execute do |result|
51
+ assert result.to_a.count > 100
52
+ assert result.last_inserted_id.nil?
53
+ assert result.num_affected_rows.nil?
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ def test_inserts
60
+ id = nil
61
+ @perspective.query do |query|
62
+ query.prepare "insert into dummy (dummy_int8) values (?)" do |stmt|
63
+ stmt.execute(0 => 42) do |result|
64
+ id = result.last_inserted_id
65
+ end
66
+ end
67
+ assert !id.nil?
68
+ query.prepare "select id, dummy_int8 from dummy where id = ?" do |stmt|
69
+ stmt.execute(0 => id) do |result|
70
+ assert_equal [[id, 42]], result.to_a
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,8 @@
1
+ Thread.abort_on_exception = true
2
+
3
+ require "minitest/autorun"
4
+ require "minitest/emoji"
5
+ require "runivedo"
6
+
7
+ TEST_URL = "ws://vagrant/f8018f09-fb75-4d3d-8e11-44b2dc796130"
8
+ TEST_AUTH = {username: "marvin"}
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: runivedo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Lucas Clemente
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-06-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rfc-ws-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: cbor-simple
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: uuidtools
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest-emoji
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description:
112
+ email:
113
+ - lucas@univedo.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - Gemfile
120
+ - LICENSE.txt
121
+ - README.md
122
+ - Rakefile
123
+ - lib/runivedo.rb
124
+ - lib/runivedo/error.rb
125
+ - lib/runivedo/future.rb
126
+ - lib/runivedo/remote_object.rb
127
+ - lib/runivedo/session.rb
128
+ - lib/runivedo/sql.rb
129
+ - lib/runivedo/version.rb
130
+ - runivedo.gemspec
131
+ - test/remote_object_test.rb
132
+ - test/session_test.rb
133
+ - test/sql_test.rb
134
+ - test/test_helper.rb
135
+ homepage: https://github.com/univedo/runivedo
136
+ licenses:
137
+ - MIT
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.2.2
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: Ruby binding for Univedo
159
+ test_files:
160
+ - test/remote_object_test.rb
161
+ - test/session_test.rb
162
+ - test/sql_test.rb
163
+ - test/test_helper.rb