cfoundry 0.4.16 → 0.4.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/lib/cfoundry/uaaclient.rb +3 -5
  2. data/lib/cfoundry/v1/model.rb +8 -0
  3. data/lib/cfoundry/v1/model_magic.rb +2 -2
  4. data/lib/cfoundry/v2/model.rb +17 -0
  5. data/lib/cfoundry/v2/model_magic.rb +48 -25
  6. data/lib/cfoundry/validator.rb +2 -0
  7. data/lib/cfoundry/version.rb +1 -1
  8. data/spec/cfoundry/uaaclient_spec.rb +15 -4
  9. data/spec/cfoundry/v2/model_magic_spec.rb +115 -0
  10. data/spec/fakes/app_fake.rb +5 -0
  11. data/spec/fakes/domain_fake.rb +5 -0
  12. data/spec/fakes/framework_fake.rb +5 -0
  13. data/spec/fakes/organization_fake.rb +5 -0
  14. data/spec/fakes/route_fake.rb +5 -0
  15. data/spec/fakes/runtime_fake.rb +5 -0
  16. data/spec/fakes/service_fake.rb +5 -0
  17. data/spec/fakes/service_instance_fake.rb +5 -0
  18. data/spec/fakes/service_plan_fake.rb +5 -0
  19. data/spec/fakes/space_fake.rb +5 -0
  20. data/spec/fakes/user_fake.rb +5 -0
  21. data/spec/spec_helper.rb +6 -7
  22. data/spec/support/fake_helper.rb +226 -0
  23. metadata +30 -47
  24. data/spec/factories/app_factory.rb +0 -25
  25. data/spec/factories/client_factory.rb +0 -25
  26. data/spec/factories/domain_factory.rb +0 -10
  27. data/spec/factories/factory.rb +0 -4
  28. data/spec/factories/framework_factory.rb +0 -10
  29. data/spec/factories/organization_factory.rb +0 -23
  30. data/spec/factories/route_factory.rb +0 -11
  31. data/spec/factories/runtime_factory.rb +0 -10
  32. data/spec/factories/service_binding_factory.rb +0 -20
  33. data/spec/factories/service_factory.rb +0 -16
  34. data/spec/factories/service_instance_factory.rb +0 -20
  35. data/spec/factories/service_plan_factory.rb +0 -11
  36. data/spec/factories/space_factory.rb +0 -25
  37. data/spec/factories/user_factory.rb +0 -10
@@ -49,11 +49,9 @@ module CFoundry
49
49
 
50
50
  def change_password(guid, new, old)
51
51
  put(
52
- { :schemas => ["urn:scim:schemas:core:1.0"],
53
- :password => new,
54
- :oldPassword => old
55
- },
56
- "User", guid, "password",
52
+ { :password => new, :oldPassword => old },
53
+ "Users", guid, "password",
54
+ :accept => :json,
57
55
  :content => :json)
58
56
  end
59
57
 
@@ -20,6 +20,14 @@ module CFoundry::V1
20
20
  def base_object_name
21
21
  @base_object_name ||= object_name
22
22
  end
23
+
24
+ def plural_object_name
25
+ "#{object_name}s"
26
+ end
27
+
28
+ def plural_base_object_name
29
+ "#{base_object_name}s"
30
+ end
23
31
  end
24
32
 
25
33
  attr_accessor :guid, :changes
@@ -20,10 +20,10 @@ module CFoundry::V1
20
20
 
21
21
  def define_client_methods(klass = self)
22
22
  singular = klass.object_name
23
- plural = :"#{singular}s"
23
+ plural = klass.plural_object_name
24
24
 
25
25
  base_singular = klass.base_object_name
26
- base_plural = :"#{base_singular}s"
26
+ base_plural = klass.plural_base_object_name
27
27
 
28
28
  BaseClientMethods.module_eval do
29
29
  define_method(base_singular) do |guid|
@@ -5,8 +5,21 @@ require "cfoundry/v2/model_magic"
5
5
 
6
6
  module CFoundry::V2
7
7
  class Model
8
+ @@objects = {}
9
+
8
10
  extend ModelMagic
9
11
 
12
+ class << self
13
+ def objects
14
+ @@objects
15
+ end
16
+
17
+ def inherited(klass)
18
+ @@objects[klass.object_name] = klass
19
+ super
20
+ end
21
+ end
22
+
10
23
  attr_accessor :guid, :cache, :changes
11
24
 
12
25
  def initialize(guid, client, manifest = nil, partial = false)
@@ -39,6 +52,10 @@ module CFoundry::V2
39
52
  @object_name ||= self.class.object_name
40
53
  end
41
54
 
55
+ def plural_object_name
56
+ @plural_object_name ||= self.class.plural_object_name
57
+ end
58
+
42
59
  def invalidate!
