welo 0.0.7 → 0.1.0

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.
Files changed (4) hide show
  1. data/TODO +4 -2
  2. data/lib/welo/core/observation.rb +76 -16
  3. data/lib/welo.rb +3 -3
  4. metadata +4 -4
data/TODO CHANGED
@@ -2,6 +2,8 @@
2
2
  - merge the branch
3
3
  - use the complex serialization overhead only when needed loaded
4
4
  * Observations
5
- - make them more useful
5
+ - boil-down to a better API
6
+ + improve the DelayedObservation thing
7
+ + improve the Observer's eventing
6
8
  * Proxies
7
- - a class like observations
9
+ - a class like observations to manipulate distant
@@ -1,35 +1,95 @@
1
1
 
2
2
  module Welo
3
+ # DelayedObservation is a class representing a subsequent observation.
4
+ DelayedObservation = Struct.new(:observation, :relationship, :path)
5
+
6
+ # An ObservationStruct is a special Struct (i.e. a class whose
7
+ # instances are structures).
3
8
  ObservationStruct = Class.new(Struct) do
9
+ # The source for an observation instance is the object from which it could
10
+ # be observed. Many applications may not matter, but some do.
11
+ attr_accessor :_source_
12
+ alias :source :_source_
13
+
14
+ # Creates a new structure, class which fields correspond to the perspective
15
+ # named name in resource. If a block is passed, then it is evaluated in
16
+ # the context of the new structure (like Struct.new { ... }).
17
+ #
18
+ # Normally, this method would be inherited by the structure, but we do not want to.
19
+ # Thus we undef it in self.inherited (see self.inherited).
20
+ def self.new_for_resource_in_perspective(resource, name, &blk)
21
+ persp = resource.perspective(name)
22
+ raise ArgumentError.new("no such perspective: #{name} for #{resource}") unless persp
23
+ st = self.new(*persp.fields, &blk)
24
+ st.resource = resource
25
+ st
26
+ end
27
+
28
+ # Hook to remove the new_for_resource_in_perspective methods, which is
29
+ # designed only for ObservationStruct but is inherited by the Struct
30
+ # classes if nothing is done.
31
+ def self.inherited(klass)
32
+ klass.instance_eval do
33
+ undef :new_for_resource_in_perspective
34
+ end
35
+ end
36
+
4
37
  class << self
5
- attr_accessor :maker, :perspective
38
+ # The resource of an ObservationStruct is the type
39
+ # of resource it's looking at.
40
+ attr_accessor :resource
41
+
42
+ # Instanciates a new struct object (i.e., not a Struct class). The
43
+ # fields are populated from the key/value pairs from hash. If the
44
+ # structure fields correspond to a relationship, then a
45
+ # DelayedObservation object is created. It will then be the
46
+ # responsibility of the developper to continue observing the delayed
47
+ # observation or not.
6
48
  def for_hash(hash)
7
49
  vals = members.map do |k|
8
- hash[k]
50
+ rel = resource.relationship(k)
51
+ if rel
52
+ DelayedObservation.new(self, rel, hash[k])
53
+ else
54
+ hash[k]
55
+ end
9
56
  end
10
57
  self.new(*vals)
11
58
  end
12
59
  end
13
60
  end
14
61
 
15
- class ObservationMaker
16
- attr_accessor :resource, :structures
17
- def initialize(res=nil)
18
- @resource = res
19
- @structures = {}
62
+ # An Observer is an object which is responsible for creating resources
63
+ # observations.
64
+ class Observer
65
+ attr_reader :registrations, :models
66
+ def initialize(models=[])
67
+ @registrations = {}
68
+ @models = models
20
69
  end
21
70
 
22
- def structure(name=:default, &blk)
23
- @structures[name] ||= create_structure!(name, &blk)
71
+ def event(name, obj)
72
+ registrations[name].each do |blk|
73
+ blk.call(obj)
74
+ end
24
75
  end
25
76
 
26
- def create_structure!(name, &blk)
27
- persp = resource.perspective(name)
28
- raise ArgumentError.new("no such perspective: #{name} for #{resource}") unless persp
29
- st = ObservationStruct.new(*persp.fields, &blk)
30
- st.maker = self
31
- st.perspective = name
32
- st
77
+ def register(event_name,&blk)
78
+ registrations[event_name] ||= []
79
+ registrations[event_name] << blk
80
+ end
81
+
82
+ #TODO: unregister
83
+
84
+ def observe_source(source, observation_struct)
85
+ data = source.observe
86
+ hash = {}
87
+ observation_struct.members.each do |sym|
88
+ hash[sym] = data[sym.to_s]
89
+ end
90
+ obs = observation_struct.for_hash(hash)
91
+ obs._source_ = source
92
+ event(:observation, obs)
33
93
  end
34
94
  end
35
95
  end
data/lib/welo.rb CHANGED
@@ -1,9 +1,9 @@
1
1
 
2
2
  module Welo
3
- VERSION = "0.0.7"
3
+ VERSION = "0.1.0"
4
4
  AUTHORS = ['crapooze']
5
5
  WEBSITE = "http://github.com/crapooze/welo"
6
6
  LICENCE = "MIT"
7
- autoload :Resource, 'welo/base/resource'
8
- autoload :ObservationMaker, 'welo/core/observation'
7
+ require 'welo/base/resource'
8
+ require 'welo/core/observation'
9
9
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: welo
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 7
10
- version: 0.0.7
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - crapooze
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-03 00:00:00 +01:00
18
+ date: 2011-03-18 00:00:00 -04:00
19
19
  default_executable:
20
20
  dependencies: []
21
21