icss 0.1.3 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. data/.watchr +35 -3
  2. data/CHANGELOG.md +38 -0
  3. data/Gemfile +19 -14
  4. data/README.md +296 -0
  5. data/Rakefile +2 -6
  6. data/TODO.md +13 -0
  7. data/VERSION +1 -1
  8. data/examples/avro_examples/complicated.icss.yaml +14 -13
  9. data/examples/bnc.icss.yaml +70 -0
  10. data/examples/chronic.icss.yaml +3 -3
  11. data/examples/license.icss.yaml +7 -0
  12. data/examples/source1.icss.yaml +4 -0
  13. data/examples/source2.icss.yaml +4 -0
  14. data/examples/test_icss.yaml +67 -0
  15. data/icss.gemspec +103 -43
  16. data/lib/icss.rb +37 -15
  17. data/lib/icss/core_types.rb +19 -0
  18. data/lib/icss/error.rb +4 -0
  19. data/{init.rb → lib/icss/init.rb} +0 -0
  20. data/lib/icss/message.rb +124 -66
  21. data/lib/icss/message/message_sample.rb +144 -0
  22. data/lib/icss/protocol.rb +184 -131
  23. data/lib/icss/protocol/code_asset.rb +18 -0
  24. data/lib/icss/protocol/data_asset.rb +23 -0
  25. data/lib/icss/protocol/license.rb +41 -0
  26. data/lib/icss/protocol/source.rb +37 -0
  27. data/lib/icss/protocol/target.rb +68 -0
  28. data/lib/icss/receiver_model.rb +24 -0
  29. data/lib/icss/receiver_model/active_model_shim.rb +36 -0
  30. data/lib/icss/receiver_model/acts_as_catalog.rb +170 -0
  31. data/lib/icss/receiver_model/acts_as_hash.rb +177 -0
  32. data/lib/icss/receiver_model/acts_as_loadable.rb +47 -0
  33. data/lib/icss/receiver_model/acts_as_tuple.rb +100 -0
  34. data/lib/icss/receiver_model/locale/en.yml +27 -0
  35. data/lib/icss/receiver_model/to_geo_json.rb +19 -0
  36. data/lib/icss/receiver_model/tree_merge.rb +34 -0
  37. data/lib/icss/receiver_model/validations.rb +31 -0
  38. data/lib/icss/serialization.rb +51 -0
  39. data/lib/icss/serialization/zaml.rb +443 -0
  40. data/lib/icss/type.rb +148 -501
  41. data/lib/icss/type/base_type.rb +0 -0
  42. data/lib/icss/type/named_type.rb +184 -0
  43. data/lib/icss/type/record_field.rb +77 -0
  44. data/lib/icss/type/record_model.rb +49 -0
  45. data/lib/icss/type/record_schema.rb +54 -0
  46. data/lib/icss/type/record_type.rb +325 -0
  47. data/lib/icss/type/simple_types.rb +72 -0
  48. data/lib/icss/type/structured_schema.rb +288 -0
  49. data/lib/icss/type/type_factory.rb +144 -0
  50. data/lib/icss/type/union_schema.rb +41 -0
  51. data/lib/icss/view_helper.rb +56 -19
  52. data/notes/named_array.md +32 -0
  53. data/notes/on_include_vs_extend_etc.rb +176 -0
  54. data/notes/technical_details.md +278 -0
  55. data/spec/core_types_spec.rb +119 -0
  56. data/spec/fixtures/zaml_complex_hash.yaml +35 -0
  57. data/spec/icss_spec.rb +86 -23
  58. data/spec/message/message_sample_spec.rb +4 -0
  59. data/spec/message_spec.rb +139 -0
  60. data/spec/protocol/license_spec.rb +67 -0
  61. data/spec/protocol/protocol_catalog_spec.rb +48 -0
  62. data/spec/protocol/protocol_validations_spec.rb +176 -0
  63. data/spec/protocol/source_spec.rb +65 -0
  64. data/spec/protocol_spec.rb +91 -37
  65. data/spec/receiver_model_spec.rb +111 -0
  66. data/spec/serialization/zaml_spec.rb +81 -0
  67. data/spec/serialization/zaml_test.rb +473 -0
  68. data/spec/serialization_spec.rb +63 -0
  69. data/spec/spec_helper.rb +24 -7
  70. data/spec/support/icss_test_helper.rb +67 -0
  71. data/spec/support/load_example_protocols.rb +17 -0
  72. data/spec/type/base_type_spec.rb +0 -0
  73. data/spec/type/named_type_spec.rb +75 -0
  74. data/spec/type/record_field_spec.rb +44 -0
  75. data/spec/type/record_model_spec.rb +206 -0
  76. data/spec/type/record_schema_spec.rb +161 -0
  77. data/spec/type/record_type_spec.rb +155 -0
  78. data/spec/type/simple_types_spec.rb +121 -0
  79. data/spec/type/structured_schema_spec.rb +300 -0
  80. data/spec/type/type_catalog_spec.rb +44 -0
  81. data/spec/type/type_factory_spec.rb +93 -0
  82. data/spec/type/union_schema_spec.rb +0 -0
  83. data/spec/type_spec.rb +63 -0
  84. metadata +205 -144
  85. data/CHANGELOG.textile +0 -9
  86. data/Gemfile.lock +0 -40
  87. data/README.textile +0 -29
  88. data/lib/icss/brevity.rb +0 -136
  89. data/lib/icss/code_asset.rb +0 -16
  90. data/lib/icss/core_ext.rb +0 -9
  91. data/lib/icss/data_asset.rb +0 -22
  92. data/lib/icss/old.rb +0 -96
  93. data/lib/icss/protocol_set.rb +0 -48
  94. data/lib/icss/sample_message_call.rb +0 -142
  95. data/lib/icss/target.rb +0 -72
  96. data/lib/icss/type/factory.rb +0 -196
  97. data/lib/icss/validations.rb +0 -16
  98. data/spec/validations_spec.rb +0 -171