43
60
  @manifest = nil
44
61
  @partial = false
@@ -24,6 +24,18 @@ module CFoundry::V2
24
24
  '\1_\2').downcase.to_sym
25
25
  end
26
26
 
27
+ def plural_object_name
28
+ :"#{object_name}s"
29
+ end
30
+
31
+ def define_client_methods(&blk)
32
+ ClientMethods.module_eval(&blk)
33
+ end
34
+
35
+ def define_base_client_methods(&blk)
36
+ BaseClientMethods.module_eval(&blk)
37
+ end
38
+
27
39
  def defaults
28
40
  @defaults ||= {}
29
41
  end
@@ -42,9 +54,9 @@ module CFoundry::V2
42
54
 
43
55
  def inherited(klass)
44
56
  singular = klass.object_name
45
- plural = :"#{singular}s"
57
+ plural = klass.plural_object_name
46
58
 
47
- BaseClientMethods.module_eval do
59
+ define_base_client_methods do
48
60
  define_method(singular) do |guid, *args|
49
61
  get("v2", plural, guid, :accept => :json,
50
62
  :params => ModelMagic.params_from(args))
@@ -70,7 +82,7 @@ module CFoundry::V2
70
82
  end
71
83
  end
72
84
 
73
- ClientMethods.module_eval do
85
+ define_client_methods do
74
86
  define_method(singular) do |*args|
75
87
  guid, partial, _ = args
76
88
 
@@ -147,7 +159,12 @@ module CFoundry::V2
147
159
  define_method(name) do
148
160
  return @cache[name] if @cache.key?(name)
149
161
 
150
- @cache[name] = manifest[:entity][name] || default
162
+ @cache[name] =
163
+ if manifest[:entity].key?(name)
164
+ manifest[:entity][name]
165
+ else
166
+ default
167
+ end
151
168
  end
152
169
 
153
170
  define_method(:"#{name}=") do |val|
@@ -208,7 +225,7 @@ module CFoundry::V2
208
225
  end
209
226
 
210
227
  define_method(:"#{name}=") do |val|
211
- klass = CFoundry::V2.const_get(kls)
228
+ klass = self.class.objects[obj]
212
229
 
213
230
  unless has_default && val == default
214
231
  CFoundry::Validator.validate_type(val, klass)
@@ -218,15 +235,15 @@ module CFoundry::V2
218
235
  @manifest[:entity] ||= {}
219
236
 
220
237
  old = @manifest[:entity][:"#{name}_guid"]
221
- if old != val.guid
222
- old_obj = klass.new(@client, old, @manifest[:entity][name])
238
+ if old != (val && val.guid)
239
+ old_obj =
240
+ @cache[name] || klass.new(@client, old, @manifest[:entity][name])
223
241
 
224
242
  @changes[name] = [old_obj, val]
225
243
  end
226
244
 
227
245
  @cache[name] = val
228
246
 
229
- @manifest[:entity][name] = val.manifest
230
247
  @manifest[:entity][:"#{name}_guid"] =
231
248
  @diff[:"#{name}_guid"] = val && val.guid
232
249
  end
@@ -240,13 +257,14 @@ module CFoundry::V2
240
257
  include QUERIES[singular]
241
258
 
242
259
  object = opts[:as] || singular
243
- plural_object = :"#{object}s"
244
260
 
245
261
  kls = object.to_s.capitalize.gsub(/(.)_(.)/) do
246
262
  $1 + $2.upcase
247
263
  end
248
264
 
249
265
  define_method(plural) do |*args|
266
+ klass = CFoundry::V2.const_get(kls)
267
+
250
268
  opts, _ = args
251
269
  opts ||= {}
252
270
 
@@ -269,8 +287,8 @@ module CFoundry::V2
269
287
  else
270
288
  res =
271
289
  @client.send(
272
- :"#{plural_object}_from",
273
- "/v2/#{object_name}s/#@guid/#{plural}",
290
+ :"#{klass.plural_object_name}_from",
291
+ "/v2/#{plural_object_name}/#@guid/#{plural}",
274
292
  opts)
275
293
  end
276
294
 
@@ -286,7 +304,9 @@ module CFoundry::V2
286
304
  end
287
305
 
288
306
  define_method(:"add_#{singular}") do |x|
289
- CFoundry::Validator.validate_type(x, CFoundry::V2.const_get(kls))
307
+ klass = self.class.objects[object]
308
+
309
+ CFoundry::Validator.validate_type(x, klass)
290
310
 
291
311
  if cache = @cache[plural]
292
312
  cache << x unless cache.include?(x)
@@ -294,12 +314,14 @@ module CFoundry::V2
294
314
 
