logical_model 0.2.9 → 0.2.10
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/Gemfile +2 -1
- data/Gemfile.lock +78 -83
- data/README.rdoc +51 -8
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/client.rb +4 -48
- data/lib/logical_model.rb +92 -11
- data/logical_model.gemspec +8 -7
- data/service.rb +9 -5
- data/spec/client_spec.rb +27 -78
- data/spec/service_spec.rb +16 -1
- metadata +45 -36
- data/db/test.sqlite3 +0 -0
- data/logs/development.log +0 -144
data/Gemfile
CHANGED
|
@@ -4,9 +4,10 @@ source "http://rubygems.org"
|
|
|
4
4
|
gem "activemodel"
|
|
5
5
|
gem "activesupport"
|
|
6
6
|
gem "typhoeus", "~> 0.2.4"
|
|
7
|
-
gem "kaminari"
|
|
7
|
+
gem "kaminari", '~> 0.13.0'
|
|
8
8
|
|
|
9
9
|
group :development, :test do
|
|
10
|
+
gem 'activerecord'
|
|
10
11
|
gem "shoulda"
|
|
11
12
|
gem "bundler", "~> 1.0.10"
|
|
12
13
|
gem "jeweler", "~> 1.6.4"
|
data/Gemfile.lock
CHANGED
|
@@ -1,123 +1,118 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: http://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
activemodel (= 3.0.7)
|
|
29
|
-
activesupport (= 3.0.7)
|
|
30
|
-
activesupport (3.0.7)
|
|
31
|
-
arel (2.0.10)
|
|
32
|
-
builder (2.1.2)
|
|
4
|
+
actionpack (3.1.3)
|
|
5
|
+
activemodel (= 3.1.3)
|
|
6
|
+
activesupport (= 3.1.3)
|
|
7
|
+
builder (~> 3.0.0)
|
|
8
|
+
erubis (~> 2.7.0)
|
|
9
|
+
i18n (~> 0.6)
|
|
10
|
+
rack (~> 1.3.5)
|
|
11
|
+
rack-cache (~> 1.1)
|
|
12
|
+
rack-mount (~> 0.8.2)
|
|
13
|
+
rack-test (~> 0.6.1)
|
|
14
|
+
sprockets (~> 2.0.3)
|
|
15
|
+
activemodel (3.1.3)
|
|
16
|
+
activesupport (= 3.1.3)
|
|
17
|
+
builder (~> 3.0.0)
|
|
18
|
+
i18n (~> 0.6)
|
|
19
|
+
activerecord (3.1.3)
|
|
20
|
+
activemodel (= 3.1.3)
|
|
21
|
+
activesupport (= 3.1.3)
|
|
22
|
+
arel (~> 2.2.1)
|
|
23
|
+
tzinfo (~> 0.3.29)
|
|
24
|
+
activesupport (3.1.3)
|
|
25
|
+
multi_json (~> 1.0)
|
|
26
|
+
arel (2.2.1)
|
|
27
|
+
builder (3.0.0)
|
|
33
28
|
diff-lcs (1.1.3)
|
|
34
|
-
erubis (2.
|
|
35
|
-
|
|
36
|
-
ffi (1.0.9)
|
|
29
|
+
erubis (2.7.0)
|
|
30
|
+
ffi (1.0.11)
|
|
37
31
|
git (1.2.5)
|
|
38
|
-
guard (0.
|
|
32
|
+
guard (0.10.0)
|
|
33
|
+
ffi (>= 0.5.0)
|
|
39
34
|
thor (~> 0.14.6)
|
|
40
|
-
guard-rspec (0.
|
|
41
|
-
guard (>= 0.
|
|
42
|
-
|
|
35
|
+
guard-rspec (0.6.0)
|
|
36
|
+
guard (>= 0.10.0)
|
|
37
|
+
hike (1.2.1)
|
|
38
|
+
i18n (0.6.0)
|
|
43
39
|
jeweler (1.6.4)
|
|
44
40
|
bundler (~> 1.0)
|
|
45
41
|
git (>= 1.2.5)
|
|
46
42
|
rake
|
|
47
|
-
json (1.
|
|
48
|
-
kaminari (0.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
rack (
|
|
59
|
-
rack-mount (0.6.14)
|
|
43
|
+
json (1.6.4)
|
|
44
|
+
kaminari (0.13.0)
|
|
45
|
+
actionpack (>= 3.0.0)
|
|
46
|
+
activesupport (>= 3.0.0)
|
|
47
|
+
railties (>= 3.0.0)
|
|
48
|
+
libnotify (0.7.1)
|
|
49
|
+
mime-types (1.17.2)
|
|
50
|
+
multi_json (1.0.4)
|
|
51
|
+
rack (1.3.6)
|
|
52
|
+
rack-cache (1.1)
|
|
53
|
+
rack (>= 0.4)
|
|
54
|
+
rack-mount (0.8.3)
|
|
60
55
|
rack (>= 1.0.0)
|
|
61
|
-
rack-
|
|
56
|
+
rack-ssl (1.3.2)
|
|
57
|
+
rack
|
|
58
|
+
rack-test (0.6.1)
|
|
62
59
|
rack (>= 1.0)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
activeresource (= 3.0.7)
|
|
68
|
-
activesupport (= 3.0.7)
|
|
69
|
-
bundler (~> 1.0)
|
|
70
|
-
railties (= 3.0.7)
|
|
71
|
-
railties (3.0.7)
|
|
72
|
-
actionpack (= 3.0.7)
|
|
73
|
-
activesupport (= 3.0.7)
|
|
60
|
+
railties (3.1.3)
|
|
61
|
+
actionpack (= 3.1.3)
|
|
62
|
+
activesupport (= 3.1.3)
|
|
63
|
+
rack-ssl (~> 1.3.2)
|
|
74
64
|
rake (>= 0.8.7)
|
|
75
|
-
|
|
76
|
-
|
|
65
|
+
rdoc (~> 3.4)
|
|
66
|
+
thor (~> 0.14.6)
|
|
67
|
+
rake (0.9.2.2)
|
|
77
68
|
rb-inotify (0.8.8)
|
|
78
69
|
ffi (>= 0.5.0)
|
|
79
|
-
rcov (0.9.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
rspec-
|
|
84
|
-
|
|
85
|
-
|
|
70
|
+
rcov (0.9.11)
|
|
71
|
+
rdoc (3.12)
|
|
72
|
+
json (~> 1.4)
|
|
73
|
+
rspec (2.8.0)
|
|
74
|
+
rspec-core (~> 2.8.0)
|
|
75
|
+
rspec-expectations (~> 2.8.0)
|
|
76
|
+
rspec-mocks (~> 2.8.0)
|
|
77
|
+
rspec-core (2.8.0)
|
|
78
|
+
rspec-expectations (2.8.0)
|
|
86
79
|
diff-lcs (~> 1.1.2)
|
|
87
|
-
rspec-mocks (2.
|
|
88
|
-
rspec-rails (2.
|
|
89
|
-
actionpack (
|
|
90
|
-
activesupport (
|
|
91
|
-
railties (
|
|
92
|
-
rspec (~> 2.
|
|
80
|
+
rspec-mocks (2.8.0)
|
|
81
|
+
rspec-rails (2.8.1)
|
|
82
|
+
actionpack (>= 3.0)
|
|
83
|
+
activesupport (>= 3.0)
|
|
84
|
+
railties (>= 3.0)
|
|
85
|
+
rspec (~> 2.8.0)
|
|
93
86
|
shoulda (2.11.3)
|
|
94
|
-
sinatra (1.2.
|
|
87
|
+
sinatra (1.2.8)
|
|
95
88
|
rack (~> 1.1)
|
|
96
89
|
tilt (>= 1.2.2, < 2.0)
|
|
97
|
-
|
|
90
|
+
sprockets (2.0.3)
|
|
91
|
+
hike (~> 1.2)
|
|
92
|
+
rack (~> 1.0)
|
|
93
|
+
tilt (~> 1.1, != 1.3.0)
|
|
94
|
+
sqlite3 (1.3.5)
|
|
98
95
|
sqlite3-ruby (1.3.3)
|
|
99
96
|
sqlite3 (>= 1.3.3)
|
|
100
97
|
thor (0.14.6)
|
|
101
98
|
tilt (1.3.3)
|
|
102
|
-
treetop (1.4.10)
|
|
103
|
-
polyglot
|
|
104
|
-
polyglot (>= 0.3.1)
|
|
105
99
|
typhoeus (0.2.4)
|
|
106
100
|
mime-types
|
|
107
101
|
mime-types
|
|
108
|
-
tzinfo (0.3.
|
|
102
|
+
tzinfo (0.3.31)
|
|
109
103
|
|
|
110
104
|
PLATFORMS
|
|
111
105
|
ruby
|
|
112
106
|
|
|
113
107
|
DEPENDENCIES
|
|
114
108
|
activemodel
|
|
109
|
+
activerecord
|
|
115
110
|
activesupport
|
|
116
111
|
bundler (~> 1.0.10)
|
|
117
112
|
guard-rspec
|
|
118
113
|
jeweler (~> 1.6.4)
|
|
119
114
|
json
|
|
120
|
-
kaminari
|
|
115
|
+
kaminari (~> 0.13.0)
|
|
121
116
|
libnotify
|
|
122
117
|
rb-inotify
|
|
123
118
|
rcov
|
data/README.rdoc
CHANGED
|
@@ -8,18 +8,62 @@ It was written following this tutorial: http://www.slideshare.net/ihower/service
|
|
|
8
8
|
|
|
9
9
|
LogicalModel makes some assumptions about the service you'll be consuming
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
* resource service is RESTfull
|
|
12
|
+
* INDEX response is
|
|
13
|
+
{
|
|
14
|
+
collection: [resources...],
|
|
15
|
+
total: total items
|
|
16
|
+
}
|
|
12
17
|
|
|
13
|
-
*
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
18
|
+
* SHOW response is
|
|
19
|
+
{
|
|
20
|
+
.... resource attributes ...
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
* CREATE response on success is
|
|
24
|
+
{
|
|
25
|
+
id: created_id
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
* CREATE response on failure is
|
|
29
|
+
{
|
|
30
|
+
message: 'error message',
|
|
31
|
+
error_codes: [],
|
|
32
|
+
errors: attribute_errors
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
* UPDATE response on success is
|
|
36
|
+
"OK"
|
|
37
|
+
|
|
38
|
+
* UPDATE response on failure is
|
|
39
|
+
{
|
|
40
|
+
message: 'error message',
|
|
41
|
+
error_codes: [],
|
|
42
|
+
errors: attribute_errors
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
* DESTROY response is
|
|
46
|
+
"ok"
|
|
17
47
|
|
|
18
48
|
== Usage
|
|
19
49
|
|
|
20
50
|
In your Gemfile:
|
|
21
51
|
|
|
22
|
-
gem "logical_model"
|
|
52
|
+
gem "logical_model"
|
|
53
|
+
|
|
54
|
+
== Testing
|
|
55
|
+
|
|
56
|
+
For runnings specs you must have the service running locally. Do like this:
|
|
57
|
+
|
|
58
|
+
ruby service.rb -p 3000 -e test
|
|
59
|
+
|
|
60
|
+
Also note that after a single run of the tests the server must be restarted to reset
|
|
61
|
+
the database. We could change this by deleting all users in the test setup.
|
|
62
|
+
|
|
63
|
+
To run spec:
|
|
64
|
+
|
|
65
|
+
bundle exec rspec spec/client_spec.rb
|
|
66
|
+
|
|
23
67
|
|
|
24
68
|
== Contributing to logical_model
|
|
25
69
|
|
|
@@ -33,11 +77,10 @@ gem "logical_model"
|
|
|
33
77
|
|
|
34
78
|
== Copyright
|
|
35
79
|
|
|
36
|
-
Copyright (c) 2011 Dwayne Macgowan. See LICENSE.txt for
|
|
80
|
+
Copyright (c) 2011,2012 Dwayne Macgowan. See LICENSE.txt for
|
|
37
81
|
further details.
|
|
38
82
|
|
|
39
83
|
=== TODO
|
|
40
84
|
|
|
41
|
-
* specs!
|
|
42
85
|
* put log in /log
|
|
43
86
|
* on create parse response and show errors, etc.
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.2.
|
|
1
|
+
0.2.10
|
data/client.rb
CHANGED
|
@@ -2,16 +2,16 @@ require 'rubygems'
|
|
|
2
2
|
require 'bundler/setup'
|
|
3
3
|
require 'typhoeus'
|
|
4
4
|
require 'json'
|
|
5
|
-
require 'lib/logical_model'
|
|
5
|
+
require './lib/logical_model'
|
|
6
6
|
|
|
7
7
|
class User < LogicalModel
|
|
8
8
|
#class << self; attr_accessor :base_uri end
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
self.hydra = Typhoeus::Hydra.new
|
|
11
11
|
self.use_ssl = false #(Rails.env=="production")
|
|
12
12
|
|
|
13
13
|
self.resource_path = "/api/v1/users"
|
|
14
|
-
self.attribute_keys = [:name, :email, :password, :bio]
|
|
14
|
+
self.attribute_keys = [:id, :name, :email, :password, :bio]
|
|
15
15
|
self.use_api_key = false
|
|
16
16
|
#self.api_key_name = "token"
|
|
17
17
|
#self.api_key = "8c330b5d70f86ebfa6497c901b299b79afc6d68c60df6df0bda0180d3777eb4a5528924ac96cf58a25e599b4110da3c4b690fa29263714ec6604b6cb2d943656"
|
|
@@ -21,48 +21,4 @@ class User < LogicalModel
|
|
|
21
21
|
TIMEOUT = 5500 # miliseconds
|
|
22
22
|
PER_PAGE = 9999
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
# response = Typhoeus::Request.get("#{base_uri}/api/v1/users/#{name}")
|
|
26
|
-
# if response.code == 200
|
|
27
|
-
# JSON.parse(response.body)["user"]
|
|
28
|
-
# elsif response.code == 404
|
|
29
|
-
# nil
|
|
30
|
-
# else
|
|
31
|
-
# raise response.body
|
|
32
|
-
# end
|
|
33
|
-
# end
|
|
34
|
-
|
|
35
|
-
# def self.create(attributes = {})
|
|
36
|
-
# response = Typhoeus::Request.post("#{base_uri}/api/v1/users", :body => attributes.to_json)
|
|
37
|
-
# if response.success?
|
|
38
|
-
# JSON.parse(response.body)["user"]
|
|
39
|
-
# else
|
|
40
|
-
# raise response.body
|
|
41
|
-
# end
|
|
42
|
-
# end
|
|
43
|
-
|
|
44
|
-
# def self.update(name, attributes)
|
|
45
|
-
# response = Typhoeus::Request.put("#{base_uri}/api/v1/users/#{name}", :body => attributes.to_json)
|
|
46
|
-
# if response.success?
|
|
47
|
-
# JSON.parse(response.body)["user"]
|
|
48
|
-
# else
|
|
49
|
-
# raise response.body
|
|
50
|
-
# end
|
|
51
|
-
# end
|
|
52
|
-
|
|
53
|
-
# def self.destroy(name)
|
|
54
|
-
# response = Typhoeus::Request.delete("#{base_uri}/api/v1/users/#{name}")
|
|
55
|
-
# response.success?
|
|
56
|
-
# end
|
|
57
|
-
|
|
58
|
-
# def self.login(name, password)
|
|
59
|
-
# response = Typhoeus::Request.post("#{base_uri}/api/v1/users/#{name}/sessions", :body => {:password => password}.to_json)
|
|
60
|
-
# if response.success?
|
|
61
|
-
# JSON.parse(response.body)["user"]
|
|
62
|
-
# elsif response.code == 400
|
|
63
|
-
# nil
|
|
64
|
-
# else
|
|
65
|
-
# raise response.body
|
|
66
|
-
# end
|
|
67
|
-
# end
|
|
68
|
-
end
|
|
24
|
+
end
|
data/lib/logical_model.rb
CHANGED
|
@@ -69,6 +69,18 @@ class LogicalModel
|
|
|
69
69
|
def log_path; @log_path ||= "log/logical_model.log"; end
|
|
70
70
|
def use_api_key; @use_api_key ||= false; end
|
|
71
71
|
|
|
72
|
+
def validates_associated(*associations)
|
|
73
|
+
associations.each do |association|
|
|
74
|
+
validates_each association do |record, attr, value|
|
|
75
|
+
unless value.collect{ |r| r.nil? || r.valid? }.all?
|
|
76
|
+
value.reject { |t| t.valid? }.each do |t|
|
|
77
|
+
record.errors.add("", "#{t.class.name} #{t.errors.full_messages.to_sentence}")
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
72
84
|
# host eg: "127.0.0.1:3010"
|
|
73
85
|
# resource_path eg: "/api/v1/people"
|
|
74
86
|
end
|
|
@@ -77,17 +89,12 @@ class LogicalModel
|
|
|
77
89
|
@json_root ||= self.class.to_s.underscore
|
|
78
90
|
end
|
|
79
91
|
|
|
80
|
-
|
|
81
92
|
def self.resource_uri(id=nil)
|
|
82
93
|
prefix = (use_ssl)? "https://" : "http://"
|
|
83
94
|
sufix = (id.nil?)? "" : "/#{id}"
|
|
84
95
|
"#{prefix}#{host}#{resource_path}#{sufix}"
|
|
85
96
|
end
|
|
86
97
|
|
|
87
|
-
def persisted?
|
|
88
|
-
false
|
|
89
|
-
end
|
|
90
|
-
|
|
91
98
|
def initialize(attributes={})
|
|
92
99
|
self.attributes = attributes
|
|
93
100
|
end
|
|
@@ -95,6 +102,61 @@ class LogicalModel
|
|
|
95
102
|
def self.has_many_keys=(keys)
|
|
96
103
|
@has_many_keys = keys
|
|
97
104
|
attr_accessor *keys
|
|
105
|
+
|
|
106
|
+
keys.each do |association|
|
|
107
|
+
|
|
108
|
+
# return empty array or @association variable for each association
|
|
109
|
+
define_method association do
|
|
110
|
+
if instance_variable_get("@#{association}").blank?
|
|
111
|
+
instance_variable_set("@#{association}", [])
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
instance_variable_get("@#{association}")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# this method loads the contact attributes recieved by logical model from the service
|
|
118
|
+
define_method "#{association}=" do |params|
|
|
119
|
+
collection = []
|
|
120
|
+
params.each do |attr_params|
|
|
121
|
+
if attr_params["_type"].present?
|
|
122
|
+
attr_class = attr_params.delete("_type").to_s.constantize
|
|
123
|
+
else
|
|
124
|
+
attr_class = association.to_s.camelize.constantize
|
|
125
|
+
end
|
|
126
|
+
collection << attr_class.new(attr_params)
|
|
127
|
+
end
|
|
128
|
+
instance_variable_set("@#{association}", collection)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
define_method "new_#{association.to_s.singularize}" do |attr_params|
|
|
132
|
+
if attr_params["_type"].present?
|
|
133
|
+
clazz = attr_params.delete(:_type).constantize
|
|
134
|
+
else
|
|
135
|
+
clazz = association.to_s.singularize.camelize.constantize
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
return unless clazz
|
|
139
|
+
|
|
140
|
+
temp_object = clazz.new(attr_params.merge({"#{self.json_root}_id" => self.id}))
|
|
141
|
+
eval(association.to_s) << temp_object
|
|
142
|
+
temp_object
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# this method loads the contact attributes from the html form (using nested resources conventions)
|
|
146
|
+
define_method "#{association}_attributes=" do |key_attributes|
|
|
147
|
+
array = []
|
|
148
|
+
key_attributes.each do |attr_params|
|
|
149
|
+
attr_params.to_hash.symbolize_keys!
|
|
150
|
+
if attr_params["_type"].present?
|
|
151
|
+
attr_class = attr_params.delete("_type").to_s.constantize
|
|
152
|
+
else
|
|
153
|
+
attr_class = association.to_s.singularize.camelize.constantize
|
|
154
|
+
end
|
|
155
|
+
array << attr_class.new(attr_params)
|
|
156
|
+
end
|
|
157
|
+
instance_variable_set("@#{association}", array)
|
|
158
|
+
end
|
|
159
|
+
end
|
|
98
160
|
end
|
|
99
161
|
|
|
100
162
|
def self.has_many_keys
|
|
@@ -178,7 +240,7 @@ class LogicalModel
|
|
|
178
240
|
# This pagination won't block excecution waiting for result, pagination will be enqueued in Objectr#hydra.
|
|
179
241
|
#
|
|
180
242
|
# Parameters:
|
|
181
|
-
#
|
|
243
|
+
# @param options [Hash].
|
|
182
244
|
# Valid options are:
|
|
183
245
|
# * :page - indicated what page to return. Defaults to 1.
|
|
184
246
|
# * :per_page - indicates how many records to be returned per page. Defauls to 20
|
|
@@ -187,8 +249,8 @@ class LogicalModel
|
|
|
187
249
|
# Usage:
|
|
188
250
|
# Person.async_paginate(:page => params[:page]){|i| result = i}
|
|
189
251
|
def self.async_paginate(options={})
|
|
190
|
-
options[:page]
|
|
191
|
-
options[:per_page]
|
|
252
|
+
page = options[:page] || 1
|
|
253
|
+
per_page = options[:per_page] || 20
|
|
192
254
|
|
|
193
255
|
options = self.merge_key(options)
|
|
194
256
|
|
|
@@ -200,7 +262,14 @@ class LogicalModel
|
|
|
200
262
|
result_set = self.from_json(response.body)
|
|
201
263
|
|
|
202
264
|
# this paginate is will_paginate's Array pagination
|
|
203
|
-
collection = Kaminari.paginate_array(
|
|
265
|
+
collection = Kaminari.paginate_array(
|
|
266
|
+
result_set[:collection],
|
|
267
|
+
{
|
|
268
|
+
:total_count=>result_set[:total],
|
|
269
|
+
:limit => per_page,
|
|
270
|
+
:offset => per_page * ([page, 1].max - 1)
|
|
271
|
+
}
|
|
272
|
+
)
|
|
204
273
|
|
|
205
274
|
yield collection
|
|
206
275
|
else
|
|
@@ -303,7 +372,7 @@ class LogicalModel
|
|
|
303
372
|
end
|
|
304
373
|
|
|
305
374
|
# Updates Objects attributes, this will only send attributes passed as arguments
|
|
306
|
-
#
|
|
375
|
+
#
|
|
307
376
|
#
|
|
308
377
|
# Returns false if Object#valid? is false.
|
|
309
378
|
# Returns updated object if successfull.
|
|
@@ -348,7 +417,7 @@ class LogicalModel
|
|
|
348
417
|
end
|
|
349
418
|
|
|
350
419
|
# Saves Objects attributes
|
|
351
|
-
#
|
|
420
|
+
#
|
|
352
421
|
#
|
|
353
422
|
# Returns false if Object#valid? is false.
|
|
354
423
|
# Returns updated object if successfull.
|
|
@@ -422,4 +491,16 @@ class LogicalModel
|
|
|
422
491
|
self.class.delete(self.id,params)
|
|
423
492
|
end
|
|
424
493
|
|
|
494
|
+
def persisted?
|
|
495
|
+
false
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
# Returns true if a record has not been persisted yet.
|
|
499
|
+
#
|
|
500
|
+
# Usage:
|
|
501
|
+
# @person.new_record?
|
|
502
|
+
def new_record?
|
|
503
|
+
!self.persisted?
|
|
504
|
+
end
|
|
505
|
+
|
|
425
506
|
end
|
data/logical_model.gemspec
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
|
|
6
6
|
Gem::Specification.new do |s|
|
|
7
7
|
s.name = "logical_model"
|
|
8
|
-
s.version = "0.2.
|
|
8
|
+
s.version = "0.2.10"
|
|
9
9
|
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
11
11
|
s.authors = ["Dwayne Macgowan"]
|
|
12
|
-
s.date = "
|
|
12
|
+
s.date = "2012-01-09"
|
|
13
13
|
s.description = "LogicalModel allows to use a resource as a model. It is based on web presentation http://www.slideshare.net/ihower/serviceoriented-design-and-implement-with-rails3"
|
|
14
14
|
s.email = "dwaynemac@gmail.com"
|
|
15
15
|
s.extra_rdoc_files = [
|
|
@@ -31,10 +31,8 @@ Gem::Specification.new do |s|
|
|
|
31
31
|
"config/database.yml",
|
|
32
32
|
"db/development.sqlite3",
|
|
33
33
|
"db/migrate/001_create_users.rb",
|
|
34
|
-
"db/test.sqlite3",
|
|
35
34
|
"lib/logical_model.rb",
|
|
36
35
|
"logical_model.gemspec",
|
|
37
|
-
"logs/development.log",
|
|
38
36
|
"models/user.rb",
|
|
39
37
|
"service.rb",
|
|
40
38
|
"spec/client_spec.rb",
|
|
@@ -56,7 +54,8 @@ Gem::Specification.new do |s|
|
|
|
56
54
|
s.add_runtime_dependency(%q<activemodel>, [">= 0"])
|
|
57
55
|
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
|
58
56
|
s.add_runtime_dependency(%q<typhoeus>, ["~> 0.2.4"])
|
|
59
|
-
s.add_runtime_dependency(%q<kaminari>, ["
|
|
57
|
+
s.add_runtime_dependency(%q<kaminari>, ["~> 0.13.0"])
|
|
58
|
+
s.add_development_dependency(%q<activerecord>, [">= 0"])
|
|
60
59
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
|
61
60
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.10"])
|
|
62
61
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
|
@@ -72,7 +71,8 @@ Gem::Specification.new do |s|
|
|
|
72
71
|
s.add_dependency(%q<activemodel>, [">= 0"])
|
|
73
72
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
|
74
73
|
s.add_dependency(%q<typhoeus>, ["~> 0.2.4"])
|
|
75
|
-
s.add_dependency(%q<kaminari>, ["
|
|
74
|
+
s.add_dependency(%q<kaminari>, ["~> 0.13.0"])
|
|
75
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
|
76
76
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
|
77
77
|
s.add_dependency(%q<bundler>, ["~> 1.0.10"])
|
|
78
78
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
|
@@ -89,7 +89,8 @@ Gem::Specification.new do |s|
|
|
|
89
89
|
s.add_dependency(%q<activemodel>, [">= 0"])
|
|
90
90
|
s.add_dependency(%q<activesupport>, [">= 0"])
|
|
91
91
|
s.add_dependency(%q<typhoeus>, ["~> 0.2.4"])
|
|
92
|
-
s.add_dependency(%q<kaminari>, ["
|
|
92
|
+
s.add_dependency(%q<kaminari>, ["~> 0.13.0"])
|
|
93
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
|
93
94
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
|
94
95
|
s.add_dependency(%q<bundler>, ["~> 1.0.10"])
|
|
95
96
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
data/service.rb
CHANGED
|
@@ -2,7 +2,7 @@ require 'rubygems'
|
|
|
2
2
|
require 'bundler/setup'
|
|
3
3
|
require 'active_record'
|
|
4
4
|
require 'sinatra'
|
|
5
|
-
require 'models/user'
|
|
5
|
+
require './models/user'
|
|
6
6
|
|
|
7
7
|
# setting up the environment
|
|
8
8
|
env_index = ARGV.index("-e")
|
|
@@ -17,12 +17,16 @@ if env == "test"
|
|
|
17
17
|
User.create(:name => "paul", :email => "paul@pauldix.net", :bio => "rubyist")
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
20
|
# Simple RESTfull Service
|
|
23
21
|
# for LogicalModel Testing
|
|
24
22
|
|
|
23
|
+
# index
|
|
24
|
+
# Responds { collection, total }
|
|
25
|
+
get 'api/v1/users' do
|
|
26
|
+
users = User.all
|
|
25
27
|
|
|
28
|
+
{ collection: users, total: users.count}.to_json
|
|
29
|
+
end
|
|
26
30
|
|
|
27
31
|
# HTTP entry points
|
|
28
32
|
# get a user by name
|
|
@@ -40,7 +44,7 @@ post '/api/v1/users' do
|
|
|
40
44
|
begin
|
|
41
45
|
user = User.new(params[:user])
|
|
42
46
|
if user.save
|
|
43
|
-
user.to_json
|
|
47
|
+
[201, {id: user.id}.to_json]
|
|
44
48
|
else
|
|
45
49
|
error 400, {:errors => user.errors}.to_json
|
|
46
50
|
end
|
|
@@ -76,4 +80,4 @@ delete '/api/v1/users/:name' do
|
|
|
76
80
|
else
|
|
77
81
|
error 404, {:error => "user not found"}.to_json
|
|
78
82
|
end
|
|
79
|
-
end
|
|
83
|
+
end
|
data/spec/client_spec.rb
CHANGED
|
@@ -5,33 +5,7 @@ require File.dirname(__FILE__) + '/../client'
|
|
|
5
5
|
|
|
6
6
|
# Also note that after a single run of the tests the server must be restarted to reset
|
|
7
7
|
# the database. We could change this by deleting all users in the test setup.
|
|
8
|
-
|
|
9
|
-
# TODO testing in these specs should be focus on LogicalModel behaviour.
|
|
10
8
|
describe "LogicalModel User client" do
|
|
11
|
-
before(:each) do
|
|
12
|
-
# User.destroy_all
|
|
13
|
-
# User.base_uri = "http://localhost:3000"
|
|
14
|
-
|
|
15
|
-
# @user = User.find_by_name(:name => "paul")
|
|
16
|
-
# User.delete(@user.id)
|
|
17
|
-
# User.destroy("trotter")
|
|
18
|
-
|
|
19
|
-
# @user = User.new({:name => "bryan",
|
|
20
|
-
# :email => "bryan@spamtown.usa",
|
|
21
|
-
# :password => "strongpass",
|
|
22
|
-
# :bio => "rubyist"})
|
|
23
|
-
# @user.create
|
|
24
|
-
# User.create(
|
|
25
|
-
# :name => "paul",
|
|
26
|
-
# :email => "paul@pauldix.net",
|
|
27
|
-
# :password => "strongpass",
|
|
28
|
-
# :bio => "rubyist")
|
|
29
|
-
# User.create(
|
|
30
|
-
# :name => "bryan",
|
|
31
|
-
# :email => "bryan@spamtown.usa",
|
|
32
|
-
# :password => "strongpass",
|
|
33
|
-
# :bio => "rubyist")
|
|
34
|
-
end
|
|
35
9
|
|
|
36
10
|
describe "#create" do
|
|
37
11
|
context "with valid attributes" do
|
|
@@ -55,27 +29,33 @@ describe "LogicalModel User client" do
|
|
|
55
29
|
end
|
|
56
30
|
end
|
|
57
31
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
#
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
#
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
32
|
+
describe "#paginate" do
|
|
33
|
+
before do
|
|
34
|
+
# --> Mock service
|
|
35
|
+
req = Typhoeus::Request.any_instance
|
|
36
|
+
response = mock(
|
|
37
|
+
code: 200,
|
|
38
|
+
body: {
|
|
39
|
+
collection: [{name:'a',email:'a@m'},
|
|
40
|
+
{name:'b',email:'b@m'},
|
|
41
|
+
{name:'c',email:'c@m'}],
|
|
42
|
+
total: 6
|
|
43
|
+
}.to_json,
|
|
44
|
+
request: mock(url:"mockedurl"),
|
|
45
|
+
time: 1234
|
|
46
|
+
)
|
|
47
|
+
req.stub(:on_complete).and_yield(response)
|
|
48
|
+
# <-- service mocked
|
|
49
|
+
|
|
50
|
+
@users = User.paginate(page:1, per_page:1)
|
|
51
|
+
end
|
|
52
|
+
it "should return a Kaminari::PaginatableArray" do
|
|
53
|
+
@users.should be_a(Kaminari::PaginatableArray)
|
|
54
|
+
end
|
|
55
|
+
it "should set total_count" do
|
|
56
|
+
@users.total_count.should == 6
|
|
57
|
+
end
|
|
58
|
+
end
|
|
79
59
|
|
|
80
60
|
describe "#https" do
|
|
81
61
|
context "when use_ssl is tue" do
|
|
@@ -96,35 +76,4 @@ describe "LogicalModel User client" do
|
|
|
96
76
|
end
|
|
97
77
|
end
|
|
98
78
|
end
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
# it "should create a user" do
|
|
103
|
-
# user = User.create({
|
|
104
|
-
# :name => "trotter",
|
|
105
|
-
# :email => "trotter@spamtown.usa",
|
|
106
|
-
# :password => "whatev"})
|
|
107
|
-
# User.find_by_name("trotter")["email"].should == "trotter@spamtown.usa"
|
|
108
|
-
# end
|
|
109
|
-
|
|
110
|
-
# it "should update a user" do
|
|
111
|
-
# user = User.update("paul", :bio => "rubyist and author")
|
|
112
|
-
# user["name"].should == "paul"
|
|
113
|
-
# user["bio"].should == "rubyist and author"
|
|
114
|
-
# User.find_by_name("paul")["bio"] == "rubyist and author"
|
|
115
|
-
# end
|
|
116
|
-
|
|
117
|
-
# it "should destroy a user" do
|
|
118
|
-
# User.destroy("bryan").should == true
|
|
119
|
-
# User.find_by_name("bryan").should be_nil
|
|
120
|
-
# end
|
|
121
|
-
|
|
122
|
-
# it "should verify login credentials" do
|
|
123
|
-
# user = User.login("paul", "strongpass")
|
|
124
|
-
# user["name"].should == "paul"
|
|
125
|
-
# end
|
|
126
|
-
|
|
127
|
-
# it "should return nil with invalid credentials" do
|
|
128
|
-
# User.login("paul", "wrongpassword").should be_nil
|
|
129
|
-
# end
|
|
130
79
|
end
|
data/spec/service_spec.rb
CHANGED
|
@@ -22,7 +22,22 @@ describe "v1 service: " do
|
|
|
22
22
|
before(:each) do
|
|
23
23
|
User.delete_all
|
|
24
24
|
end
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
describe "get /api/v1/users" do
|
|
27
|
+
before do
|
|
28
|
+
User.create(name: "dwayne", email: "dwaynemac@gmail.com", password: "asdf", bio: "test")
|
|
29
|
+
User.create(name: "2dwayne", email: "dw2aynemac@gmail.com", password: "a2sdf", bio: "te2st")
|
|
30
|
+
get '/api/v1/users'
|
|
31
|
+
end
|
|
32
|
+
it { should respond_with :success }
|
|
33
|
+
it "should send collection" do
|
|
34
|
+
ActiveSupport::JSON.decode(last_response.body)['collection'].should_not be_nil
|
|
35
|
+
end
|
|
36
|
+
it "should send total items number" do
|
|
37
|
+
AcriveSupport::JSON.decode(last_response.body)['total'].should == 2
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
26
41
|
describe "RESTfull GET (on /api/v1/users/:id)" do
|
|
27
42
|
context "for existing user" do
|
|
28
43
|
before(:each) do
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: logical_model
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.10
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,11 +9,11 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2012-01-09 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activemodel
|
|
16
|
-
requirement: &
|
|
16
|
+
requirement: &78627270 !ruby/object:Gem::Requirement
|
|
17
17
|
none: false
|
|
18
18
|
requirements:
|
|
19
19
|
- - ! '>='
|
|
@@ -21,10 +21,10 @@ dependencies:
|
|
|
21
21
|
version: '0'
|
|
22
22
|
type: :runtime
|
|
23
23
|
prerelease: false
|
|
24
|
-
version_requirements: *
|
|
24
|
+
version_requirements: *78627270
|
|
25
25
|
- !ruby/object:Gem::Dependency
|
|
26
26
|
name: activesupport
|
|
27
|
-
requirement: &
|
|
27
|
+
requirement: &78626410 !ruby/object:Gem::Requirement
|
|
28
28
|
none: false
|
|
29
29
|
requirements:
|
|
30
30
|
- - ! '>='
|
|
@@ -32,10 +32,10 @@ dependencies:
|
|
|
32
32
|
version: '0'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
|
-
version_requirements: *
|
|
35
|
+
version_requirements: *78626410
|
|
36
36
|
- !ruby/object:Gem::Dependency
|
|
37
37
|
name: typhoeus
|
|
38
|
-
requirement: &
|
|
38
|
+
requirement: &78624510 !ruby/object:Gem::Requirement
|
|
39
39
|
none: false
|
|
40
40
|
requirements:
|
|
41
41
|
- - ~>
|
|
@@ -43,21 +43,32 @@ dependencies:
|
|
|
43
43
|
version: 0.2.4
|
|
44
44
|
type: :runtime
|
|
45
45
|
prerelease: false
|
|
46
|
-
version_requirements: *
|
|
46
|
+
version_requirements: *78624510
|
|
47
47
|
- !ruby/object:Gem::Dependency
|
|
48
48
|
name: kaminari
|
|
49
|
-
requirement: &
|
|
49
|
+
requirement: &78623980 !ruby/object:Gem::Requirement
|
|
50
|
+
none: false
|
|
51
|
+
requirements:
|
|
52
|
+
- - ~>
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 0.13.0
|
|
55
|
+
type: :runtime
|
|
56
|
+
prerelease: false
|
|
57
|
+
version_requirements: *78623980
|
|
58
|
+
- !ruby/object:Gem::Dependency
|
|
59
|
+
name: activerecord
|
|
60
|
+
requirement: &78623670 !ruby/object:Gem::Requirement
|
|
50
61
|
none: false
|
|
51
62
|
requirements:
|
|
52
63
|
- - ! '>='
|
|
53
64
|
- !ruby/object:Gem::Version
|
|
54
65
|
version: '0'
|
|
55
|
-
type: :
|
|
66
|
+
type: :development
|
|
56
67
|
prerelease: false
|
|
57
|
-
version_requirements: *
|
|
68
|
+
version_requirements: *78623670
|
|
58
69
|
- !ruby/object:Gem::Dependency
|
|
59
70
|
name: shoulda
|
|
60
|
-
requirement: &
|
|
71
|
+
requirement: &78623310 !ruby/object:Gem::Requirement
|
|
61
72
|
none: false
|
|
62
73
|
requirements:
|
|
63
74
|
- - ! '>='
|
|
@@ -65,10 +76,10 @@ dependencies:
|
|
|
65
76
|
version: '0'
|
|
66
77
|
type: :development
|
|
67
78
|
prerelease: false
|
|
68
|
-
version_requirements: *
|
|
79
|
+
version_requirements: *78623310
|
|
69
80
|
- !ruby/object:Gem::Dependency
|
|
70
81
|
name: bundler
|
|
71
|
-
requirement: &
|
|
82
|
+
requirement: &78622890 !ruby/object:Gem::Requirement
|
|
72
83
|
none: false
|
|
73
84
|
requirements:
|
|
74
85
|
- - ~>
|
|
@@ -76,10 +87,10 @@ dependencies:
|
|
|
76
87
|
version: 1.0.10
|
|
77
88
|
type: :development
|
|
78
89
|
prerelease: false
|
|
79
|
-
version_requirements: *
|
|
90
|
+
version_requirements: *78622890
|
|
80
91
|
- !ruby/object:Gem::Dependency
|
|
81
92
|
name: jeweler
|
|
82
|
-
requirement: &
|
|
93
|
+
requirement: &78622410 !ruby/object:Gem::Requirement
|
|
83
94
|
none: false
|
|
84
95
|
requirements:
|
|
85
96
|
- - ~>
|
|
@@ -87,10 +98,10 @@ dependencies:
|
|
|
87
98
|
version: 1.6.4
|
|
88
99
|
type: :development
|
|
89
100
|
prerelease: false
|
|
90
|
-
version_requirements: *
|
|
101
|
+
version_requirements: *78622410
|
|
91
102
|
- !ruby/object:Gem::Dependency
|
|
92
103
|
name: rcov
|
|
93
|
-
requirement: &
|
|
104
|
+
requirement: &78621770 !ruby/object:Gem::Requirement
|
|
94
105
|
none: false
|
|
95
106
|
requirements:
|
|
96
107
|
- - ! '>='
|
|
@@ -98,10 +109,10 @@ dependencies:
|
|
|
98
109
|
version: '0'
|
|
99
110
|
type: :development
|
|
100
111
|
prerelease: false
|
|
101
|
-
version_requirements: *
|
|
112
|
+
version_requirements: *78621770
|
|
102
113
|
- !ruby/object:Gem::Dependency
|
|
103
114
|
name: sqlite3-ruby
|
|
104
|
-
requirement: &
|
|
115
|
+
requirement: &78621440 !ruby/object:Gem::Requirement
|
|
105
116
|
none: false
|
|
106
117
|
requirements:
|
|
107
118
|
- - ! '>='
|
|
@@ -109,10 +120,10 @@ dependencies:
|
|
|
109
120
|
version: '0'
|
|
110
121
|
type: :development
|
|
111
122
|
prerelease: false
|
|
112
|
-
version_requirements: *
|
|
123
|
+
version_requirements: *78621440
|
|
113
124
|
- !ruby/object:Gem::Dependency
|
|
114
125
|
name: sinatra
|
|
115
|
-
requirement: &
|
|
126
|
+
requirement: &78621020 !ruby/object:Gem::Requirement
|
|
116
127
|
none: false
|
|
117
128
|
requirements:
|
|
118
129
|
- - ~>
|
|
@@ -120,10 +131,10 @@ dependencies:
|
|
|
120
131
|
version: 1.2.6
|
|
121
132
|
type: :development
|
|
122
133
|
prerelease: false
|
|
123
|
-
version_requirements: *
|
|
134
|
+
version_requirements: *78621020
|
|
124
135
|
- !ruby/object:Gem::Dependency
|
|
125
136
|
name: json
|
|
126
|
-
requirement: &
|
|
137
|
+
requirement: &78599190 !ruby/object:Gem::Requirement
|
|
127
138
|
none: false
|
|
128
139
|
requirements:
|
|
129
140
|
- - ! '>='
|
|
@@ -131,10 +142,10 @@ dependencies:
|
|
|
131
142
|
version: '0'
|
|
132
143
|
type: :development
|
|
133
144
|
prerelease: false
|
|
134
|
-
version_requirements: *
|
|
145
|
+
version_requirements: *78599190
|
|
135
146
|
- !ruby/object:Gem::Dependency
|
|
136
147
|
name: rspec-rails
|
|
137
|
-
requirement: &
|
|
148
|
+
requirement: &78598610 !ruby/object:Gem::Requirement
|
|
138
149
|
none: false
|
|
139
150
|
requirements:
|
|
140
151
|
- - ! '>='
|
|
@@ -142,10 +153,10 @@ dependencies:
|
|
|
142
153
|
version: '0'
|
|
143
154
|
type: :development
|
|
144
155
|
prerelease: false
|
|
145
|
-
version_requirements: *
|
|
156
|
+
version_requirements: *78598610
|
|
146
157
|
- !ruby/object:Gem::Dependency
|
|
147
158
|
name: guard-rspec
|
|
148
|
-
requirement: &
|
|
159
|
+
requirement: &78598040 !ruby/object:Gem::Requirement
|
|
149
160
|
none: false
|
|
150
161
|
requirements:
|
|
151
162
|
- - ! '>='
|
|
@@ -153,10 +164,10 @@ dependencies:
|
|
|
153
164
|
version: '0'
|
|
154
165
|
type: :development
|
|
155
166
|
prerelease: false
|
|
156
|
-
version_requirements: *
|
|
167
|
+
version_requirements: *78598040
|
|
157
168
|
- !ruby/object:Gem::Dependency
|
|
158
169
|
name: rb-inotify
|
|
159
|
-
requirement: &
|
|
170
|
+
requirement: &78597410 !ruby/object:Gem::Requirement
|
|
160
171
|
none: false
|
|
161
172
|
requirements:
|
|
162
173
|
- - ! '>='
|
|
@@ -164,10 +175,10 @@ dependencies:
|
|
|
164
175
|
version: '0'
|
|
165
176
|
type: :development
|
|
166
177
|
prerelease: false
|
|
167
|
-
version_requirements: *
|
|
178
|
+
version_requirements: *78597410
|
|
168
179
|
- !ruby/object:Gem::Dependency
|
|
169
180
|
name: libnotify
|
|
170
|
-
requirement: &
|
|
181
|
+
requirement: &78596950 !ruby/object:Gem::Requirement
|
|
171
182
|
none: false
|
|
172
183
|
requirements:
|
|
173
184
|
- - ! '>='
|
|
@@ -175,7 +186,7 @@ dependencies:
|
|
|
175
186
|
version: '0'
|
|
176
187
|
type: :development
|
|
177
188
|
prerelease: false
|
|
178
|
-
version_requirements: *
|
|
189
|
+
version_requirements: *78596950
|
|
179
190
|
description: LogicalModel allows to use a resource as a model. It is based on web
|
|
180
191
|
presentation http://www.slideshare.net/ihower/serviceoriented-design-and-implement-with-rails3
|
|
181
192
|
email: dwaynemac@gmail.com
|
|
@@ -199,10 +210,8 @@ files:
|
|
|
199
210
|
- config/database.yml
|
|
200
211
|
- db/development.sqlite3
|
|
201
212
|
- db/migrate/001_create_users.rb
|
|
202
|
-
- db/test.sqlite3
|
|
203
213
|
- lib/logical_model.rb
|
|
204
214
|
- logical_model.gemspec
|
|
205
|
-
- logs/development.log
|
|
206
215
|
- models/user.rb
|
|
207
216
|
- service.rb
|
|
208
217
|
- spec/client_spec.rb
|
|
@@ -225,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
225
234
|
version: '0'
|
|
226
235
|
segments:
|
|
227
236
|
- 0
|
|
228
|
-
hash: -
|
|
237
|
+
hash: -162919699
|
|
229
238
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
230
239
|
none: false
|
|
231
240
|
requirements:
|
data/db/test.sqlite3
DELETED
|
Binary file
|
data/logs/development.log
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004691s FAILED:
|
|
2
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
3
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.00462s FAILED:
|
|
4
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
5
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004597s FAILED:
|
|
6
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
7
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.00463s FAILED:
|
|
8
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
9
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004576s FAILED:
|
|
10
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
11
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.00471s FAILED:
|
|
12
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
13
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004598s FAILED:
|
|
14
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
15
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.021388s FAILED:
|
|
16
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
17
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004659s FAILED:
|
|
18
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
19
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.005105s FAILED:
|
|
20
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
21
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.004775s FAILED:
|
|
22
|
-
LogicalModel Log RESPONSE: "745: unexpected token at 'user%5Bbio%5D=rubyist&user%5Bemail%5D=paul%40pauldix.net&user%5Bname%5D=paul&user%5Bpassword%5D=strongpass'"
|
|
23
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.145529s FAILED:
|
|
24
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
25
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.0216s FAILED:
|
|
26
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
27
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.018887s FAILED:
|
|
28
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
29
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.127662s FAILED:
|
|
30
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
31
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.044237s FAILED: error
|
|
32
|
-
LogicalModel Log RESPONSE:
|
|
33
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.000878s FAILED: error
|
|
34
|
-
LogicalModel Log RESPONSE:
|
|
35
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.001611s FAILED: error
|
|
36
|
-
LogicalModel Log RESPONSE:
|
|
37
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.233063s FAILED:
|
|
38
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
39
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.157818s FAILED:
|
|
40
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
41
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.067717s FAILED:
|
|
42
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
43
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.011295s FAILED:
|
|
44
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
45
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.019577s FAILED:
|
|
46
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
47
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.047789s FAILED:
|
|
48
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
49
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.021546s FAILED:
|
|
50
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
51
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.049893s FAILED:
|
|
52
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
53
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 5.021058s FAILED:
|
|
54
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
55
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.047952s FAILED:
|
|
56
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
57
|
-
LogicalModel Log: 0 http://localhost:3000/api/v1/users in 0.001093s FAILED: error
|
|
58
|
-
LogicalModel Log RESPONSE:
|
|
59
|
-
LogicalModel Log: 0 http://localhost:3000/api/v1/users in 0.000394s FAILED: error
|
|
60
|
-
LogicalModel Log RESPONSE:
|
|
61
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.136481s FAILED:
|
|
62
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
63
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050792s FAILED:
|
|
64
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
65
|
-
LogicalModel Log: 200 http://localhost:3000/api/v1/users in 0.141034s FAILED:
|
|
66
|
-
LogicalModel Log RESPONSE: {"user":{"name":"bryan","created_at":"2011-11-03T14:37:44-03:00","updated_at":"2011-11-03T14:37:44-03:00","id":24,"bio":"another rubyist","email":"bryan@pauldix.net"}}
|
|
67
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050582s FAILED:
|
|
68
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
69
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.035647s FAILED:
|
|
70
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
71
|
-
LogicalModel Log: 200 http://localhost:3000/api/v1/users in 0.201605s FAILED:
|
|
72
|
-
LogicalModel Log RESPONSE: {"user":{"name":"bryan","created_at":"2011-11-03T14:39:18-03:00","updated_at":"2011-11-03T14:39:18-03:00","id":26,"bio":"another rubyist","email":"bryan@pauldix.net"}}
|
|
73
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.038625s FAILED:
|
|
74
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
75
|
-
LogicalModel Log: 200 http://localhost:3000/api/v1/users in 0.191726s FAILED:
|
|
76
|
-
LogicalModel Log RESPONSE: {"user":{"name":"bryan","created_at":"2011-11-03T14:41:10-03:00","updated_at":"2011-11-03T14:41:10-03:00","id":28,"bio":"another rubyist","email":"bryan@pauldix.net"}}
|
|
77
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.018539s FAILED:
|
|
78
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
79
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.049956s FAILED:
|
|
80
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
81
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.018731s FAILED:
|
|
82
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
83
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.048094s FAILED:
|
|
84
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
85
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.02157s FAILED:
|
|
86
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
87
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.051048s FAILED:
|
|
88
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
89
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 5.02165s FAILED:
|
|
90
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
91
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050986s FAILED:
|
|
92
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
93
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.013325s FAILED:
|
|
94
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
95
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.11644s FAILED:
|
|
96
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
97
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.014655s FAILED:
|
|
98
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
99
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050812s FAILED:
|
|
100
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
101
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.015264s FAILED:
|
|
102
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
103
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.048666s FAILED:
|
|
104
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
105
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 5.023148s FAILED:
|
|
106
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
107
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.047819s FAILED:
|
|
108
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
109
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.014254s FAILED:
|
|
110
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
111
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.048866s FAILED:
|
|
112
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
113
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.01741s FAILED:
|
|
114
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
115
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.051693s FAILED:
|
|
116
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
117
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.035599s FAILED:
|
|
118
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
119
|
-
LogicalModel Log: 200 http://localhost:3000/api/v1/users in 0.187376s FAILED:
|
|
120
|
-
LogicalModel Log RESPONSE: {"user":{"name":"bryan","created_at":"2011-11-03T14:58:14-03:00","updated_at":"2011-11-03T14:58:14-03:00","id":30,"bio":"another rubyist","email":"bryan@pauldix.net"}}
|
|
121
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.02095s FAILED:
|
|
122
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
123
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.000257s FAILED: error
|
|
124
|
-
LogicalModel Log RESPONSE:
|
|
125
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.023091s FAILED:
|
|
126
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
127
|
-
LogicalModel Log: 0 https://localhost:3000/api/v1/users in 0.000932s FAILED: error
|
|
128
|
-
LogicalModel Log RESPONSE:
|
|
129
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.019534s FAILED:
|
|
130
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
131
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 5.0228s FAILED:
|
|
132
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
133
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.012712s FAILED:
|
|
134
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
135
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.050448s FAILED:
|
|
136
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
137
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.058483s FAILED:
|
|
138
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
139
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.01427s FAILED:
|
|
140
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
141
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.051569s FAILED:
|
|
142
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|
|
143
|
-
LogicalModel Log: 400 http://localhost:3000/api/v1/users in 0.116518s FAILED:
|
|
144
|
-
LogicalModel Log RESPONSE: {"errors":{"name":["has already been taken"],"email":["has already been taken"]}}
|