data/.watchr CHANGED
@@ -1,5 +1,19 @@
1
1
  # -*- ruby -*-
2
2
 
3
+ # def run_spec(pattern, subdir = '')
4
+ # subdir << '/' unless subdir == '' || subdir =~ %r{./$}
5
+ # if !(files = Dir["spec/#{subdir}**/*#{pattern}*_spec.rb"]).empty?
6
+ # rspec(files)
7
+ # end
8
+ # end
9
+
10
+ def run_with_ruby(file)
11
+ unless File.exist?(file) then puts "#{file} does not exist" ; return ; end
12
+ puts "Running #{file}"
13
+ system "ruby", file
14
+ puts
15
+ end
16
+
3
17
  def run_spec(file)
4
18
  unless File.exist?(file)
5
19
  puts "#{file} does not exist"
@@ -7,14 +21,32 @@ def run_spec(file)
7
21
  end
8
22
 
9
23
  puts "Running #{file}"
10
- system "bundle exec rspec #{file}"
24
+ # system "bundle exec rspec #{file}"
25
+ system "rspec #{file}"
11
26
  puts
12
27
  end
13
28
 
14
- watch("spec/.*/*_spec\.rb") do |match|
29
+ watch("spec/.*/.*_spec\.rb") do |match|
15
30
  run_spec match[0]
16
31
  end
17
32
 
33
+ watch("spec/.*_spec\.rb") do |match|
34
+ run_spec match[0]
35
+ end
36
+
37
+ watch("lib/icss.rb") do |match|
38
+ run_spec %{spec/icss_spec.rb}
39
+ end
40
+
18
41
  watch("lib/icss/(.*)\.rb") do |match|