295
315
  @client.base.request_path(
296
316
  Net::HTTP::Put,
297
- ["v2", "#{object_name}s", @guid, plural, x.guid],
317
+ ["v2", plural_object_name, @guid, plural, x.guid],
298
318
  :accept => :json)
299
319
  end
300
320
 
301
321
  define_method(:"remove_#{singular}") do |x|
302
- CFoundry::Validator.validate_type(x, CFoundry::V2.const_get(kls))
322
+ klass = self.class.objects[object]
323
+
324
+ CFoundry::Validator.validate_type(x, klass)
303
325
 
304
326
  if cache = @cache[plural]
305
327
  cache.delete(x)
@@ -307,12 +329,12 @@ module CFoundry::V2
307
329
 
308
330
  @client.base.request_path(
309
331
  Net::HTTP::Delete,
310
- ["v2", "#{object_name}s", @guid, plural, x.guid],
332
+ ["v2", plural_object_name, @guid, plural, x.guid],
311
333
  :accept => :json)
312
334
  end
313
335
 
314
336
  define_method(:"#{plural}=") do |xs|
315
- klass = CFoundry::V2.const_get(kls)
337
+ klass = self.class.objects[object]
316
338
 
317
339
  CFoundry::Validator.validate_type(xs, [klass])
318
340
 
@@ -322,15 +344,16 @@ module CFoundry::V2
322
344
  old = @manifest[:entity][:"#{singular}_guids"]
323
345
  if old != xs.collect(&:guid)
324
346
  old_objs =
325
- if all = @manifest[:entity][plural]
326
- all.collect do |m|
327
- klass.new(@client, m[:metadata][:guid], m)
347
+ @cache[plural] ||
348
+ if all = @manifest[:entity][plural]
349
+ all.collect do |m|
350
+ klass.new(@client, m[:metadata][:guid], m)
351
+ end
352
+ elsif old
353
+ old.collect { |id| klass.new(@client, id) }
328
354
  end
329
- elsif old
330
- old.collect { |id| klass.new(@client, id) }
331
- end
332
355
 
333
- @changes[name] = [old_objs, xs]
356
+ @changes[plural] = [old_objs, xs]
334
357
  end
335
358
 
336
359
  @cache[plural] = xs
@@ -344,7 +367,7 @@ module CFoundry::V2
344
367
  define_method(:summary) do
345
368
  @client.base.request_path(
346
369
  Net::HTTP::Get,
347
- ["v2", "#{object_name}s", @guid, "summary"],
370
+ ["v2", plural_object_name, @guid, "summary"],
348
371
  :accept => :json)
349
372
  end
350
373
 
@@ -386,7 +409,7 @@ module CFoundry::V2
386
409
  def queryable_by(*names)
387
410
  klass = self
388
411
  singular = object_name
389
- plural = :"#{singular}s"
412
+ plural = plural_object_name
390
413
 
391
414
  query = QUERIES[singular]
392
415
 
@@ -22,6 +22,8 @@ module CFoundry
22
22
  type.all? { |name, subtype|
23
23
  val.key?(name) && value_matches?(val[name], subtype)
24
24
  }
25
+ when nil
26
+ true
25
27
  else
26
28
  val.is_a?(Object.const_get(type.to_s.capitalize))
27
29
  end
@@ -1,4 +1,4 @@
1
1
  module CFoundry # :nodoc:
2
2
  # CFoundry library version number.
3
- VERSION = "0.4.16".freeze
3
+ VERSION = "0.4.17".freeze
4
4
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe CFoundry::UAAClient do
4
4
  let(:target) { "https://uaa.example.com" }
@@ -114,16 +114,27 @@ EOF
114
114
  it 'sends a password change request' do
115
115
  req = stub_request(
116
116
  :put,
117
- "#{target}/User/#{guid}/password"
117
+ "#{target}/Users/#{guid}/password"
118
118
  ).with(
119
119
  :body => {
120
- :schemas => ["urn:scim:schemas:core:1.0"],
121
120
  :password => new,
122
121
  :oldPassword => old
123
122
  },
124
- :headers => { "Content-Type" => "application/json" }
123
+ :headers => {
124
+ "Content-Type" => "application/json",
125
+ "Accept" => "application/json"
126
+ }
127
+ ).to_return(
128
+ :status => 200,
129
+ :body => <<EOF
130
+ {
131
+ "status": "ok",
132
+ "message": "password_updated"
133
+ }
134
+ EOF
125
135
  )
126
136
 
137
+
127
138
  subject
128
139
 
129
140
  expect(req).to have_been_requested
