openmenu 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/.autotest ADDED
@@ -0,0 +1,23 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'autotest/restart'
4
+
5
+ # Autotest.add_hook :initialize do |at|
6
+ # at.extra_files << "../some/external/dependency.rb"
7
+ #
8
+ # at.libs << ":../some/external"
9
+ #
10
+ # at.add_exception 'vendor'
11
+ #
12
+ # at.add_mapping(/dependency.rb/) do |f, _|
13
+ # at.files_matching(/test_.*rb$/)
14
+ # end
15
+ #
16
+ # %w(TestA TestB).each do |klass|
17
+ # at.extra_class_map[klass] = "test/test_misc.rb"
18
+ # end
19
+ # end
20
+
21
+ # Autotest.add_hook :run_command do |at|
22
+ # system "rake build"
23
+ # end
data/.gemtest ADDED
File without changes
data/History.txt ADDED
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2011-08-02
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
data/Manifest.txt ADDED
@@ -0,0 +1,9 @@
1
+ .autotest
2
+ History.txt
3
+ Manifest.txt
4
+ README.txt
5
+ Rakefile
6
+ lib/open_menu.rb
7
+ lib/openmenu.rb
8
+ test/sample.xml
9
+ test/test_openmenu.rb
data/README.txt ADDED
@@ -0,0 +1,57 @@
1
+ = openmenu
2
+
3
+ * https://github.com/matthewcalebsmith/openmenu
4
+
5
+ == DESCRIPTION:
6
+
7
+ Openmenu is parser for OpenMenu xml files.
8
+
9
+ NOTE: This is an early release. There is some refactoring to be done, but
10
+ the interface should stay the same.
11
+
12
+
13
+ == FEATURES/PROBLEMS:
14
+
15
+ * Parses public OpenMenu XML documents.
16
+
17
+ == SYNOPSIS:
18
+
19
+ om = OpenMenu.parse(open('http://openmenu.com/menu/sample'))
20
+ om.restaurant_name # => 'My Restaurant'
21
+ om.menus.inspect # => [#<OpenMenu::Menu:0x007fdb0a1facd8 @name="Main Menu", ...>,
22
+ #<OpenMenu::Menu:0x007fdb0c027558 @name="Late Night Menu", ...]
23
+ om.menus.first.groups.first.items.first.name # => 'Coconut Shrimp'
24
+ om.menus.first.groups.first.items.first.price # => 7.95
25
+
26
+ == REQUIREMENTS:
27
+
28
+ * nokogiri-happymapper
29
+
30
+ == INSTALL:
31
+
32
+ * gem install openmenu
33
+
34
+ == LICENSE:
35
+
36
+ (The MIT License)
37
+
38
+ Copyright (c) 2011 Matt Smith
39
+
40
+ Permission is hereby granted, free of charge, to any person obtaining
41
+ a copy of this software and associated documentation files (the
42
+ 'Software'), to deal in the Software without restriction, including
43
+ without limitation the rights to use, copy, modify, merge, publish,
44
+ distribute, sublicense, and/or sell copies of the Software, and to
45
+ permit persons to whom the Software is furnished to do so, subject to
46
+ the following conditions:
47
+
48
+ The above copyright notice and this permission notice shall be
49
+ included in all copies or substantial portions of the Software.
50
+
51
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
52
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
53
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
54
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
55
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
56
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
57
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.plugin :git
7
+ Hoe.plugin :minitest
8
+
9
+ Hoe.spec 'openmenu' do
10
+ developer('Matt Smith', 'matts@nearapogee.com')
11
+ dependency('nokogiri-happymapper', '~>0.3.6')
12
+
13
+ # self.rubyforge_name = 'openmenux' # if different than 'openmenu'
14
+ end
15
+
16
+ # vim: syntax=ruby
data/lib/open_menu.rb ADDED
@@ -0,0 +1,313 @@
1
+ class OpenMenu
2
+ VERSION = '0.1.5'
3
+ include HappyMapper
4
+ tag 'omf'
5
+
6
+ attribute :uuid, String
7
+ attribute :date_created, String
8
+ attribute :accuracy, Integer
9
+
10
+ element :version, Float, :deep => true
11
+
12
+ element :restaurant_name, String, :deep => true
13
+ element :brief_description, String, :deep => true
14
+ element :full_description, String, :deep => true
15
+ element :business_type, String, :deep => true
16
+ element :location_id, String, :deep => true
17
+ element :longitude, String, :deep => true
18
+ element :latitude, String, :deep => true
19
+ element :utc_offset, Float, :deep => true
20
+ element :address_1, String, :deep => true
21
+ element :address_2, String, :deep => true
22
+ element :city, String, :tag => 'city_town', :deep => true
23
+ alias_method :town, :city
24
+ element :state, String, :tag => 'state_province', :deep => true
25
+ alias_method :province, :state
26
+ element :postal_code, String, :deep => true
27
+ element :country, String, :deep => true
28
+
29
+ class RegionArea
30
+ include HappyMapper
31
+
32
+ attribute :name, String
33
+ attribute :designation, String
34
+ end
35
+ element :region_area, RegionArea
36
+
37
+ element :phone, String, :deep => true
38
+ element :fax, String, :deep => true
39
+ element :website, String, :tag => 'website_url', :deep => true
40
+ element :url, String, :tag => 'omf_file_url', :deep => true
41
+
42
+ class Logo
43
+ include HappyMapper
44
+ tag 'logo_url'
45
+
46
+ attribute :type, String
47
+ attribute :media, String
48
+ attribute :height, Integer
49
+ attribute :width, Integer
50
+
51
+ text_node :url, String
52
+ end
53
+ has_many :logos, Logo, :xpath => '//logo_urls'
54
+
55
+ # environment
56
+ element :seating_quantity, Integer, :tag => 'seating_qty', :deep => true
57
+ element :max_group_size, Integer, :deep => true
58
+ element :smoking_allowed, String, :deep => true
59
+ element :takeout_available, String, :deep => true
60
+ element :delivery_available, String, :deep => true
61
+
62
+ class Delivery
63
+ include HappyMapper
64
+ tag 'delivery_available'
65
+
66
+ attribute :radius, Float
67
+ attribute :fee, Float
68
+ end
69
+ has_one :delivery, Delivery
70
+
71
+ element :catering_available, String, :deep => true
72
+ element :reservations, String, :deep => true
73
+ element :music_type, String, :deep => true
74
+ element :alcohol_type, String, :deep => true
75
+ element :pets_allowed, String, :deep => true
76
+ element :age_level_preference, String, :deep => true
77
+ element :wheelchair_accessible, String, :deep => true
78
+ element :dress_code, String, :deep => true
79
+ element :cuisine_type_primary, String, :deep => true
80
+ element :cuisine_type_secondary, String, :deep => true
81
+ has_many :seating_locations, String, :tag => 'seating_location', :deep => true
82
+ has_many :accepted_currencies, String, :tag => 'accepted_currency', :deep => true
83
+
84
+ class Contact
85
+ include HappyMapper
86
+ tag 'contact'
87
+
88
+ attribute :type, String
89
+
90
+ element :first_name, String
91
+ element :last_name, String
92
+ element :email, String
93
+ end
94
+ has_many :contacts, Contact, :xpath => '//contacts'
95
+
96
+ class ParentCompany
97
+ include HappyMapper
98
+ tag 'parent_company'
99
+
100
+ element :name, String, :tag => 'parent_company_name'
101
+ element :website, String, :tag => 'parent_company_website'
102
+ element :address_1, String
103
+ element :address_2, String
104
+ element :city, String, :tag => 'city_town'
105
+ alias_method :town, :city
106
+ element :state, String, :tag => 'state_province'
107
+ alias_method :province, :state
108
+ element :postal_code, String
109
+ element :country, String
110
+ element :phone, String
111
+ element :fax, String
112
+ end
113
+ has_one :parent_company, ParentCompany
114
+
115
+ class OperatingDay
116
+ include HappyMapper
117
+ tag 'operating_day'
118
+
119
+ element :day_of_week, Integer
120
+ element :open_time, String
121
+ element :close_time, String
122
+ end
123
+ has_many :operating_days, OperatingDay, :xpath => '//operating_days'
124
+
125
+ class Parking
126
+ include HappyMapper
127
+ tag 'parking'
128
+
129
+ %w(street_free street_metered private_lot garage valet).each do |type|
130
+ attribute type.to_s, String
131
+ end
132
+ end
133
+ element :parking, Parking
134
+
135
+ class OnlineReservation
136
+ include HappyMapper
137
+ tag 'online_reservation'
138
+
139
+ attribute :type, String
140
+
141
+ element :name, String, :tag => 'online_reservation_name'
142
+ element :url, String, :tag => 'online_reservation_url'
143
+ end
144
+ has_many :online_reservations, OnlineReservation, :xpath => '//online_reservations'
145
+ def online_reservations?
146
+ online_reservations.size > 0
147
+ end
148
+
149
+ class OnlineOrder
150
+ include HappyMapper
151
+ tag 'online_order'
152
+
153
+ attribute :type, String
154
+
155
+ element :name, String, :tag => 'online_order_name'
156
+ element :url, String, :tag => 'online_order_url'
157
+ end
158
+ has_many :online_orders, OnlineOrder, :xpath => '//online_ordering'
159
+ def online_orders?
160
+ online_orders.size > 0
161
+ end
162
+
163
+ class Crosswalk
164
+ include HappyMapper
165
+ tag 'crosswalk'
166
+
167
+ element :id, String, :tag => 'crosswalk_id'
168
+ element :company, String, :tag => 'crosswalk_company'
169
+ element :url, String, :tag => 'crosswalk_url'
170
+ end
171
+ has_many :crosswalks, OpenMenu::Crosswalk, :xpath => './crosswalks'
172
+
173
+ class Menu
174
+ include HappyMapper
175
+ tag 'menu'
176
+
177
+ attribute :name, String
178
+ attribute :uid, Integer
179
+ attribute :currency, String, :tag => 'currency_symbol'
180
+ attribute :disabled, String
181
+
182
+ element :description, String, :tag => "menu_description"
183
+
184
+ def disabled?
185
+ disabled == 'disabled'
186
+ end
187
+
188
+ class Duration
189
+ include HappyMapper
190
+ tag 'menu_duration'
191
+
192
+ element :name, String, :tag => 'menu_duration_name'
193
+ element :start, String, :tag => 'menu_duration_time_start'
194
+ element :end, String, :tag => 'menu_duration_time_end'
195
+ end
196
+ has_one :duration, Duration
197
+
198
+ class Group
199
+ include HappyMapper
200
+ tag 'menu_group'
201
+
202
+ attribute :name, String
203
+ attribute :uid, Integer
204
+ attribute :disabled, String
205
+ def disabled?
206
+ disabled == 'disabled'
207
+ end
208
+
209
+ class Option
210
+ include HappyMapper
211
+ tag 'menu_group_option'
212
+
213
+ attribute :name, String
214
+ attribute :min_selected, Integer
215
+ attribute :max_selected, Integer
216
+
217
+ element :information, String, :tag => 'menu_group_option_information'
218
+
219
+ class Item
220
+ include HappyMapper
221
+ tag 'menu_group_option_item'
222
+
223
+ element :name, String, :tag => 'menu_group_option_name'
224
+ element :additional_cost, Float, :tag => 'menu_group_option_additional_cost'
225
+ end
226
+ has_many :items, Item
227
+
228
+ end # OpenMenu::Menu::Group::Option
229
+ has_many :options, Option
230
+
231
+ class Item
232
+ include HappyMapper
233
+ tag 'menu_item'
234
+
235
+ attribute :uid, Integer
236
+ %w(disabled special vegetarian vegan kosher halal).each do |attr|
237
+ attribute attr.to_s, String
238
+ define_method("#{attr}?".to_s) { self.send(attr) == attr }
239
+ end
240
+
241
+ element :name, String, :tag => 'menu_item_name'
242
+ element :description, String, :tag => 'menu_item_description'
243
+ element :price, Float, :tag => 'menu_item_price'
244
+ element :calories, Integer, :tag => 'menu_item_calories'
245
+ element :heat_index, Integer, :tag => 'menu_item_heat_index'
246
+
247
+ class Allergy
248
+ include HappyMapper
249
+ tag 'menu_item_allergy_information'
250
+
251
+ attribute :allergens, String
252
+ text_node :information, String
253
+ end # OpenMenu::Menu::Group::Item::Allergy
254
+ has_one :allergy, Allergy
255
+
256
+ class Image
257
+ include HappyMapper
258
+ tag 'menu_item_image_url'
259
+
260
+ attribute :width, Integer
261
+ attribute :height, Integer
262
+ attribute :type, String
263
+ attribute :media, String
264
+
265
+ text_node :url, String
266
+ end # OpenMenu::Menu::Group::Item::Image
267
+ has_many :images, Image
268
+
269
+ class Size
270
+ include HappyMapper
271
+ tag 'menu_item_size'
272
+
273
+ element :name, String, :tag => 'menu_item_size_name'
274
+ element :description, String, :tag => 'menu_item_size_description'
275
+ element :price, Float, :tag => 'menu_item_size_price'
276
+ element :calories, Integer, :tag => 'menu_item_size_calories'
277
+ end
278
+ has_many :sizes, Size
279
+
280
+ class Option
281
+ include HappyMapper
282
+ tag 'menu_item_option'
283
+
284
+ attribute :name, String
285
+ attribute :min_selected, Integer
286
+ attribute :max_selected, Integer
287
+
288
+ element :information, String, :tag => 'menu_item_option_information'
289
+
290
+ class Item
291
+ include HappyMapper
292
+ tag 'menu_item_option_item'
293
+
294
+ element :name, String, :tag => 'menu_item_option_name'
295
+ element :additional_cost, Float, :tag => 'menu_item_option_additional_cost'
296
+ end # OpenMenu::Menu::Group::Item::Option::Item
297
+ has_many :items, Item
298
+
299
+ end # OpenMenu::Menu::Group::Item::Option
300
+ has_many :options, Option
301
+
302
+ has_many :tags, String, :tag => 'menu_item_tag', :deep => true
303
+
304
+ end # OpenMenu::Menu::Group::Item
305
+ has_many :items, Item
306
+
307
+ end # OpenMenu::Menu::Group
308
+ has_many :groups, Group
309
+
310
+ end # OpenMenu::Menu
311
+ has_many :menus, Menu, :xpath => '//menus'
312
+
313
+ end # OpenMenu
data/lib/openmenu.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'happymapper'
2
+
3
+ require 'open_menu'
4
+ Dir.glob(File.dirname(__FILE__) + '/openmenu/*.rb') { |file| require file }
data/test/sample.xml ADDED
@@ -0,0 +1,293 @@
1
+ <?xml version="1.0" encoding="UTF-8" ?>
2
+ <omf uuid="sample" date_created="2011-08-19" accuracy="1">
3
+ <openmenu>
4
+ <version>1.5</version>
5
+ <crosswalks>
6
+ </crosswalks>
7
+ </openmenu>
8
+ <restaurant_info>
9
+ <restaurant_name>My Restaurant</restaurant_name>
10
+ <business_type>independent</business_type>
11
+ <brief_description>Sample restaurant in the OpenMenu Format standard</brief_description>
12
+ <full_description>Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vestibulum ac libero neque, quis laoreet dolor. Proin vitae erat lacus.
13
+
14
+ Aliquam sed lectus ligula, sed pharetra tortor. Nam rutrum ipsum ut quam vestibulum vestibulum. Ut posuere rhoncus quam, id semper ligula bibendum quis. Vestibulum accumsan, neque id tristique accumsan, risus diam vehicula massa, at facilisis ligula tortor et elit. Nulla facilisi. Mauris ultrices volutpat lorem eu convallis. </full_description>
15
+ <location_id>x123z</location_id>
16
+ <longitude>-81.039833</longitude>
17
+ <latitude>33.999458</latitude>
18
+ <utc_offset>-5.00</utc_offset>
19
+ <address_1>803 Gervais Street</address_1>
20
+ <address_2></address_2>
21
+ <city_town>Columbia</city_town>
22
+ <state_province>SC</state_province>
23
+ <postal_code>29202</postal_code>
24
+ <country>US</country>
25
+ <region_area></region_area>
26
+ <phone>(555) 555-5555</phone>
27
+ <fax>(555) 888-8888</fax>
28
+ <website_url>http://openmenu.com/</website_url>
29
+ <omf_file_url>http://openmenu.com/menu/sample</omf_file_url>
30
+ <logo_urls>
31
+ <logo_url type="Thumbnail" media="All">http://openmenu.com/images/ico-32-openmenu.png</logo_url>
32
+ <logo_url type="Full" media="All">http://openmenu.com/images/sample_logo_full.png</logo_url>
33
+ </logo_urls>
34
+ <environment>
35
+ <seating_qty></seating_qty>
36
+ <max_group_size>12</max_group_size>
37
+ <age_level_preference></age_level_preference>
38
+ <smoking_allowed>0</smoking_allowed>
39
+ <takeout_available>1</takeout_available>
40
+ <delivery_available radius="" fee=""></delivery_available>
41
+ <catering_available></catering_available>
42
+ <reservations></reservations>
43
+ <alcohol_type></alcohol_type>
44
+ <music_type></music_type>
45
+ <pets_allowed>0</pets_allowed>
46
+ <wheelchair_accessible></wheelchair_accessible>
47
+ <dress_code>casual</dress_code>
48
+ <cuisine_type_primary>Steakhouse</cuisine_type_primary>
49
+ <cuisine_type_secondary></cuisine_type_secondary>
50
+ <seating_locations>
51
+ <seating_location>outdoor</seating_location>
52
+ <seating_location>indoor</seating_location>
53
+ </seating_locations>
54
+ <accepted_currencies>
55
+ <accepted_currency>USD</accepted_currency>
56
+ </accepted_currencies>
57
+ <online_reservations>
58
+ </online_reservations>
59
+ <online_ordering>
60
+ </online_ordering>
61
+ <operating_days>
62
+ <operating_day>
63
+ <day_of_week>1</day_of_week>
64
+ <open_time>11:00</open_time>
65
+ <close_time>22:00</close_time>
66
+ </operating_day>
67
+ <operating_day>
68
+ <day_of_week>2</day_of_week>
69
+ <open_time>11:00</open_time>
70
+ <close_time>22:00</close_time>
71
+ </operating_day>
72
+ <operating_day>
73
+ <day_of_week>3</day_of_week>
74
+ <open_time>11:00</open_time>
75
+ <close_time>22:00</close_time>
76
+ </operating_day>
77
+ <operating_day>
78
+ <day_of_week>4</day_of_week>
79
+ <open_time>11:00</open_time>
80
+ <close_time>22:00</close_time>
81
+ </operating_day>
82
+ <operating_day>
83
+ <day_of_week>5</day_of_week>
84
+ <open_time>11:00</open_time>
85
+ <close_time>22:00</close_time>
86
+ </operating_day>
87
+ <operating_day>
88
+ <day_of_week>6</day_of_week>
89
+ <open_time>11:00</open_time>
90
+ <close_time>22:00</close_time>
91
+ </operating_day>
92
+ <operating_day>
93
+ <day_of_week>7</day_of_week>
94
+ <open_time></open_time>
95
+ <close_time></close_time>
96
+ </operating_day>
97
+ </operating_days>
98
+ <parking></parking>
99
+ </environment>
100
+ <contacts>
101
+ <contact type="primary">
102
+ <first_name>Chris</first_name>
103
+ <last_name>Hanscom</last_name>
104
+ <email>menu@openmenu.com</email>
105
+ </contact>
106
+ </contacts>
107
+ <parent_company>
108
+ <parent_company_name></parent_company_name>
109
+ <parent_company_website></parent_company_website>
110
+ <address_1></address_1>
111
+ <address_2></address_2>
112
+ <city_town></city_town>
113
+ <state_province></state_province>
114
+ <postal_code></postal_code>
115
+ <country></country>
116
+ <phone></phone>
117
+ <fax></fax>
118
+ </parent_company>
119
+ </restaurant_info>
120
+ <menus>
121
+ <menu name="Main Menu" currency_symbol="USD" uid="25">
122
+ <menu_description></menu_description>
123
+ <menu_duration>
124
+ <menu_duration_name>lunch-dinner</menu_duration_name>
125
+ <menu_duration_time_start>11:00</menu_duration_time_start>
126
+ <menu_duration_time_end>22:00</menu_duration_time_end>
127
+ </menu_duration>
128
+ <menu_groups>
129
+ <menu_group name="Appetizers" uid="2">
130
+ <menu_group_description></menu_group_description>
131
+ <menu_items>
132
+ <menu_item>
133
+ <menu_item_name>Coconut Shrimp</menu_item_name>
134
+ <menu_item_description>Crispy Coconut Shrimp &amp; tangy mango lime sauce</menu_item_description>
135
+ <menu_item_price>7.95</menu_item_price>
136
+ <menu_item_calories>350</menu_item_calories>
137
+ <menu_item_image_urls>
138
+ <menu_item_image_url width="" height="" type="Thumbnail" media="Web">http://openmenu.com/images/coconut_shrimp.jpg</menu_item_image_url>
139
+ </menu_item_image_urls>
140
+ </menu_item>
141
+ <menu_item>
142
+ <menu_item_name>Tempura Onion Rings</menu_item_name>
143
+ <menu_item_description>With a honey Thai sauce</menu_item_description>
144
+ <menu_item_price>7.95</menu_item_price>
145
+ <menu_item_heat_index>1</menu_item_heat_index>
146
+ </menu_item>
147
+ <menu_item special="special">
148
+ <menu_item_name>Calamari</menu_item_name>
149
+ <menu_item_description>Our calamari is lightly fried and tossed with a sweet and spicy Asian mango sauce.</menu_item_description>
150
+ <menu_item_price></menu_item_price>
151
+ <menu_item_heat_index>2</menu_item_heat_index>
152
+ <menu_item_sizes>
153
+ <menu_item_size>
154
+ <menu_item_size_name>small</menu_item_size_name>
155
+ <menu_item_size_description></menu_item_size_description>
156
+ <menu_item_size_price>6.95</menu_item_size_price>
157
+ </menu_item_size>
158
+ <menu_item_size>
159
+ <menu_item_size_name>large</menu_item_size_name>
160
+ <menu_item_size_description></menu_item_size_description>
161
+ <menu_item_size_price>8.95</menu_item_size_price>
162
+ </menu_item_size>
163
+ </menu_item_sizes>
164
+ </menu_item>
165
+ </menu_items>
166
+ </menu_group>
167
+ <menu_group name="Salads" uid="3">
168
+ <menu_group_description></menu_group_description>
169
+ <menu_group_options>
170
+ <menu_group_option name="Dressings">
171
+ <menu_group_option_information></menu_group_option_information>
172
+ <menu_group_option_item>
173
+ <menu_group_option_name>Italian</menu_group_option_name>
174
+ <menu_group_option_additional_cost>1.00</menu_group_option_additional_cost>
175
+ </menu_group_option_item>
176
+ <menu_group_option_item>
177
+ <menu_group_option_name>French</menu_group_option_name>
178
+ <menu_group_option_additional_cost>1.25</menu_group_option_additional_cost>
179
+ </menu_group_option_item>
180
+ <menu_group_option_item>
181
+ <menu_group_option_name>Thousand Island</menu_group_option_name>
182
+ <menu_group_option_additional_cost>1.00</menu_group_option_additional_cost>
183
+ </menu_group_option_item>
184
+ </menu_group_option>
185
+ </menu_group_options>
186
+ <menu_items>
187
+ <menu_item>
188
+ <menu_item_name>Chef Salad</menu_item_name>
189
+ <menu_item_description>Best chef salad in a 20 mile radius</menu_item_description>
190
+ <menu_item_price></menu_item_price>
191
+ <menu_item_sizes>
192
+ <menu_item_size>
193
+ <menu_item_size_name>half</menu_item_size_name>
194
+ <menu_item_size_description></menu_item_size_description>
195
+ <menu_item_size_price>6.95</menu_item_size_price>
196
+ </menu_item_size>
197
+ <menu_item_size>
198
+ <menu_item_size_name>full</menu_item_size_name>
199
+ <menu_item_size_description></menu_item_size_description>
200
+ <menu_item_size_price>8.95</menu_item_size_price>
201
+ </menu_item_size>
202
+ </menu_item_sizes>
203
+ </menu_item>
204
+ <menu_item special="special">
205
+ <menu_item_name>Cobb Salad</menu_item_name>
206
+ <menu_item_description>Iceberg lettuce topped with turkey, ham, hard cooked eggs, avocado, diced tomatoes, bacon, bleu cheese crumbles and black olives</menu_item_description>
207
+ <menu_item_price></menu_item_price>
208
+ <menu_item_sizes>
209
+ <menu_item_size>
210
+ <menu_item_size_name>half</menu_item_size_name>
211
+ <menu_item_size_description></menu_item_size_description>
212
+ <menu_item_size_price>6.95</menu_item_size_price>
213
+ </menu_item_size>
214
+ <menu_item_size>
215
+ <menu_item_size_name>full</menu_item_size_name>
216
+ <menu_item_size_description></menu_item_size_description>
217
+ <menu_item_size_price>8.95</menu_item_size_price>
218
+ </menu_item_size>
219
+ </menu_item_sizes>
220
+ </menu_item>
221
+ <menu_item>
222
+ <menu_item_name>Ceasar Salad</menu_item_name>
223
+ <menu_item_description>Fresh romain lettuce with aged parmesan reggiano</menu_item_description>
224
+ <menu_item_price>9.95</menu_item_price>
225
+ </menu_item>
226
+ <menu_item vegetarian="vegetarian">
227
+ <menu_item_name>Garden Salad</menu_item_name>
228
+ <menu_item_description>Filled with lettuce, tomatoes, carrots, radishes, cucumbers and shredded cheese</menu_item_description>
229
+ <menu_item_price>8.95</menu_item_price>
230
+ </menu_item>
231
+ </menu_items>
232
+ </menu_group>
233
+ <menu_group name="Entrees" uid="1">
234
+ <menu_group_description></menu_group_description>
235
+ <menu_items>
236
+ <menu_item uid="1">
237
+ <menu_item_name>Rack of Lamb</menu_item_name>
238
+ <menu_item_description>Coffee Citrus Crusted Lamb </menu_item_description>
239
+ <menu_item_price>22.95</menu_item_price>
240
+ </menu_item>
241
+ <menu_item uid="2">
242
+ <menu_item_name>Soft Shell Crabs</menu_item_name>
243
+ <menu_item_description>Almond encrusted, seasoned and sauteed in butter to a crispy brown</menu_item_description>
244
+ <menu_item_price>19.95</menu_item_price>
245
+ <menu_item_allergy_information allergens="shellfish, nuts">Reference allergens for allergy information</menu_item_allergy_information>
246
+ </menu_item>
247
+ <menu_item uid="3" special="special">
248
+ <menu_item_name>Cioppino</menu_item_name>
249
+ <menu_item_description>Fresh fish, scallops, mussels, calamari, and shrimp in a tomato-garlic saffron broth over linguini</menu_item_description>
250
+ <menu_item_price>24.95</menu_item_price>
251
+ </menu_item>
252
+ </menu_items>
253
+ </menu_group>
254
+ </menu_groups>
255
+ </menu>
256
+ <menu name="Late Night Menu" currency_symbol="USD" uid="35">
257
+ <menu_description></menu_description>
258
+ <menu_duration>
259
+ <menu_duration_name>late-night</menu_duration_name>
260
+ <menu_duration_time_start>20:00</menu_duration_time_start>
261
+ <menu_duration_time_end>23:00</menu_duration_time_end>
262
+ </menu_duration>
263
+ <menu_groups>
264
+ <menu_group name="Bar Food" uid="1">
265
+ <menu_group_description></menu_group_description>
266
+ <menu_items>
267
+ <menu_item>
268
+ <menu_item_name>Cheese Sticks</menu_item_name>
269
+ <menu_item_description>Cheese sticks with marinara sauce</menu_item_description>
270
+ <menu_item_price>6.95</menu_item_price>
271
+ </menu_item>
272
+ <menu_item>
273
+ <menu_item_name>Coconut Shrimp</menu_item_name>
274
+ <menu_item_description>Crispy Coconut Shrimp</menu_item_description>
275
+ <menu_item_price>7.95</menu_item_price>
276
+ <menu_item_calories>350</menu_item_calories>
277
+ </menu_item>
278
+ <menu_item>
279
+ <menu_item_name>Tempura Onion Rings</menu_item_name>
280
+ <menu_item_description>With a honey Thai sauce</menu_item_description>
281
+ <menu_item_price>7.95</menu_item_price>
282
+ </menu_item>
283
+ <menu_item>
284
+ <menu_item_name>Calamari</menu_item_name>
285
+ <menu_item_description>Our calamari is lightly fried and tossed with a sweet and spicy Asian mango sauce.</menu_item_description>
286
+ <menu_item_price>8.85</menu_item_price>
287
+ </menu_item>
288
+ </menu_items>
289
+ </menu_group>
290
+ </menu_groups>
291
+ </menu>
292
+ </menus>
293
+ </omf>