19
- run_spec %{spec/#{match[1]}_spec.rb}
42
+ if match.string =~ /zaml/
43
+ run_with_ruby %{spec/#{match[1]}_test.rb}
44
+ run_spec %{spec/#{match[1]}_spec.rb}
45
+ else
46
+ run_spec %{spec/#{match[1]}_spec.rb}
47
+ end
48
+ end
49
+
50
+ watch("spec/.*_test\.rb") do |match|
51
+ run_with_ruby match[0]
20
52
  end
@@ -0,0 +1,38 @@
1
+
2
+ ## v0.2.0 mid-Aug 2011
3
+
4
+ Major rethunk.
5
+
6
+ * Type behavior is provided by
7
+ *
8
+
9
+ TODO:
10
+
11
+ * move Targets into troop (?)
12
+
13
+
14
+ #### CatalogTarget becomes small
15
+
16
+ Become protocol attributes:
17
+ * `name` -- protocol `name` (ie. the `protocol` field)
18
+ * `license` -- protocol `license`
19
+ * `title` -- alias for protocol's name
20
+ * `description` -- protocol `doc`
21
+ * `tags` -- protocol `keywords`
22
+
23
+ These stay:
24
+ * `owner`, `price`, `messages`, `packages`
25
+
26
+ These move from protocol to CatalogTarget:
27
+ * update_frequency
28
+ * namespace
29
+
30
+ ## v0.1.0 June 7 2011
31
+
32
+ * New receiver from gorillib
33
+
34
+ ## v0.0.3 May 22 2011
35
+
36
+ * used gorillib, got rid of active_support, extlib HOORAY
37
+ * moved Receiver to gorillib.
38
+ * *breaking change*. Gorillib changed the signature of receive() to be @receive(*constructor_args, hsh)@ (formerly, the hsh was first).
data/Gemfile CHANGED
@@ -1,18 +1,23 @@
1
- source "http://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
1
+ source 'http://rubygems.org'
5
2
 
6
- gem 'gorillib', "~> 0.1.1"
3
+ gem 'json'
4
+ gem 'activemodel', "~> 3.0.9"
5
+ gem 'addressable', "~> 2.2"
7
6
 
8
- gem 'activemodel', "~> 3.0.9"
7
+ gem 'configliere', "~> 0.4.8"
8
+ gem 'gorillib', "~> 0.1.7"
9
+ gem 'addressable', "~> 2.2"
9
10
 
10
- # Add dependencies to develop your gem here.
11
- # Include everything needed to run rake, tests, features, etc.
12
- group :development do
13
- gem "rspec", "~> 2.3.0"
14
- gem "yard", "~> 0.6.0"
15
- gem "bundler", "~> 1.0.0"
16
- gem "jeweler", "~> 1.5.2"
17
- gem "rcov", ">= 0"
11
+ group :development do
12
+ gem 'bundler', "~> 1"
13
+ gem 'jeweler', "~> 1.6.4"
14
+ gem 'yard', "~> 0.6.0"
15
+ gem 'rspec', "~> 2.3.0"
16
+ gem 'rcov', ">= 0"
17
+ gem 'awesome_print', "~> 0.4.0"
18
+ end
19
+
20
+ group :test do
21
+ gem 'spork', "~> 0.9.0.rc9"
22
+ gem 'watchr'
18
23
  end
@@ -0,0 +1,296 @@
1
+ # The Infochimps Stupid Schema (ICSS)
2
+
3
+ An ICSS file is a *complete*, *expressive* description of a collection of related data and all associated assets. It is based on the [Avro Protocol](http://avro.apache.org/docs/current/index.html) specification, with some necessary extensions
4
+
5
+
6
+ ___________________________________________________________________________
7
+ <a name="model" >
8
+ ## Icss::ReceiverModel -- a pragmatic, flexible framework for active structured data
9
+ ### (or: How to Be Object-Oriented in a JSON World)
10
+
11
+ Hooray:
12
+
13
+ ```ruby
14
+ class Thing
15
+ include Icss::ReceiverModel
16
+ field :name, String
17
+ field :description, String
18
+ end
19
+
20
+ class GeoCoordinates
21
+ include Icss::ReceiverModel
22
+ field :longitude, Float, :validates => { :numericality => { :>= => -180, :<= => 180 } }
23
+ field :latitude, Float, :validates => { :numericality => { :>= => -90, :<= => 90 } }
24
+ def coordinates
25
+ [ longitude, latitude ]
26
+ end
27
+ end
28
+
29
+ class Place < Thing
30
+ field :geo, GeoCoordinates
31
+ end
32
+
33
+ class MenuItem < Thing
34
+ field :price, Float, :required => true
35
+ end
36
+
37
+ class TacoTrailer < Place
38
+ field :menu, Array, :items => MenuItem
39
+ field :founding_date, Time
40
+ end
41
+
42
+ torchys = Restaurant.receive({
43
+ :name => "Torchy's Taco's",
44
+ :menu => [
45
+ { :name => "Dirty Sanchez", :price => "6.95" },
46
+ { :name => "Fried Avocado", :price => "7.35" }
47
+ ],
48
+ :founding_date => '2006-08-01T00:00:00Z',
49
+ :geo => { :longitude => 30.295, :latitude => -97.745 },
50
+ })
51
+ # #<TacoTrailer:0x00000101d539f8 @name="Torchy's Taco's",
52
+ # @geo=#<GeoCoordinates:0x00000101d53318 @latitude=-97.745, @longitude=30.295>,
53
+ # @menu=[ #<MenuItem:0x00000101d51180 @name="Dirty Sanchez", @price=6.95>,
54
+ # #<MenuItem:0x00000101d4d468 @name="Fried Avocado", @price=7.35> ]
55
+ # @founding_date=2006-08-01 00:00:00 UTC >
56
+
57
+ torchys.geo.coordinates
58
+ # [ 30.295, -97.745 ]
59
+
60
+ torchys.to_hash
61
+ # { :name => "Torchy's Taco's",
62
+ # :geo => { :longitude => 30.295, :latitude => -97.745 },
63
+ # :menu => [
64
+ # { :name => "Dirty Sanchez", :price => 3.50 },
65
+ # { :name => "Fried Avocado", :price => 2.95 } ],
66
+ # :founding_date => '2006-08-01T00:00:00Z',
67
+ # }
68
+
69
+
70
+ ```
71
+
72
+ ### declaring fields
73
+
74
+ Declaring a field constructs the following. Taking
75
+
76
+ ```ruby
77
+ field :foo, Array, :items => :int
78
+ ```
79
+
80
+ * accessors -- `#foo` and `foo=` getter/setters. These are completely regular accessors: no type checking/conversion/magic happens when the object is in regular use.
81
+ * receiver -- a `receive_foo` method that provides lightweight type coercion
82
+ * field schema -- a `RecordField` object describing the field, available through the `.fields` class method. You can send this schema over the wire (in JSON or whatever) and use it to recapitulate the type elsewhere.
83
+ * hashlike access -- retrieve a value with `object[:foo]`, or set it with `object[:foo] = 7`.
84
+
85
+ Optionally, you can decorate with
86
+
87
+ * rcvr_remaining -- a catchall field for anything `receive!`d that wasn't predicted by the schema.
88
+ * validations -- the full set of ActiveModel validations
89
+ * after_receive hooks -- including default value
90
+
91
+ ### Predictable magic
92
+
93
+ Magic *only* happens in the neighborhood of `receive` methods.
94
+ * The initializer, getter/setter, and so forth are non-magical.
95
+ * Validation is only done on request, and type conversion when `receive_foo` is invoked.
96
+ * Hashlike access is only for defined fields
97
+
98
+ ### receive methods
99
+
100
+ You can make a new ojbect using `Smurf.receive({...})`, which is exactly equivalent to calling each of `obj = Smurf.new ; obj.receive!({...}) ; obj` in turn.
101
+
102
+ ### Hashlike
103
+
104
+ * `.keys` returns a list of the *fields with set values*, in the same order as the class `.field_names`
105
+
106
+ ### validations
107
+
108
+ Add ActiveModel validations with the `:validates` option to `.field`, or directly using `.validates`:
109
+
110
+ ```ruby
111
+ class Icss::Handy
112
+ include Icss::ReceiverModel
113
+ field :rangey, Integer, :validates => { :inclusion => { :in => 0..9 }}
114
+ field :patternish, String
115
+ field :mandatory, Integer, :required => true
116
+ validates :patternish, :format => { :with => /eat$/ }
117
+ end
118
+ good_smurf = Icss::Handy.receive(:rangey => 5, :patternish => 'smurfberry crunch is fun to eat', :mandatory => 1)
119
+ bad_smurf = Icss::Handy.receive(:rangey => 3, :patternish => 'smurfnuggets!')
120
+ good_smurf.valid? # true
121
+ bad_smurf.valid? # false
122
+ bad_smurf.errors # { :mandatory => ["can't be blank"], :patternish => ["is invalid"] }
123
+ ```
124
+
125
+ As shown, you can also say `:required => true` as a shorthand for `:validates => { :presence => true }`. A summary of the other `:validates` directives:
126
+
127
+ ```ruby
128
+ :presence => true
129
+ :uniqueness => true
130
+ :numericality => true # also :==, :>, :>=, :<, :<=, :odd?, :even?, :equal_to, :less_than, etc
131
+ :length => { :< => 7 } # also :==, :>=, :<=, :is, :minimum, :maximum
132
+ :format => { :with => /.*/ }
133
+ :inclusion => { :in => [1,2,3] }
134
+ :exclusion => { :in => [1,2,3] }
135
+ ```
136
+
137
+ ### rcvr_remaining
138
+
139
+ `rcvr_remaining` creates a Hash field to catch all attributes send to `receive!` that don't match any receiver fields. This is surprisingly useful.
140
+
141
+ Note that you can feed `rcvr_remaining` a `:values` option if you want type coercion on the extra params.
142
+
143
+ ### rcvr_alias
144
+
145
+ `rcvr_alias` will redirect an attribute to a different receiver:
146
+
147
+ ```ruby
148
+ class Wheel
149
+ include Icss::ReceiverModel
150
+ field :name, String
151
+ field :center_height, Float
152
+ rcvr_alias :centre_height, :center_height
153
+ end
154
+ foo = Wheel.receive(:name => 'tyre', :centre_height => 18.2)
155
+ foo.center_height # 18.2
156
+ foo.respond_to?(:centre_height) # false
157
+ ```
158
+
159
+ Notes:
160
+
161
+ * It does not make any other methods, only a `receive_(fake)` that calls the `receive_(target)` method.
162
+ * It makes no special provisions for both attributes being received.
163
+
164
+ ### after_receive
165
+
166
+ `after_receive(:hook_name){ ... }` creates a named hook, executed at the end of `receive!` (and similar actions). Some examples:
167
+
168
+ ```ruby
169
+ after_receive(:warnings) do |hsh|
170
+ warn "Validation failed for field #{self}: #{errors.inspect}" if respond_to?(:errors) && (not valid?)
171
+ end
172
+ after_receive(:generate_id) do |hsh|
173
+ if !attr_set?(:md5id) then self.md5id = Digest::MD5.hex_digest(name) ; end
174
+ end
175
+ ```
176
+
177
+ Notes:
178
+ * Make sure your `after_receive` blocks are _idempotent_ -- that is, that re-running the block has no effect. Lots of things are allowed to trigger `run_after_receivers`.
179
+
180
+ ### field :default => val
181
+
182
+ You can use the `:default` option to `field` (or call `.set_field_default` directly) to specify a default value when the field is empty after a `receive!`.
183
+
184
+ ```ruby
185
+ class Icss::Smurf
186
+ field :tool, Symbol, :default => :smurfwrench
187
+ field :weapon, Symbol, :default => :smurfthrower
188
+ end
189
+
190
+ # default set for missing attributes
191
+ handy_smurf = Icss::Smurf.receive( :tool => :pipesmurf )
192
+ handy_smurf.weapon # :smurfthrower
193
+
194
+ # if an attribute is set-but-nil no default is applied
195
+ handy_smurf = Icss::Smurf.receive( :tool => :smurfwrench, :weapon => nil )
196
+ handy_smurf.weapon # nil
197
+
198
+ # you can also use a block; it is `instance_eval`ed for the value to set.
199
+ Icss::Smurf.field(:food, Symbol, :default =>
200
+ lambda{ (weapon.to_s =~ /^smurf/) ? :smurfed_cheese : :grilled_smurf }
201
+ brainy_smurf = Icss::Smurf.receive( :weapon => :smurfapult )
202
+ hefty_smurf = Icss::Smurf.receive( :weapon => :gatling_smurf )
203
+ brainy_smurf.food # :smurfed_cheese
204
+ hefty_smurf.food # :grilled_smurf
205
+ ```
206
+
207
+ Note:
208
+ * If a value is explicitly `nil`, the default is not applied.
209
+ * You may specify a block (as shown); the attribute is set to the result of `instance_eval`ing the block.
210
+ * Defaults do *not* applied at initialization -- only when `run_after_receivers` is triggered. (so, the `receive` operation is complete).
211
+ * The run order will be dependable on ruby >= 1.9 but not on 1.8.x.
212
+
213
+
214
+
215
+ ___________________________________________________________________________
216
+ <a name="avro" >
217
+ ## Avro Protocol, Message, RecordType and Field
218
+
219
+
220
+ avro kind ruby json example schema example
221
+ --------- --------- ------------ ------- --------- --------------
222
+ null base NilClass null nil 'null'
223
+ boolean base Boolean boolean true 'boolean'
224
+ int base Integer integer 1 'int'
225
+ long base Long integer 1 'long'
226
+ float base Float number 1.1 'float'
227
+ double base Double number 1.1 'double'
228
+ bytes base Binary string "\u00FF" 'bytes'
229
+ string base String string "foo" 'string'
230
+ time base Time string "2011-01-02T03:04:05Z" 'time'
231
+ symbol base Symbol string :belongs_to 'symbol'
232
+
233
+ array structured (ArrayOfXXX) array [1,2] { 'type': 'array', 'items': 'int' }
234
+ map structured (HashOfXXX) object { "a": 1 } { 'type': 'map', 'values': 'int' }
235
+
236
+ enum named (EnumType) string "heads" { 'type': 'enum', 'name': 'result', 'symbols': ['heads','tails'] }
237
+ fixed named (FixedType) string "\xBD\xF3)Q" { 'type': 'fixed', 'name': 'crc32', 'length': 4 }
238
+ record named (RecordType) object {"a": 1} { 'type': 'record', 'name': 'bob', 'fields':[...] }
239
+ error named (ErrorType) object {"err":halp! fire!"} { 'type': 'record', 'name': 'db_on_fire, 'fields':[...] }
240
+
241
+ union union <UnionType> object [ 'long', { 'type': 'array', 'items': 'int' } ]
242
+
243
+ st.regexp simple St::Regexp string "^hel*o newman" 'regexp'
244
+ st.url simple St::Url string "http://..." 'url'
245
+ mu.epoch_time simple Mu::EpochTime string 1312507492 'epoch_time'
246
+
247
+
248
+
249
+ #### Base (int, float, string, ...)
250
+
251
+ A `:base` type in an Icss file
252
+
253
+ Class `.receive` method is just `new` (where appropriate) with the appropriate conversion. Receiving `nil` returns `nil` without error.
254
+
255
+ Note that some of the base types are *not* present in the Avro spec.
256
+
257
+ __________________________________________________________________________
258
+ __________________________________________________________________________
259
+ __________________________________________________________________________
260
+
261
+ ___________________________________________________________________________
262
+ <a name="protocol" >
263
+ ## Icss::Protocol specifics
264
+
265
+ ### Assets
266
+
267
+ Assets may include
268
+ * data assets (including their location and schema)
269
+ * code for api calls (messages) based on the the described records (including their call signature and schema)
270
+ * other referenced schema
271
+
272
+ See [icss_specification.textile](icss/blob/master/icss_specification.textile) for more.
273
+
274
+ ___________________________________________________________________________
275
+ <a name="colophon" >
276
+ ## Colophon
277
+
278
+ ### Credits
279
+
280
+ Huge thanks to Doug Cutting and the rest of the Avro maintainers.
281
+
282
+ ### Contributing to icss
283
+
284
+ * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
285
+ * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
286
+ * Fork the project
287
+ * Start a feature/bugfix branch
288
+ * Commit and push until you are happy with your contribution
289
+ * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
290
+ * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
291
+
292
+ ### Copyright
293
+
294
+ Copyright (c) 2011 Philip (flip) Kromer for Infochimps. See LICENSE.txt for
295
+ further details.
296
+
data/Rakefile CHANGED
@@ -15,14 +15,10 @@ Jeweler::Tasks.new do |gem|
15
15
  gem.name = "icss"
16
16
  gem.homepage = "http://github.com/mrflip/icss"
17
17
  gem.license = "MIT"
18
- gem.summary = %Q{Infochimps Stupid Schema library: an avro-compatible data description standard. ICSS completely describes a collection of data (and associated assets) in a way that is expressive, scalable and sufficient to drive remarkably complex downstream processes.}
19
- gem.description = %Q{Infochimps Stupid Schema library: an avro-compatible data description standard. ICSS completely describes a collection of data (and associated assets) in a way that is expressive, scalable and sufficient to drive remarkably complex downstream processes.}
18
+ gem.summary = %Q{Infochimps Simple Schema library: an avro-compatible data description standard. ICSS completely describes a collection of data (and associated assets) in a way that is expressive, scalable and sufficient to drive remarkably complex downstream processes.}
19
+ gem.description = %Q{Infochimps Simple Schema library: an avro-compatible data description standard. ICSS completely describes a collection of data (and associated assets) in a way that is expressive, scalable and sufficient to drive remarkably complex downstream processes.}
20
20
  gem.email = "coders@infochimps.com"
21
21
  gem.authors = ["Philip (flip) Kromer for Infochimps"]
22
- # Include your dependencies below. Runtime dependencies are required when using your gem,
23
- # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
- # gem.add_runtime_dependency 'jabber4r', '> 0.1'
25
- # gem.add_development_dependency 'rspec', '> 1.2.3'
26
22
  end
27
23
  Jeweler::RubygemsDotOrgTasks.new
28
24
 
data/TODO.md CHANGED
@@ -3,6 +3,11 @@
3
3
  * one ICSS <=> one Dataset <=> one Catalog Entry
4
4
 
5
5
 
6
+ geo.lake_body_of_water
7
+ geo.ocean_body_of_water
8
+ geo.river_body_of_water
9
+ geo.sea_body_of_water
10
+
6
11
  ### catalog_entry
7
12
 
8
13
  Most of it moves to top-level:
@@ -29,3 +34,11 @@ moves *to* catalog_entry:
29
34
  ___________________________________________________________________________
30
35
 
31
36
  Make the get_data part of culture/books/comics/grand_comics_db a three-liner
37
+
38
+ menu string Either the actual menu or a URL of the menu.
39
+ accepts_reservations string "Either Yes/No, or a URL at which reservations can
40
+ be made."
41
+
42
+
43
+ tile_x string | bounding_box
44
+ tile_y string | bounding_box