@@ -0,0 +1,115 @@
1
+ require "spec_helper"
2
+
3
+ describe CFoundry::V2::ModelMagic do
4
+ let(:client) { fake_client }
5
+ let(:mymodel) { fake_model }
6
+ let(:guid) { random_string("my-object-guid") }
7
+ let(:myobject) { mymodel.new(guid, client) }
8
+
9
+ describe 'attributes' do
10
+ describe 'reading' do
11
+ let(:mymodel) { fake_model { attribute :foo, :object } }
12
+
13
+ context 'when it exists in the manifest' do
14
+ subject { myobject.fake(:foo => "bar") }
15
+
16
+ it 'returns the value from the manifest' do
17
+ expect(subject.foo).to eq "bar"
18
+ end
19
+
20
+ context 'and the default is nil but the value is false' do
21
+ let(:mymodel) {
22
+ fake_model { attribute :foo, :object, :default => nil }
23
+ }
24
+
25
+ subject { myobject.fake(:foo => false) }
26
+
27
+ it 'returns false' do
28
+ expect(subject.foo).to eq false
29
+ end
30
+ end
31
+
32
+ context 'and the default is false but the value is nil' do
33
+ let(:mymodel) {
34
+ fake_model { attribute :foo, :object, :default => false }
35
+ }
36
+
37
+ subject { myobject.fake(:foo => nil) }
38
+
39
+ it 'returns nil' do
40
+ expect(subject.foo).to eq nil
41
+ end
42
+ end
43
+ end
44
+
45
+ context 'when the manifest has not been acquired' do
46
+ it 'retrieves the manifest the first time' do
47
+ mock(client.base).my_fake_model(guid) {
48
+ { :entity => { :foo => "fizz" } }
49
+ }.ordered
50
+
51
+ expect(myobject.foo).to eq "fizz"
52
+
53
+ dont_allow(client.base).my_fake_model.ordered
54
+
55
+ expect(myobject.foo).to eq "fizz"
56
+ end
57
+ end
58
+
59
+ context 'when it does not exist in the manifest' do
60
+ let(:mymodel) {
61
+ fake_model { attribute :foo, :object, :default => "foo" }
62
+ }
63
+
64
+ subject { myobject.fake }
65
+
66
+ it 'returns the default value' do
67
+ expect(subject.foo).to eq "foo"
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ describe 'to_one relationships' do
74
+ describe 'writing' do
75
+ let!(:mymodel) { fake_model { to_one :foo } }
76
+ let!(:othermodel) { fake_model :foo }
77
+
78
+ let(:myobject) { mymodel.new(nil, client).fake }
79
+ let(:otherobject) { othermodel.new(nil, client).fake }
80
+
81
+ subject { myobject.foo = otherobject }
82
+
83
+ it "sets the GUID in the manifest to the object's GUID" do
84
+ expect { subject }.to change {
85
+ myobject.manifest[:entity][:foo_guid]
86
+ }.to(otherobject.guid)
87
+ end
88
+
89
+ it "tracks internal changes in the diff" do
90
+ expect { subject }.to change { myobject.diff }.to(
91
+ :foo_guid => otherobject.guid)
92
+ end
93
+
94
+ it "tracks high-level changes in .changes" do
95
+ before = myobject.foo
96
+ expect { subject }.to change { myobject.changes }.to(
97
+ :foo => [before, otherobject])
98
+ end
99
+
100
+ context "when there is a default" do
101
+ let(:mymodel) { fake_model { to_one :foo, :default => nil } }
102
+
103
+ subject { myobject.foo = nil }
104
+
105
+ it "allows setting to the default" do
106
+ myobject.foo = otherobject
107
+
108
+ expect { subject }.to change {
109
+ myobject.manifest[:entity][:foo_guid]
110
+ }.from(otherobject.guid).to(nil)
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::App
2
+ def default_fakes
3
+ super.merge :name => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::Domain
2
+ def default_fakes
3
+ super.merge :name => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::Framework
2
+ def default_fakes
3
+ super.merge :name => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::Organization
2
+ def default_fakes
3
+ super.merge :name => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::Route
2
+ def default_fakes
3
+ super.merge :host => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::Runtime
2
+ def default_fakes
3
+ super.merge :name => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::Service
2
+ def default_fakes
3
+ super.merge :label => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::ServiceInstance
2
+ def default_fakes
3
+ super.merge :name => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::ServicePlan
2
+ def default_fakes
3
+ super.merge :name => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::Space
2
+ def default_fakes
3
+ super.merge :name => random_string(object_name)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class CFoundry::V2::User
2
+ def default_fakes
3
+ super.merge :admin => false
4
+ end
5
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,17 +1,16 @@
1
1
  require "rspec"
2
2
  require "cfoundry"
3
- require "factory_girl"
4
3
  require "webmock/rspec"
5
4
 
6
- Dir[File.expand_path('../support/**/*.rb', __FILE__)].each do |file|
5
+ Dir[File.expand_path('../{support,fakes}/**/*.rb', __FILE__)].each do |file|
7
6
  require file
