omnis 0.5.0 → 0.6.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.
data/README.md CHANGED
@@ -74,10 +74,95 @@ Mongo::Connection.new['bms']['bookings'].find(mongo.selector, mongo.opts)
74
74
  ```
75
75
 
76
76
  ## Transformer
77
- Transforms some data into another form of (flattened) data. Extractors can be used to get values from the data source.
77
+ Transforms some data into another form of (flattened) data. Extractors can be used to get values from the data source.
78
78
  If the first parameter of a property denotes the output field, the second is a string which is passed as argument to the extractor.
79
79
 
80
- Example:
80
+ There are different ways of getting values from a _source_ document to a _result_ document (or object), described below:
81
+
82
+ ### Extractors
83
+ The most basic and simple approach is to use an extractor, one default extractor can be configured in the body of the class.
84
+ You can build your own extractor if you want, have a look at the built-in.
85
+
86
+ The `NestedHashExtractor` extracts data from a nested Hash document by providing a xpath like expression, best shown in an example:
87
+
88
+ ```ruby
89
+ hash = {
90
+ 'ref_anixe' => '1234',
91
+ 'service': [
92
+ { 'name': 'Hotel Wroclaw'}
93
+ ]
94
+ }
95
+
96
+ xtr = Omnis::NestedHashExtractor.new
97
+ x_ref_anixe = xtr.extractor('ref_anixe')
98
+ ref_anixe = x_ref_anixe.(hash) # 1234
99
+
100
+ x_hotel_name = xtr.extractor('service.0.name')
101
+ hotel_name = x_hotel_name.(hash) # Hotel Wroclaw
102
+ ```
103
+
104
+ The `MonadicHashExtractor` uses a `Maybe` monad from the [Monadic gem](https://github.com/pzol/monadic#maybe) to safely get values from the _source_.
105
+
106
+ The good thing about this is the easy of use in a Transformer
107
+
108
+ ```ruby
109
+ class BookingTransformer
110
+ include Omnis::DataTransformer
111
+ extractor Omnis::NestedHashExtractor.new
112
+
113
+ property :ref_anixe, "ref_anixe"
114
+ property :hotel_name, "services.0.name"
115
+ end
116
+
117
+ transformer = BookingTransformer.new
118
+ result = transformer.transform(hash) # {:ref_anixe => '1234', :hotel_name => 'Hotel Wroclaw'}
119
+ ```
120
+ Easy?
121
+
122
+ ### Extraction with blocks
123
+
124
+ Instead of, or in addition to Extractors you can use blocks for the extraction
125
+
126
+ ```ruby
127
+ class BookingTransformer
128
+ include Omnis::DataTransformer
129
+
130
+ property(:ref_anixe) {|src| src['ref_anixe']}
131
+ property(:hotel_name) {|src| src['services'][0]['name']}
132
+ end
133
+
134
+ # The transformation part remains the same.
135
+ transformer = BookingTransformer.new
136
+ result = transformer.transform(hash) # {:ref_anixe => '1234', :hotel_name => 'Hotel Wroclaw'}
137
+ ```
138
+ This is for some scenarios when you need data validation or additional transformation.
139
+
140
+ ### Extraction Class Functions
141
+ The third way to achieve the same is providing a class function. If no expression (or nil) is defined as the second argument to a property and no block hash been provided, the `DataTransformer` will look for a class method to fetch the data.
142
+
143
+ ```ruby
144
+ class BookingTransformer
145
+ include Omnis::DataTransformer
146
+ extractor Omnis::NestedHashExtractor.new
147
+
148
+ property :ref_anixe
149
+ property :hotel_name
150
+
151
+ def self.ref_anixe(src)
152
+ src['ref_anixe']
153
+ end
154
+
155
+ def self.hotel_name(src)
156
+ extract(src, 'services.0.name').upcase # use the defined Extractor to get the value and modify it
157
+ end
158
+ end
159
+
160
+ # The transformation part remains the same, again.
161
+ transformer = BookingTransformer.new
162
+ result = transformer.transform(hash) # {:ref_anixe => '1234', :hotel_name => 'Hotel Wroclaw'}
163
+ ```
164
+
165
+ ### Example
81
166
  ```ruby
82
167
  class BookingTransformer
83
168
  include Omnis::DataTransformer
@@ -105,7 +190,8 @@ class BookingTransformer
105
190
  end
106
191
  ```
107
192
 
108
- Usage:
193
+ ### Usage
194
+ The most basic usage is to provide a document to the transform method
109
195
  ```ruby
110
196
  transformer = BookingTransformer.new
111
197
  transformer.transform(doc)
@@ -123,7 +209,16 @@ end
123
209
 
124
210
  If you provide a `#to_object(hash)` method in the Transformer definition, it will be used to convert the output Hash into the object of you desire.
125
211
 
212
+ The way I use it most is to get a proc and pass it directly to the `#find` method of the ruby driver:
213
+
214
+ ```ruby
215
+ transformer = BookingTransformer.new.to_proc
216
+ connection = Mongo::Connection.new
217
+ connection.db('some_db').collection('some_collection').find({}, :transformer => transformer)
218
+ ```
219
+
126
220
  ## Putting it all together
221
+ The really good stuff is using the query and the transformer together.
127
222
 
128
223
  ```ruby
129
224
  query = BookingQuery.new("ref_anixe" => "1abc", "product" => "HOT").to_mongo
@@ -131,12 +226,6 @@ transformer = BookingTransformer.new.to_proc
131
226
  collection = Mongo::Connection.new['bms']['bookings']
132
227
 
133
228
  table = collection.find(query.selector, query.opts.merge(:transformer => transformer))
134
-
135
- table = Omnis::MongoTable.new(connection, params, BookingQuery, BookingTransformer)
136
-
137
- table.call.each do |row|
138
- row.
139
- end
140
229
  ```
141
230
 
142
231
  ## Installation
@@ -63,6 +63,11 @@ module Omnis
63
63
  def extract
64
64
  self.class.params.map { |k,v| v.extract(@input_params) }.compact
65
65
  end
66
+
67
+ # a list of keys that have been requested
68
+ def keys
69
+ extract.map(&:key)
70
+ end
66
71
  end
67
72
  end
68
73
  end
@@ -1,3 +1,3 @@
1
1
  module Omnis
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
@@ -31,6 +31,10 @@ describe Omnis::Query do
31
31
  t.fetch(:ref_anixe).should == Omnis::Operators::Matches.new(:ref_anixe, "1abc")
32
32
  end
33
33
 
34
+ it "returns a list of keys that are requested" do
35
+ t = TestBookingParams.new({"ref_anixe" => "1abc"})
36
+ t.keys.should == [:ref_anixe]
37
+ end
34
38
  it "allows to extract all at once" do
35
39
  t = TestBookingParams.new({"ref_anixe" => "1abc"})
36
40
  t.extract.should == [Omnis::Operators::Matches.new(:ref_anixe, "1abc")]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omnis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-24 00:00:00.000000000 Z
12
+ date: 2012-11-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport