icss 0.1.3 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.watchr +35 -3
- data/CHANGELOG.md +38 -0
- data/Gemfile +19 -14
- data/README.md +296 -0
- data/Rakefile +2 -6
- data/TODO.md +13 -0
- data/VERSION +1 -1
- data/examples/avro_examples/complicated.icss.yaml +14 -13
- data/examples/bnc.icss.yaml +70 -0
- data/examples/chronic.icss.yaml +3 -3
- data/examples/license.icss.yaml +7 -0
- data/examples/source1.icss.yaml +4 -0
- data/examples/source2.icss.yaml +4 -0
- data/examples/test_icss.yaml +67 -0
- data/icss.gemspec +103 -43
- data/lib/icss.rb +37 -15
- data/lib/icss/core_types.rb +19 -0
- data/lib/icss/error.rb +4 -0
- data/{init.rb → lib/icss/init.rb} +0 -0
- data/lib/icss/message.rb +124 -66
- data/lib/icss/message/message_sample.rb +144 -0
- data/lib/icss/protocol.rb +184 -131
- data/lib/icss/protocol/code_asset.rb +18 -0
- data/lib/icss/protocol/data_asset.rb +23 -0
- data/lib/icss/protocol/license.rb +41 -0
- data/lib/icss/protocol/source.rb +37 -0
- data/lib/icss/protocol/target.rb +68 -0
- data/lib/icss/receiver_model.rb +24 -0
- data/lib/icss/receiver_model/active_model_shim.rb +36 -0
- data/lib/icss/receiver_model/acts_as_catalog.rb +170 -0
- data/lib/icss/receiver_model/acts_as_hash.rb +177 -0
- data/lib/icss/receiver_model/acts_as_loadable.rb +47 -0
- data/lib/icss/receiver_model/acts_as_tuple.rb +100 -0
- data/lib/icss/receiver_model/locale/en.yml +27 -0
- data/lib/icss/receiver_model/to_geo_json.rb +19 -0
- data/lib/icss/receiver_model/tree_merge.rb +34 -0
- data/lib/icss/receiver_model/validations.rb +31 -0
- data/lib/icss/serialization.rb +51 -0
- data/lib/icss/serialization/zaml.rb +443 -0
- data/lib/icss/type.rb +148 -501
- data/lib/icss/type/base_type.rb +0 -0
- data/lib/icss/type/named_type.rb +184 -0
- data/lib/icss/type/record_field.rb +77 -0
- data/lib/icss/type/record_model.rb +49 -0
- data/lib/icss/type/record_schema.rb +54 -0
- data/lib/icss/type/record_type.rb +325 -0
- data/lib/icss/type/simple_types.rb +72 -0
- data/lib/icss/type/structured_schema.rb +288 -0
- data/lib/icss/type/type_factory.rb +144 -0
- data/lib/icss/type/union_schema.rb +41 -0
- data/lib/icss/view_helper.rb +56 -19
- data/notes/named_array.md +32 -0
- data/notes/on_include_vs_extend_etc.rb +176 -0
- data/notes/technical_details.md +278 -0
- data/spec/core_types_spec.rb +119 -0
- data/spec/fixtures/zaml_complex_hash.yaml +35 -0
- data/spec/icss_spec.rb +86 -23
- data/spec/message/message_sample_spec.rb +4 -0
- data/spec/message_spec.rb +139 -0
- data/spec/protocol/license_spec.rb +67 -0
- data/spec/protocol/protocol_catalog_spec.rb +48 -0
- data/spec/protocol/protocol_validations_spec.rb +176 -0
- data/spec/protocol/source_spec.rb +65 -0
- data/spec/protocol_spec.rb +91 -37
- data/spec/receiver_model_spec.rb +111 -0
- data/spec/serialization/zaml_spec.rb +81 -0
- data/spec/serialization/zaml_test.rb +473 -0
- data/spec/serialization_spec.rb +63 -0
- data/spec/spec_helper.rb +24 -7
- data/spec/support/icss_test_helper.rb +67 -0
- data/spec/support/load_example_protocols.rb +17 -0
- data/spec/type/base_type_spec.rb +0 -0
- data/spec/type/named_type_spec.rb +75 -0
- data/spec/type/record_field_spec.rb +44 -0
- data/spec/type/record_model_spec.rb +206 -0
- data/spec/type/record_schema_spec.rb +161 -0
- data/spec/type/record_type_spec.rb +155 -0
- data/spec/type/simple_types_spec.rb +121 -0
- data/spec/type/structured_schema_spec.rb +300 -0
- data/spec/type/type_catalog_spec.rb +44 -0
- data/spec/type/type_factory_spec.rb +93 -0
- data/spec/type/union_schema_spec.rb +0 -0
- data/spec/type_spec.rb +63 -0
- metadata +205 -144
- data/CHANGELOG.textile +0 -9
- data/Gemfile.lock +0 -40
- data/README.textile +0 -29
- data/lib/icss/brevity.rb +0 -136
- data/lib/icss/code_asset.rb +0 -16
- data/lib/icss/core_ext.rb +0 -9
- data/lib/icss/data_asset.rb +0 -22
- data/lib/icss/old.rb +0 -96
- data/lib/icss/protocol_set.rb +0 -48
- data/lib/icss/sample_message_call.rb +0 -142
- data/lib/icss/target.rb +0 -72
- data/lib/icss/type/factory.rb +0 -196
- data/lib/icss/validations.rb +0 -16
- 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
|
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
|
-
|
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
|
data/CHANGELOG.md
ADDED
@@ -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
|
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
|
3
|
+
gem 'json'
|
4
|
+
gem 'activemodel', "~> 3.0.9"
|
5
|
+
gem 'addressable', "~> 2.2"
|
7
6
|
|
8
|
-
gem
|
7
|
+
gem 'configliere', "~> 0.4.8"
|
8
|
+
gem 'gorillib', "~> 0.1.7"
|
9
|
+
gem 'addressable', "~> 2.2"
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
gem
|
14
|
-
gem
|
15
|
-
gem
|
16
|
-
gem
|
17
|
-
|
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
|
data/README.md
ADDED
@@ -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
|
19
|
-
gem.description = %Q{Infochimps
|
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
|