8
7
  end
9
8
 
10
- FactoryGirl.definition_file_paths =
11
- [File.expand_path("../factories", __FILE__)]
12
-
13
- FactoryGirl.find_definitions
9
+ def random_string(tag = "random")
10
+ sprintf("%s-%x", tag, rand(10 ** 6))
11
+ end
14
12
 
15
13
  RSpec.configure do |c|
14
+ c.include Fake::FakeMethods
16
15
  c.mock_with :rr
17
- end
16
+ end
@@ -0,0 +1,226 @@
1
+ module Fake
2
+ module FakeMethods
3
+ def fake_client(attributes = {})
4
+ CFoundry::V2::FakeClient.new.fake(attributes)
5
+ end
6
+
7
+ def fake(what, attributes = {})
8
+ fake_client.send(what).fake(attributes)
9
+ end
10
+
11
+ def fake_list(what, count, attributes = {})
12
+ objs = []
13
+
14
+ count.times do
15
+ objs << fake(what, attributes)
16
+ end
17
+
18
+ objs
19
+ end
20
+
21
+ def fake_model(name = :my_fake_model, &init)
22
+ # There is a difference between ruby 1.8.7 and 1.8.8 in the order that
23
+ # the inherited callback gets called. In 1.8.7 the inherited callback
24
+ # is called after the block; in 1.8.8 and later it's called before.
25
+ # The upshot for us is we need a failproof way of getting the name
26
+ # to klass. So we're using a global variable to hand off the value.
27
+ # Please don't shoot us. - ESH & MMB
28
+ $object_name = name
29
+ klass = Class.new(CFoundry::V2::FakeModel) do
30
+ self.object_name = name
31
+ end
32
+
33
+ klass.class_eval(&init) if init
34
+
35
+ klass
36
+ end
37
+ end
38
+
39
+ def fake(attributes = {})
40
+ fake_attributes(attributes).each do |k, v|
41
+ send(:"#{k}=", v)
42
+ setup_reverse_relationship(v)
43
+ end
44
+
45
+ self
46
+ end
47
+
48
+ def self.define_many_association(target, plural)
49
+ target.class_eval do
50
+ define_method(plural) do |*args|
51
+ options, _ = args
52
+ options ||= {}
53
+
54
+ vals = get_many(plural) || []
55
+
56
+ if options[:query]
57
+ by, val = options[:query]
58
+ vals.select do |v|
59
+ v.send(by) == val
60
+ end
61
+ else
62
+ vals
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ module CFoundry::V2
70
+ class Model
71
+ include Fake
72
+
73
+ attr_writer :client
74
+
75
+ private
76
+
77
+ def get_many(plural)
78
+ @cache[plural]
79
+ end
80
+
81
+ def fake_attributes(attributes)
82
+ fakes = default_fakes.merge(attributes)
83
+
84
+ # default relationships to other fake objects
85
+ self.class.to_one_relations.each do |name, opts|
86
+ # remove _guid (not an actual attribute)
87
+ fakes.delete :"#{name}_guid"
88
+ next if fakes.key?(name)
89
+
90
+ fakes[name] =
91
+ if opts.key?(:default)
92
+ opts[:default]
93
+ else
94
+ @client.send(opts[:as] || name).fake
95
+ end
96
+ end
97
+
98
+ fakes
99
+ end
100
+
101
+ # override this to provide basic attributes (like name) dynamically
102
+ def default_fakes
103
+ self.class.defaults.merge(
104
+ :guid => random_string("fake-#{object_name}-guid"))
105
+ end
106
+
107
+ def setup_reverse_relationship(v)
108
+ if v.is_a?(Array)
109
+ v.each do |x|
110
+ setup_reverse_relationship(x)
111
+ end
112
+
113
+ return
114
+ end
115
+
116
+ return unless v.is_a?(Model)
117
+
118
+ relation, type = find_reverse_relationship(v)
119
+
120
+ v.client = @client
121
+
122
+ if type == :one
123
+ v.send(:"#{relation}=", self)
124
+ elsif type == :many
125
+ v.send(:"#{relation}=", v.send(relation) + [self])
126
+ end
127
+ end
128
+
129
+ def find_reverse_relationship(v)
130
+ singular = object_name
131
+ plural = plural_object_name
132
+
133
+ v.class.to_one_relations.each do |attr, opts|
134
+ return [attr, :one] if attr == singular
135
+ return [attr, :one] if opts[:as] == singular
136
+ end
137
+
138
+ v.class.to_many_relations.each do |attr, opts|
139
+ return [attr, :many] if attr == plural
140
+ return [attr, :many] if opts[:as] == singular
141
+ end
142
+ end
143
+ end
144
+
145
+
146
+ class FakeBase < Base
147
+ end
148
+
149
+
150
+ class FakeClient < Client
151
+ include Fake
152
+
153
+ def initialize(target = "http://example.com", token = nil)
154
+ @base = FakeBase.new(target, token)
155
+ end
156
+
157
+ private
158
+
159
+ def get_many(plural)
160
+ instance_variable_get(:"@#{plural}")
161
+ end
162
+
163
+ def fake_attributes(attributes)
164
+ attributes
165
+ end
166
+
167
+ def setup_reverse_relationship(v)
168
+ if v.is_a?(Model)
169
+ v.client = self
170
+ elsif v.is_a?(Array)
171
+ v.each do |x|
172
+ setup_reverse_relationship(x)
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+
179
+ class FakeModel < CFoundry::V2::Model
180
+ attr_reader :diff
181
+
182
+ def self.inherited(klass)
183
+ class << klass
184
+ attr_writer :object_name
185
+ end
186
+
187
+ # There is a difference between ruby 1.8.7 and 1.8.8 in the order that
188
+ # the inherited callback gets called. In 1.8.7 the inherited callback
189
+ # is called after the block; in 1.8.8 and later it's called before.
190
+ # The upshot for us is we need a failproof way of getting the name
191
+ # to klass. So we're using a global variable to hand off the value.
192
+ # Please don't shoot us. - ESH & MMB
193
+ klass.object_name = $object_name
194
+ super
195
+ end
196
+
197
+ class << self
198
+ attr_writer :object_name
199
+ end
200
+ end
201
+
202
+
203
+ module ModelMagic
204
+ def self.define_client_methods(&blk)
205
+ FakeClient.module_eval(&blk)
206
+ end
207
+
208
+ def self.define_base_client_methods(&blk)
209
+ FakeBase.module_eval(&blk)
210
+ end
211
+ end
212
+
213
+
214
+ Model.objects.each_value do |klass|
215
+ klass.to_many_relations.each do |plural, _|
216
+ Fake.define_many_association(klass, plural)
217
+ end
218
+
219
+ FakeClient.class_eval do
220
+ plural = klass.plural_object_name
221
+
222
+ attr_writer plural
223
+ Fake.define_many_association(self, plural)
224
+ end
225
+ end
226
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfoundry
3
3
  version: !ruby/object:Gem::Version
