ig3client 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ig3client.rb +161 -0
- data/lib/lib/errors.rb +90 -0
- data/lib/lib/util.rb +89 -0
- metadata +63 -0
data/lib/ig3client.rb
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'lib/util.rb'
|
2
|
+
require 'lib/errors.rb'
|
3
|
+
require 'net/http'
|
4
|
+
require 'yaml'
|
5
|
+
require 'timeout'
|
6
|
+
require 'rubygems'
|
7
|
+
require 'facets'
|
8
|
+
|
9
|
+
# External Options:
|
10
|
+
#
|
11
|
+
# ENV doesnt accept true (needs String)
|
12
|
+
# ENV["IG3TOOL_CACHE"] = "yes"/"no"
|
13
|
+
#
|
14
|
+
|
15
|
+
|
16
|
+
class YAML::Object
|
17
|
+
def real_id
|
18
|
+
ivars["attributes"]["id"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](k)
|
22
|
+
k = k.to_s
|
23
|
+
if ivars["attributes"].include? k
|
24
|
+
return ivars["attributes"][k]
|
25
|
+
elsif ivars.include? k
|
26
|
+
return ivars[k]
|
27
|
+
else
|
28
|
+
keys = ivars['attributes'].keys.join(', ')
|
29
|
+
warn "No such attribute: #{k.to_s} (#{keys})"
|
30
|
+
return nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def method_missing(sym,*args)
|
35
|
+
self[sym]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
module Ig3tool
|
40
|
+
|
41
|
+
class Client
|
42
|
+
|
43
|
+
attr_accessor :token
|
44
|
+
|
45
|
+
def initialize(host="infogroep.be", port="2007", timeout=0)
|
46
|
+
@host = host
|
47
|
+
@port = port
|
48
|
+
@timeout = timeout # 0 = no timeout.
|
49
|
+
|
50
|
+
begin
|
51
|
+
@token = File.read(File.expand_path("~/.ig3token")).strip
|
52
|
+
rescue Exception => e
|
53
|
+
@token = nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def valid_token?
|
58
|
+
# XXX send no-op to server
|
59
|
+
false if @token.nil?
|
60
|
+
begin
|
61
|
+
self.validate
|
62
|
+
rescue
|
63
|
+
return false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def request!(h)
|
68
|
+
wannabe!(h)
|
69
|
+
end
|
70
|
+
|
71
|
+
def wannabe!(h)
|
72
|
+
username = h["username"]
|
73
|
+
passwd = h["password"]
|
74
|
+
# request token
|
75
|
+
# if ok => store in file
|
76
|
+
# else => throw exception
|
77
|
+
@token = method_missing("wannabe!", {"username" => username,"password" => passwd})
|
78
|
+
f = File.new(File.expand_path("~/.ig3token"), "wb")
|
79
|
+
f.write @token
|
80
|
+
f.close
|
81
|
+
#rescue Token => t
|
82
|
+
# raise PermissionDenied
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
def method_missing(msg, *args, &block)
|
87
|
+
msg = msg.to_s
|
88
|
+
|
89
|
+
|
90
|
+
if match = /^async_(.*)/.match(msg)
|
91
|
+
raise "Async method called, no block given!" unless block_given?
|
92
|
+
Thread.new do
|
93
|
+
ans = self.send(match[1], *args)
|
94
|
+
block.call(ans)
|
95
|
+
end
|
96
|
+
else
|
97
|
+
uri = "/"+msg.gsub('_','/').sub(/!$/,'')
|
98
|
+
if msg.ends_with? '!'
|
99
|
+
args = [Hash[*args]] if args.length % 2 == 0
|
100
|
+
uri += "//" + @token if @token
|
101
|
+
req = Net::HTTP::Post.new(uri)
|
102
|
+
req["Content-Type"] = "text/yaml"
|
103
|
+
req.body = args.first.to_yaml
|
104
|
+
else
|
105
|
+
args = args[0].to_a.flatten if args[0].is_a? Hash
|
106
|
+
args.unshift(@token) if @token
|
107
|
+
extra = args.join('/')
|
108
|
+
extra = '//'+extra unless extra.empty?
|
109
|
+
req = Net::HTTP::Get.new(uri+extra)
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
req["Accept"] = "text/yaml"
|
114
|
+
|
115
|
+
|
116
|
+
n = Net::HTTP.new(@host,@port)
|
117
|
+
Timeout::timeout(@timeout) do
|
118
|
+
n.request(req) do |res|
|
119
|
+
rez = YAML::load(res.read_body)
|
120
|
+
raise rez["type"].to_sym.to_const, rez["message"].to_s if (res.code.to_i > 200)
|
121
|
+
if block_given?
|
122
|
+
yield rez
|
123
|
+
else
|
124
|
+
return rez
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
if ENV["IG3TOOL_CACHE"] == "yes"
|
132
|
+
@@CACHE = {}
|
133
|
+
EXPIRY = 900 # 15 minuten
|
134
|
+
BIG_QUERIES = [ :person_debuggers, :person_honorarymembers,
|
135
|
+
:person_members, :person_nonmembers,
|
136
|
+
:person_everybody,
|
137
|
+
:product_categories, :product_all ]
|
138
|
+
|
139
|
+
BIG_QUERIES.each do |sym|
|
140
|
+
body = Proc.new do |*params|
|
141
|
+
if params.length > 0
|
142
|
+
method_missing(sym, *params)
|
143
|
+
else
|
144
|
+
entry = @@CACHE[sym]
|
145
|
+
time = Time.now
|
146
|
+
if entry.nil? or time > entry[0]
|
147
|
+
result = method_missing(sym)
|
148
|
+
@@CACHE[sym] = [time + EXPIRY, result]
|
149
|
+
result
|
150
|
+
else
|
151
|
+
entry[1]
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
define_method sym, body
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
data/lib/lib/errors.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
module Ig3tool
|
2
|
+
|
3
|
+
class IG3Error < Exception
|
4
|
+
end
|
5
|
+
|
6
|
+
class Token < IG3Error
|
7
|
+
end
|
8
|
+
|
9
|
+
class ProductNotFound < IG3Error
|
10
|
+
end
|
11
|
+
|
12
|
+
class PermissionDenied < IG3Error
|
13
|
+
end
|
14
|
+
|
15
|
+
class NeedDebugger < IG3Error
|
16
|
+
end
|
17
|
+
|
18
|
+
class NotADebugger < IG3Error
|
19
|
+
end
|
20
|
+
|
21
|
+
class NotAMember < IG3Error
|
22
|
+
end
|
23
|
+
|
24
|
+
class Needed < IG3Error
|
25
|
+
end
|
26
|
+
|
27
|
+
class NotFound < IG3Error
|
28
|
+
end
|
29
|
+
|
30
|
+
class WrongRequestType < IG3Error
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
# PRINTING
|
35
|
+
|
36
|
+
class PrintBackend < IG3Error
|
37
|
+
end
|
38
|
+
|
39
|
+
class NoPrintAccount < IG3Error
|
40
|
+
end
|
41
|
+
|
42
|
+
class NotEnoughCredit < IG3Error
|
43
|
+
end
|
44
|
+
|
45
|
+
class WrongPrintlogType < IG3Error
|
46
|
+
end
|
47
|
+
|
48
|
+
class SaveFailed < IG3Error
|
49
|
+
end
|
50
|
+
|
51
|
+
class AliasNotFound < IG3Error
|
52
|
+
end
|
53
|
+
|
54
|
+
class TransactionNotFound < IG3Error
|
55
|
+
end
|
56
|
+
|
57
|
+
class PrintUserNotFound < IG3Error
|
58
|
+
end
|
59
|
+
|
60
|
+
# INTERNE
|
61
|
+
|
62
|
+
class TransactionLogFailed < IG3Error
|
63
|
+
end
|
64
|
+
|
65
|
+
class NoPositiveAmount < IG3Error
|
66
|
+
end
|
67
|
+
|
68
|
+
class TransactionFailed < IG3Error
|
69
|
+
end
|
70
|
+
|
71
|
+
class SaldoNotZero < IG3Error
|
72
|
+
end
|
73
|
+
|
74
|
+
class Afgesloten < IG3Error
|
75
|
+
end
|
76
|
+
|
77
|
+
# BIB
|
78
|
+
|
79
|
+
class StillHaveLoans < IG3Error
|
80
|
+
end
|
81
|
+
|
82
|
+
class BibSectionNotFound < IG3Error
|
83
|
+
end
|
84
|
+
|
85
|
+
class InvalidISBN < IG3Error
|
86
|
+
end
|
87
|
+
|
88
|
+
class BookNotAvaible < IG3Error
|
89
|
+
end
|
90
|
+
end
|
data/lib/lib/util.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
module Gtk
|
2
|
+
class TextView
|
3
|
+
def text
|
4
|
+
buffer.text
|
5
|
+
end
|
6
|
+
|
7
|
+
def text=(str)
|
8
|
+
buffer.text = str
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class String
|
14
|
+
|
15
|
+
def starts_with?(str)
|
16
|
+
self.index( str ) == 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def ends_with?(str)
|
20
|
+
self.rindex( str ) == self.length - str.length
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_c
|
24
|
+
self.to_f.to_c
|
25
|
+
end
|
26
|
+
|
27
|
+
def from_c
|
28
|
+
self.to_f.from_c
|
29
|
+
end
|
30
|
+
|
31
|
+
def smaller(l=75)
|
32
|
+
if self.size > l
|
33
|
+
self[0..l] + "..."
|
34
|
+
else
|
35
|
+
self
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Numeric
|
41
|
+
def to_c
|
42
|
+
(self.to_f * 100).round.to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
def from_c
|
46
|
+
(self.to_f / 100)
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_b
|
50
|
+
return (not (self.zero?))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Hash
|
55
|
+
# File facets/hash/new.rb, line 44
|
56
|
+
def self.zipnew(keys,values) # or some better name
|
57
|
+
h = {}
|
58
|
+
keys.size.times{ |i| h[ keys[i] ] = values[i] }
|
59
|
+
h
|
60
|
+
end
|
61
|
+
# File facets/hash/keyize.rb, line 49
|
62
|
+
def normalize_keys!( &block )
|
63
|
+
keys.each{ |k|
|
64
|
+
nk = block[k]
|
65
|
+
self[nk]=delete(k) if nk
|
66
|
+
}
|
67
|
+
self
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Time
|
72
|
+
# bepaling van de week van het academiejaar
|
73
|
+
def week
|
74
|
+
t = start_werkjaar(Time.werkjaar)
|
75
|
+
return 1 + ((self - t) / (86400*7)).to_int
|
76
|
+
end
|
77
|
+
|
78
|
+
# we bepalen de start van het werkjaar (laatste ma van sept)
|
79
|
+
def self.start_werkjaar(jaar)
|
80
|
+
t = Time.mktime(jaar, 9, 30)
|
81
|
+
t = t - 86400 until t.wday == 1
|
82
|
+
t
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.werkjaar
|
86
|
+
t = Time.now()
|
87
|
+
t > start_werkjaar(t.year) ? t.year : t.year - 1
|
88
|
+
end
|
89
|
+
end
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ig3client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kevin Pinte
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-03-05 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: facets
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.2.1
|
23
|
+
version:
|
24
|
+
description:
|
25
|
+
email: igtool@infogroep.be
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
|
+
files:
|
33
|
+
- lib/ig3client.rb
|
34
|
+
- lib/lib/errors.rb
|
35
|
+
- lib/lib/util.rb
|
36
|
+
has_rdoc: false
|
37
|
+
homepage: http://infogroep.be
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
requirements: []
|
56
|
+
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 1.0.1
|
59
|
+
signing_key:
|
60
|
+
specification_version: 2
|
61
|
+
summary: base client library of ig3tool
|
62
|
+
test_files: []
|
63
|
+
|