4
- hash: 47
4
+ hash: 45
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
- - 16
10
- version: 0.4.16
9
+ - 17
10
+ version: 0.4.17
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alex Suraci
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-12-19 00:00:00 Z
18
+ date: 2013-01-03 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: multipart-post
@@ -122,21 +122,6 @@ dependencies:
122
122
  version: "1.0"
123
123
  type: :development
124
124
  version_requirements: *id007
125
- - !ruby/object:Gem::Dependency
126
- name: factory_girl
127
- prerelease: false
128
- requirement: &id008 !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ~>
132
- - !ruby/object:Gem::Version
133
- hash: 15
134
- segments:
135
- - 2
136
- - 6
137
- version: "2.6"
138
- type: :development
139
- version_requirements: *id008
140
125
  description:
141
126
  email:
142
127
  - asuraci@vmware.com
@@ -190,21 +175,20 @@ files:
190
175
  - spec/cfoundry/baseclient_spec.rb
191
176
  - spec/cfoundry/errors_spec.rb
192
177
  - spec/cfoundry/uaaclient_spec.rb
193
- - spec/factories/app_factory.rb
194
- - spec/factories/client_factory.rb
195
- - spec/factories/domain_factory.rb
196
- - spec/factories/factory.rb
197
- - spec/factories/framework_factory.rb
198
- - spec/factories/organization_factory.rb
199
- - spec/factories/route_factory.rb
200
- - spec/factories/runtime_factory.rb
201
- - spec/factories/service_binding_factory.rb
202
- - spec/factories/service_factory.rb
203
- - spec/factories/service_instance_factory.rb
204
- - spec/factories/service_plan_factory.rb
205
- - spec/factories/space_factory.rb
206
- - spec/factories/user_factory.rb
178
+ - spec/cfoundry/v2/model_magic_spec.rb
179
+ - spec/fakes/app_fake.rb
180
+ - spec/fakes/domain_fake.rb
181
+ - spec/fakes/framework_fake.rb
182
+ - spec/fakes/organization_fake.rb
183
+ - spec/fakes/route_fake.rb
184
+ - spec/fakes/runtime_fake.rb
185
+ - spec/fakes/service_fake.rb
186
+ - spec/fakes/service_instance_fake.rb
187
+ - spec/fakes/service_plan_fake.rb
188
+ - spec/fakes/space_fake.rb
189
+ - spec/fakes/user_fake.rb
207
190
  - spec/spec_helper.rb
191
+ - spec/support/fake_helper.rb
208
192
  homepage: http://cloudfoundry.com/
209
193
  licenses: []
210
194
 
@@ -242,18 +226,17 @@ test_files:
242
226
  - spec/cfoundry/baseclient_spec.rb
243
227
  - spec/cfoundry/errors_spec.rb
244
228
  - spec/cfoundry/uaaclient_spec.rb
245
- - spec/factories/app_factory.rb
246
- - spec/factories/client_factory.rb
247
- - spec/factories/domain_factory.rb
248
- - spec/factories/factory.rb
249
- - spec/factories/framework_factory.rb
250
- - spec/factories/organization_factory.rb
251
- - spec/factories/route_factory.rb
252
- - spec/factories/runtime_factory.rb
253
- - spec/factories/service_binding_factory.rb
254
- - spec/factories/service_factory.rb
255
- - spec/factories/service_instance_factory.rb
256
- - spec/factories/service_plan_factory.rb
257
- - spec/factories/space_factory.rb
258
- - spec/factories/user_factory.rb
229
+ - spec/cfoundry/v2/model_magic_spec.rb
230
+ - spec/fakes/app_fake.rb
231
+ - spec/fakes/domain_fake.rb
232
+ - spec/fakes/framework_fake.rb
233
+ - spec/fakes/organization_fake.rb
234
+ - spec/fakes/route_fake.rb
235
+ - spec/fakes/runtime_fake.rb
236
+ - spec/fakes/service_fake.rb
237
+ - spec/fakes/service_instance_fake.rb
238
+ - spec/fakes/service_plan_fake.rb
239
+ - spec/fakes/space_fake.rb
240
+ - spec/fakes/user_fake.rb
259
241
  - spec/spec_helper.rb
242
+ - spec/support/fake_helper.rb
@@ -1,25 +0,0 @@
1
- FactoryGirl.define do
2
- factory :app, :class => CFoundry::V2::App do
3
- guid { FactoryGirl.generate(:guid) }
4
- name { FactoryGirl.generate(:random_string) }
5
- memory 128
6
- total_instances 0
7
- production false
8
- state "STOPPED"
9
-
10
- ignore do
11
- routes []
12
- service_bindings []
13
- end
14
-
15
- initialize_with do
16
- CFoundry::V2::App.new(nil, nil)
17
- end
18
-
19
- after_build do |app, evaluator|
20
- %w{name routes service_bindings}.each do |attr|
21
- RR.stub(app).__send__(attr) { evaluator.send(attr) }
22
- end
23
- end
24
- end
25
- end
@@ -1,25 +0,0 @@
1
- FactoryGirl.define do
2
- factory :client, :class => CFoundry::V2::Client do
3
- ignore do
4
- routes []
5
- apps []
6
- frameworks []
7
- runtimes []
8
- service_instances []
9
- spaces []
10
- organizations []
11
- logged_in true
12
- end
13
-
14
- after_build do |client, evaluator|
15
- RR.stub(client).logged_in? { evaluator.logged_in }
16
- RR.stub(client).routes { evaluator.routes }
17
- RR.stub(client).apps { evaluator.apps }
18
- RR.stub(client).frameworks { evaluator.frameworks }
19
- RR.stub(client).runtimes { evaluator.runtimes }
20
- RR.stub(client).service_instances { evaluator.service_instances }
21
- RR.stub(client).spaces { evaluator.spaces }
22
- RR.stub(client).organizations { evaluator.organizations }
23
- end
24
- end
25
- end
@@ -1,10 +0,0 @@
1
- FactoryGirl.define do
2
- factory :domain, :class => CFoundry::V2::Domain do
3
- guid { FactoryGirl.generate(:guid) }
4
- name { FactoryGirl.generate(:random_string) }
5
-
6
- initialize_with do
7
- CFoundry::V2::Domain.new(nil, nil)
8
- end
9
- end
10
- end
@@ -1,4 +0,0 @@
1
- FactoryGirl.define do
2
- sequence(:random_string) {|n| "random_#{n}_string" }
3
- sequence(:guid) {|n| "random_#{n}_guid" }
4
- end
@@ -1,10 +0,0 @@
1
- FactoryGirl.define do
2
- factory :framework, :class => CFoundry::V2::Framework do
3
- guid { FactoryGirl.generate(:guid) }
4
- name { FactoryGirl.generate(:random_string) }
5
-
6
- initialize_with do
7
- CFoundry::V2::Framework.new(nil, nil)
8
- end
9
- end
10
- end
@@ -1,23 +0,0 @@
1
- FactoryGirl.define do
2
- factory :organization, :class => CFoundry::V2::Organization do
3
- guid { FactoryGirl.generate(:guid) }
4
- name { FactoryGirl.generate(:random_string) }
5
-
6
- ignore do
7
- spaces []
8
- domains []
9
- end
10
-
11
- initialize_with do
12
- CFoundry::V2::Organization.new(nil, nil)
13
- end
14
-
15
- after_build do |org, evaluator|
16
- evaluator.spaces.each { |s| s.organization = org }
17
- evaluator.domains.each { |s| s.owning_organization = org }
18
-
19
- RR.stub(org).spaces { evaluator.spaces }
20
- RR.stub(org).domains { evaluator.domains }
21
- end
22
- end
23
- end
@@ -1,11 +0,0 @@
1
- FactoryGirl.define do
2
- factory :route, :class => CFoundry::V2::Route do
3
- guid { FactoryGirl.generate(:guid) }
4
- host { FactoryGirl.generate(:random_string) }
5
- association :domain, :factory => :domain, :strategy => :build
6
-
7
- initialize_with do
8
- CFoundry::V2::Route.new(nil, nil)
9
- end
10
- end
11
- end
@@ -1,10 +0,0 @@
1
- FactoryGirl.define do
2
- factory :runtime, :class => CFoundry::V2::Runtime do
3
- guid { FactoryGirl.generate(:guid) }
4
- name { FactoryGirl.generate(:random_string) }
5
-
6
- initialize_with do
7
- CFoundry::V2::Runtime.new(nil, nil)
8
- end
9
- end
10
- end
@@ -1,20 +0,0 @@
1
- FactoryGirl.define do
2
- factory :service_binding, :class => CFoundry::V2::ServiceBinding do
3
- guid { FactoryGirl.generate(:guid) }
4
-
5
- ignore do
6
- app nil
7
- service_instance nil
8
- end
9
-
10
- initialize_with do
11
- CFoundry::V2::ServiceBinding.new(nil, nil)
12
- end
13
-
14
- after_build do |app, evaluator|
15
- %w{app service_instance}.each do |attr|
16
- RR.stub(app).__send__(attr) { evaluator.send(attr) }
17
- end
18
- end
19
- end
20
- end
@@ -1,16 +0,0 @@
1
- FactoryGirl.define do
2
- factory :service, :class => CFoundry::V2::Service do
3
- guid { FactoryGirl.generate(:guid) }
4
- label "redis"
5
- provider "core"
6
- url "http://example.com"
7
- description "small key-value store"
8
- version "2.8"
9
- info_url "http://cloudfoundry.com/redis"
10
- active true
11
-
12
- initialize_with do
13
- CFoundry::V2::Service.new(nil, nil)
14
- end
15
- end
16
- end
@@ -1,20 +0,0 @@
1
- FactoryGirl.define do
2
- factory :service_instance, :class => CFoundry::V2::ServiceInstance do
3
- guid { FactoryGirl.generate(:guid) }
4
- name { FactoryGirl.generate(:random_string) }
5
-
6
- ignore do
7
- service_bindings []
8
- end
9
-
10
- initialize_with do
11
- CFoundry::V2::ServiceInstance.new(nil, nil)
12
- end
13
-
14
- after_build do |svc, evaluator|
15
- %w{name service_bindings}.each do |attr|
16
- RR.stub(svc).__send__(attr) { evaluator.send(attr) }
17
- end
18
- end
19
- end
20
- end
@@ -1,11 +0,0 @@
1
- FactoryGirl.define do
2
- factory :service_plan, :class => CFoundry::V2::ServicePlan do
3
- guid { FactoryGirl.generate(:guid) }
4
- name "D100"
5
- description "Filibuster plan"
6
-
7
- initialize_with do
8
- CFoundry::V2::ServicePlan.new(nil, nil)
9
- end
10
- end
11
- end
@@ -1,25 +0,0 @@
1
- FactoryGirl.define do
2
- factory :space, :class => CFoundry::V2::Space do
3
- guid { FactoryGirl.generate(:guid) }
4
- name { FactoryGirl.generate(:random_string) }
5
-
6
- ignore do
7
- apps []
8
- service_instances []
9
- domains []
10
- end
11
-
12
- initialize_with do
13
- CFoundry::V2::Space.new(nil, nil)
14
- end
15
-
16
- after_build do |org, evaluator|
17
- evaluator.apps.each { |s| s.space = org }
18
- evaluator.service_instances.each { |s| s.space = org }
19
-
20
- RR.stub(org).apps { evaluator.apps }
21
- RR.stub(org).service_instances { evaluator.service_instances }
22
- RR.stub(org).domains { evaluator.domains }
23
- end
24
- end
25
- end
@@ -1,10 +0,0 @@
1
- FactoryGirl.define do
2
- factory :user, :class => CFoundry::V2::User do
3
- guid { FactoryGirl.generate(:guid) }
4
- admin false
5
-
6
- initialize_with do
7
- CFoundry::V2::User.new(nil, nil)
8
- end
9
- end
10
- end