hangry 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/lib/hangry.rb +3 -1
  2. data/lib/hangry/data_vocabulary_recipe_parser.rb +3 -3
  3. data/lib/hangry/hrecipe_parser.rb +23 -7
  4. data/lib/hangry/parser_class_selecter.rb +3 -1
  5. data/lib/hangry/parsers/non_standard/all_recipes_parser.rb +1 -2
  6. data/lib/hangry/parsers/non_standard/eating_well_parser.rb +2 -6
  7. data/lib/hangry/parsers/non_standard/taste_of_home_parser.rb +22 -0
  8. data/lib/hangry/recipe_attribute_cleaner.rb +56 -0
  9. data/lib/hangry/recipe_parser.rb +4 -17
  10. data/lib/hangry/schema_org_recipe_parser.rb +8 -11
  11. data/lib/hangry/version.rb +1 -1
  12. data/spec/fixtures/bbc.co.uk.html +713 -0
  13. data/spec/fixtures/chow.com.html +1016 -0
  14. data/spec/fixtures/cooking.com.html +3655 -0
  15. data/spec/fixtures/cooks.com.html +623 -0
  16. data/spec/fixtures/copykat.com.html +782 -0
  17. data/spec/fixtures/food.com.html +2334 -0
  18. data/spec/fixtures/foodandwine.com.html +1667 -0
  19. data/spec/fixtures/heart.org.html +1188 -0
  20. data/spec/fixtures/pillsbury.com.html +1657 -0
  21. data/spec/fixtures/saveur.com.html +1527 -0
  22. data/spec/fixtures/tarladalal.com.html +865 -0
  23. data/spec/fixtures/taste.com.au.html +2034 -0
  24. data/spec/fixtures/tasteofhome.com.html +2527 -0
  25. data/spec/real_examples/bbc_co_uk_spec.rb +75 -0
  26. data/spec/real_examples/big_oven_spec.rb +15 -1
  27. data/spec/real_examples/chow_com_spec.rb +78 -0
  28. data/spec/real_examples/cooking_com_spec.rb +60 -0
  29. data/spec/real_examples/cooks_com_spec.rb +67 -0
  30. data/spec/real_examples/copykat_spec.rb +55 -0
  31. data/spec/real_examples/food_and_wine_spec.rb +58 -0
  32. data/spec/real_examples/food_com_spec.rb +108 -0
  33. data/spec/real_examples/heart_org_spec.rb +46 -0
  34. data/spec/real_examples/pillsbury_spec.rb +59 -0
  35. data/spec/real_examples/saveur_com_spec.rb +41 -0
  36. data/spec/real_examples/tarladalal_com_spec.rb +65 -0
  37. data/spec/real_examples/taste_com_au_spec.rb +41 -0
  38. data/spec/real_examples/taste_of_home_spec.rb +70 -0
  39. metadata +67 -13
@@ -0,0 +1,75 @@
1
+ # encoding: UTF-8
2
+ require 'hangry'
3
+
4
+ describe Hangry do
5
+
6
+ context "bbc.co.uk recipe" do
7
+ let(:html) { File.read("spec/fixtures/bbc.co.uk.html") }
8
+ subject { Hangry.parse(html) }
9
+
10
+ its(:author) { should == "Antony Worrall Thompson" }
11
+ its(:canonical_url) { should == nil }
12
+ its(:cook_time) { should == 30 }
13
+ its(:description) { should == "An authentic seafood and chicken paella that boasts some of Spain’s finest ingredients, from calasparra rice to chorizo." }
14
+ its(:ingredients) {
15
+ should == [
16
+ "170g/6oz chorizo , cut into thin slices",
17
+ "110g/4oz pancetta , cut into small dice",
18
+ "2 cloves garlic finely chopped",
19
+ "1 large Spanish onion , finely diced",
20
+ "1 red pepper, diced",
21
+ "1 tsp soft thyme leaves",
22
+ "¼ tsp dried red chilli flakes",
23
+ "570ml/1pint calasparra (Spanish short-grain) rice",
24
+ "1 tsp paprika",
25
+ "125ml/4fl oz dry white wine",
26
+ "1.2 litres/2 pints chicken stock , heated with ¼ tsp saffron strands",
27
+ "8 chicken thighs, each chopped in half and browned",
28
+ "18 small clams , cleaned",
29
+ "110g/4oz fresh or frozen peas",
30
+ "4 large tomatoes , de-seeded and diced",
31
+ "125ml/4fl oz good olive oil",
32
+ "1 head garlic , cloves separated and peeled",
33
+ "12 jumbo raw prawns , in shells",
34
+ "450g/1lb squid , cleaned and chopped into bite-sized pieces",
35
+ "5 tbsp chopped flatleaf parsley",
36
+ "Salt and freshly ground black pepper"
37
+ ]
38
+ }
39
+ its(:name) { should == "Paella" }
40
+ its(:nutrition) do
41
+ should == {
42
+ calories: nil,
43
+ cholesterol: nil,
44
+ fiber: nil,
45
+ protein: nil,
46
+ saturated_fat: nil,
47
+ sodium: nil,
48
+ sugar: nil,
49
+ total_carbohydrates: nil,
50
+ total_fat: nil,
51
+ trans_fat: nil,
52
+ unsaturated_fat: nil
53
+ }
54
+ end
55
+
56
+ its(:instructions) {
57
+ instructions = <<-EOS
58
+ Heat half the olive oil in a paella dish or heavy-based saucepan. Add the chorizo and pancetta and fry until crisp. Add the garlic, onion and pepper and heat until softened. Add the thyme, chilli flakes and calasparra rice, and stir until all the grains of rice are nicely coated and glossy. Now add the paprika and dry white wine and when it is bubbling, pour in the hot chicken stock, add the chicken thighs and cook for 5-10 minutes.
59
+ Now place the clams into the dish with the join facing down so that the edges open outwards. Sprinkle in the peas and chopped tomatoes and continue to cook gently for another 10 minutes.
60
+ Meanwhile, heat the remaining oil with the garlic cloves in a separate pan and add the prawns. Fry quickly for a minute or two then add them to the paella. Now do the same with the squid and add them to the paella too.
61
+ Scatter the chopped parsley over the paella and serve immediately.
62
+ EOS
63
+ should == instructions.strip
64
+ }
65
+
66
+ its(:prep_time) { should == 60 }
67
+ its(:published_date) { should == nil }
68
+ its(:total_time) { should == nil }
69
+ its(:yield) { should == "Serves 6-8" }
70
+
71
+ end
72
+
73
+ end
74
+
75
+
@@ -40,7 +40,21 @@ Fold over and dig in, with a nice IPA or crisp white wine!
40
40
  should == instructions.strip
41
41
  end
42
42
  its(:name) { should == "Steve's Fish Tacos" }
43
- its(:nutrition) { should == nil }
43
+ its(:nutrition) {
44
+ should == {
45
+ calories: nil,
46
+ cholesterol: nil,
47
+ fiber: nil,
48
+ protein: nil,
49
+ saturated_fat: nil,
50
+ sodium: nil,
51
+ sugar: nil,
52
+ total_carbohydrates: nil,
53
+ total_fat: nil,
54
+ trans_fat: nil,
55
+ unsaturated_fat: nil
56
+ }
57
+ }
44
58
  its(:prep_time) { should == nil }
45
59
  its(:published_date) { should == nil }
46
60
  its(:total_time) { should == 45 }
@@ -0,0 +1,78 @@
1
+ # encoding: UTF-8
2
+ require 'hangry'
3
+
4
+ describe Hangry do
5
+
6
+ context "chow.com recipe" do
7
+ let(:html) { File.read("spec/fixtures/chow.com.html") }
8
+ subject { Hangry.parse(html) }
9
+
10
+ its(:author) { should == "Amy Wisniewski" }
11
+ its(:canonical_url) { should == "http://www.chow.com/recipes/30700-strawberry-rhubarb-pie-with-sour-cream-crust" }
12
+ its(:cook_time) { should == nil }
13
+ its(:description) { should == "In this pie, sweet strawberries and tart rhubarb make a harmonious sweet-tart filling. The crust has a bit of richness from sour cream, and though rolling out pie dough can be a challenge, you can manhandle this dough a little without fear of toughening it up. Once the pie is finished baking, be sure to wait until it’s totally cooled to let the filling set, then enjoy with a scoop of ice cream. Special equipment: A 1-inch round cutter is needed to cut out the vents in the top crust of the pie. You’ll also need an instant-read thermometer and a pastry brush for this recipe." }
14
+ its(:ingredients) {
15
+ should == [
16
+ "2 1/2 cups all-purpose flour",
17
+ "2 tablespoons granulated sugar",
18
+ "1/2 teaspoon fine salt",
19
+ "1/2 cup shortening, frozen and cut into small pieces",
20
+ "10 tablespoons cold unsalted butter (1 1/4 sticks), cut into small pieces",
21
+ "1/2 cup plus 2 tablespoons sour cream",
22
+ "All-purpose flour, for dusting the work surface",
23
+ "1 1/4 cups granulated sugar",
24
+ "1/2 cup cornstarch",
25
+ "2 pounds rhubarb stalks, ends trimmed and cut into 1/2-inch pieces (about 7 cups)",
26
+ "1 pound strawberries, washed, hulled, and cut into 1/2-inch pieces (about 3 cups)",
27
+ "2 teaspoons freshly squeezed lemon juice",
28
+ "1 large egg white, beaten"
29
+ ]
30
+ }
31
+ its(:name) { should == "Strawberry-Rhubarb Pie with Sour Cream Crust Recipe" }
32
+ its(:nutrition) do
33
+ should == {
34
+ calories: nil,
35
+ cholesterol: nil,
36
+ fiber: nil,
37
+ protein: nil,
38
+ saturated_fat: nil,
39
+ sodium: nil,
40
+ sugar: nil,
41
+ total_carbohydrates: nil,
42
+ total_fat: nil,
43
+ trans_fat: nil,
44
+ unsaturated_fat: nil
45
+ }
46
+ end
47
+
48
+ its(:instructions) {
49
+ instructions = <<-EOS
50
+ For the crust:
51
+ In a large bowl, whisk together the flour, sugar, and salt. Toss the shortening and butter in the flour mixture until well coated. Using a pastry blender or 2 knives, cut the shortening and butter into the dry ingredients until reduced to pea-size pieces, about 3 to 4 minutes.
52
+ Add the sour cream and mix just until the dough comes together, being careful not to work the dough too much.
53
+ Divide the dough into 2 flat disks, one slightly larger than the other. Wrap tightly in plastic wrap and refrigerate for at least 1 hour.
54
+ For the pie:
55
+ Remove the dough from the refrigerator and set it aside at room temperature for 30 minutes.
56
+ On a lightly floured surface, roll out the slightly larger disk to about 12 inches in diameter and 1/4 inch thick. (If the dough is very crumbly, gather it into a ball and knead it a few times to make it more pliable, then roll it out.) Line a 9-inch pie plate with the dough and trim it to leave a 1-inch overhang. Set aside.
57
+ Place 1 teaspoon of the sugar in a small bowl and set it aside. Place the remaining sugar and cornstarch in a large bowl and whisk to combine. Sprinkle 2 tablespoons of the sugar-cornstarch mixture evenly over the bottom of the pie crust.
58
+ Add the rhubarb, strawberries, and lemon juice to the bowl with the remaining sugar-cornstarch mixture and stir to evenly coat the fruit. Set aside.
59
+ Roll out the remaining dough disk on a lightly floured surface to about 11 inches in diameter and 1/4 inch thick. Using a 1-inch round cutter, stamp out circles, leaving at least a 3-inch border from the edge and 1 1/2 inches of space between each circle (you should have about 12 cutouts). Set the cutout circles aside.
60
+ Stir the rhubarb-strawberry mixture to redistribute the juices. Pour it into the prepared crust, mounding it in the center, and gently pat it down. Brush the dough overhang with the egg white. Place the top crust over the fruit and trim the excess dough to a 1-inch overhang. Fold the edge of the bottom crust over the top crust and press to seal. If desired, crimp the edge, using the forefinger of one hand to push the dough between the forefinger and thumb of the other hand.
61
+ Brush the top of the pie with some of the remaining egg white. Arrange the cutout circles intermittently over the top crust (not covering the holes), and brush the cutout circles with egg white, discarding any left over. Evenly sprinkle the reserved sugar over the top of the pie. Place the pie in the freezer while the oven heats.
62
+ Heat the oven to 425°F and arrange a rack on the bottom. Place a baking sheet lined with a double layer of aluminum foil on the rack.
63
+ Place the pie on the hot baking sheet and bake for 30 minutes. Lower the temperature to 350°F and bake until the crust is brown and the fruit is bubbling, about 1 hour 40 minutes more. (The center of the filling should read 212°F on an instant-read thermometer for it to set properly.) If the crust around the edges of the pie starts to brown before the pie is done, cover the edges with aluminum foil.
64
+ Remove the pie from the oven and let it sit on the baking sheet until the fruit stops bubbling, about 5 minutes. Transfer to a wire rack to cool completely and let the filling set before slicing, at least 3 hours.
65
+ EOS
66
+ should == instructions.strip
67
+ }
68
+
69
+ its(:prep_time) { should == nil }
70
+ its(:published_date) { should == nil }
71
+ its(:total_time) { should == 420 }
72
+ its(:yield) { should == "1 (9-inch) pie, or 8 to 10 servings" }
73
+
74
+ end
75
+
76
+ end
77
+
78
+
@@ -0,0 +1,60 @@
1
+ # encoding: UTF-8
2
+ require 'hangry'
3
+
4
+ describe Hangry do
5
+
6
+ context "cooking.com recipe" do
7
+ let(:html) { File.read("spec/fixtures/cooking.com.html") }
8
+ subject { Hangry.parse(html) }
9
+
10
+ its(:author) { should == "Casual Cuisines of the World - Taverna" }
11
+ its(:canonical_url) { should == "http://www.cooking.com/Recipes-And-More/recipes/garlic-shrimp-recipe-41.aspx" }
12
+ its(:cook_time) { should == nil }
13
+ its(:description) { should == "In Spanish tavernas, these shrimp; fragrant with garlic and olive oil; are brought to the table sizzling in a little metal pan. Have plenty of bread on hand to sop up the delicious pan juices. Serve with lemon wedges, if desired." }
14
+ its(:ingredients) {
15
+ should == [
16
+ "1/4 cup olive oil",
17
+ "4 large cloves garlic , finely minced",
18
+ "1 teaspoon red pepper flakes",
19
+ "1 pound medium shrimp , peeled and deveined",
20
+ "2 tablespoons fresh lemon juice",
21
+ "2 tablespoons dry sherry",
22
+ "1 teaspoon paprika",
23
+ "Chopped fresh flat-leaf (Italian) parsley for garnish"
24
+ ]
25
+ }
26
+ its(:name) { should == "Garlic Shrimp" }
27
+ its(:nutrition) do
28
+ should == {
29
+ calories: nil,
30
+ cholesterol: nil,
31
+ fiber: nil,
32
+ protein: nil,
33
+ saturated_fat: nil,
34
+ sodium: nil,
35
+ sugar: nil,
36
+ total_carbohydrates: nil,
37
+ total_fat: nil,
38
+ trans_fat: nil,
39
+ unsaturated_fat: nil
40
+ }
41
+ end
42
+
43
+ its(:instructions) {
44
+ instructions = <<-EOS
45
+ In a saute pan over medium heat, warm the olive oil. Add the garlic and red pepper flakes and saute for 1 minute. Raise the heat to high and add the shrimp, lemon juice, sherry and paprika. Stir well, then saute, stirring briskly, until the shrimp turn pink and curl slightly, about 3 minutes. Season to taste with salt and freshly ground black pepper and sprinkle with parsley. Serve hot.
46
+ EOS
47
+ should == instructions.strip
48
+ }
49
+
50
+ its(:prep_time) { should == nil }
51
+ its(:published_date) { should == nil }
52
+ its(:total_time) { should == 10 }
53
+ its(:yield) { should == "Serves 4" }
54
+
55
+ end
56
+
57
+ end
58
+
59
+
60
+
@@ -0,0 +1,67 @@
1
+ # encoding: UTF-8
2
+ require 'hangry'
3
+
4
+ describe Hangry do
5
+
6
+ context "cooks.com recipe" do
7
+ let(:html) { File.read("spec/fixtures/cooks.com.html") }
8
+ subject { Hangry.parse(html) }
9
+
10
+ its(:author) { should == "CM" }
11
+ its(:canonical_url) { should == nil }
12
+ its(:cook_time) { should == nil }
13
+ its(:description) { should == nil }
14
+ its(:ingredients) {
15
+ should == [
16
+ "2 c. flour",
17
+ "1/2 c. powdered sugar",
18
+ "1 packet True Lemon, divided (optional)",
19
+ "1 c. butter",
20
+ "4 eggs, well beaten",
21
+ "2 c. sugar",
22
+ "1/3 c. freshly squeezed lemon juice",
23
+ "2-3 drops pure lemon oil (optional)",
24
+ "1/2 tsp. baking powder",
25
+ "1/4 c. flour",
26
+ "Grated rind of 1 lemon (optional)"
27
+ ]
28
+ }
29
+ its(:name) { should == "LEMON BARS DELUXE" }
30
+ its(:nutrition) do
31
+ should == {
32
+ calories: nil,
33
+ cholesterol: nil,
34
+ fiber: nil,
35
+ protein: nil,
36
+ saturated_fat: nil,
37
+ sodium: nil,
38
+ sugar: nil,
39
+ total_carbohydrates: nil,
40
+ total_fat: nil,
41
+ trans_fat: nil,
42
+ unsaturated_fat: nil
43
+ }
44
+ end
45
+
46
+ its(:instructions) {
47
+ instructions = <<-EOS
48
+ Mix first 3 ingredients using half of the True Lemon packet (optional). Using a pastry blender or two knives, cut in butter as you would when making pie crust until it resembles coarse crumbs.
49
+ Press crumb mixture into a 9 x 13 inch pan. Bake in a preheated 350?F oven for 15-20 minutes.
50
+ Combine the remaining ingredients (and the other half of the True Lemon packet) to make the lemon filling.
51
+ Pour over crust and bake for 25 minutes at 350?F or until lightly golden on top. Sprinkle with powdered sugar when cool.
52
+ Cut into bars.
53
+ EOS
54
+ should == instructions.strip
55
+ }
56
+
57
+ its(:prep_time) { should == nil }
58
+ its(:published_date) { should == nil }
59
+ its(:total_time) { should == nil }
60
+ its(:yield) { should == nil }
61
+
62
+ end
63
+
64
+ end
65
+
66
+
67
+
@@ -0,0 +1,55 @@
1
+ # encoding: UTF-8
2
+ require 'hangry'
3
+
4
+ describe Hangry do
5
+
6
+ context "copykat.com recipe" do
7
+ let(:html) { File.read("spec/fixtures/copykat.com.html") }
8
+ subject { Hangry.parse(html) }
9
+
10
+ its(:author) { should == "Stephanie Manley via CopyKat.com" }
11
+ its(:canonical_url) { should == "http://www.copykat.com/2013/03/13/mcdonalds-shamrock-shake/" }
12
+ its(:cook_time) { should == 10 }
13
+ its(:description) { should == "Make this McDonald's menu item any time of year." }
14
+ its(:ingredients) {
15
+ should == [
16
+ "2 cups vanilla ice cream",
17
+ "1/4 to 1/2 cup half and half",
18
+ "4 to 6 drops mint oil (mint flavored extract is ok)",
19
+ "2 to 3 drops green food coloring",
20
+ "Whipped Cream"
21
+ ]
22
+ }
23
+ its(:name) { should == "McDonald's Shamrock Shake" }
24
+ its(:nutrition) do
25
+ should == {
26
+ calories: nil,
27
+ cholesterol: nil,
28
+ fiber: nil,
29
+ protein: nil,
30
+ saturated_fat: nil,
31
+ sodium: nil,
32
+ sugar: nil,
33
+ total_carbohydrates: nil,
34
+ total_fat: nil,
35
+ trans_fat: nil,
36
+ unsaturated_fat: nil
37
+ }
38
+ end
39
+
40
+ its(:instructions) {
41
+ instructions = <<-EOS
42
+ Allow ice cream to soften for about 10 minutes so it will be easy to blend. Combine all ingredients in a blender and puree for about 30 seconds. Serve immediately. Top with whipped cream.
43
+ Note: If you want to go dye free, omit the green food coloring, it tastes just the same without the food coloring.
44
+ EOS
45
+ should == instructions.strip
46
+ }
47
+ its(:prep_time) { should == 10 }
48
+ its(:published_date) { should == nil }
49
+ its(:total_time) { should == 20 }
50
+ its(:yield) { should == "1" }
51
+
52
+ end
53
+
54
+ end
55
+
@@ -0,0 +1,58 @@
1
+ # encoding: UTF-8
2
+ require 'hangry'
3
+
4
+ describe Hangry do
5
+
6
+ context "foodandwine.com recipe" do
7
+ let(:html) { File.read("spec/fixtures/foodandwine.com.html") }
8
+ subject { Hangry.parse(html) }
9
+
10
+ its(:author) { should == "Grace Parisi" }
11
+ its(:canonical_url) { should == "http://www.foodandwine.com/recipes/honey-glazed-roasted-root-vegetables" }
12
+ its(:cook_time) { should == 25 }
13
+ its(:description) { should == "The secret to this sweet, slightly tangy dish: the touch of sherry vinegar in the glaze." }
14
+ its(:ingredients) {
15
+ should == [
16
+ "1 1/4 pounds parsnips, peeled and sliced 1/2 inch thick",
17
+ "1 1/4 pounds carrots, peeled and sliced 1/2 inch thick",
18
+ "One 1 1/4 pound celery root\u0097peeled, quartered and sliced 1/2 inch thick",
19
+ "1 1/4 pounds golden beets, peeled and sliced 1/2 inch thick",
20
+ "1/2 cup extra-virgin olive oil",
21
+ "1/2 cup honey",
22
+ "6 thyme sprigs",
23
+ "Salt and freshly ground pepper",
24
+ "2 tablespoons sherry vinegar"
25
+ ]
26
+ }
27
+ its(:name) { should == "Honey-Glazed Roasted Root Vegetables" }
28
+ its(:nutrition) do
29
+ should == {
30
+ calories: nil,
31
+ cholesterol: nil,
32
+ fiber: nil,
33
+ protein: nil,
34
+ saturated_fat: nil,
35
+ sodium: nil,
36
+ sugar: nil,
37
+ total_carbohydrates: nil,
38
+ total_fat: nil,
39
+ trans_fat: nil,
40
+ unsaturated_fat: nil
41
+ }
42
+ end
43
+
44
+ its(:instructions) {
45
+ instructions = <<-EOS
46
+ Preheat the oven to 425°. In a large bowl, toss the root vegetables with the oil, honey and thyme and season with salt and pepper. Divide between 2 large, sturdy rimmed baking sheets. Cover with foil and roast for 40 minutes, shifting the pans once, until the vegetables are tender. Remove the foil and roast for 10 minutes longer, until glazed. Return them to the bowl and stir in the vinegar then season with salt and pepper. Serve right away.
47
+ EOS
48
+ should == instructions.strip
49
+ }
50
+ its(:prep_time) { should == nil }
51
+ its(:published_date) { should == nil }
52
+ its(:total_time) { should == 90 }
53
+ its(:yield) { should == "12" }
54
+
55
+ end
56
+
57
+ end
58
+
@@ -0,0 +1,108 @@
1
+ # encoding: UTF-8
2
+ require 'hangry'
3
+
4
+ describe Hangry do
5
+
6
+ context "food.com recipe" do
7
+ let(:html) { File.read("spec/fixtures/food.com.html") }
8
+ subject { Hangry.parse(html) }
9
+
10
+ its(:author) { should == "flume027" }
11
+ its(:canonical_url) { should == "http://www.food.com/recipe/panda-express-orange-chicken-103215" }
12
+ its(:cook_time) { should == 30 }
13
+ its(:description) { should == "A copycat recipe from Panda Express. This chicken is tangy and flavorful. Give it a try! I'm sure you and your family will enjoy it." }
14
+ its(:ingredients) {
15
+ should == [
16
+ "2 lbs boneless skinless chicken, chopped into bite sized pieces",
17
+ "1 egg",
18
+ "1 1/2 teaspoons salt",
19
+ "white pepper",
20
+ "oil (for frying)",
21
+ "1/2 cup cornstarch, plus",
22
+ "1 tablespoon cornstarch",
23
+ "1/4 cup flour",
24
+ "1 tablespoon gingerroot, minced",
25
+ "1 teaspoon garlic, minced",
26
+ "1/2 teaspoon crushed hot red chili pepper",
27
+ "1/4 cup green onion, chopped",
28
+ "1 tablespoon rice wine",
29
+ "1/4 cup water",
30
+ "1/2 teaspoon sesame oil",
31
+ "1 1/2 tablespoons soy sauce",
32
+ "1 1/2 tablespoons water",
33
+ "5 tablespoons sugar",
34
+ "5 tablespoons white vinegar",
35
+ "1 orange, zest of"
36
+ ]
37
+ }
38
+ its(:name) { should == "Panda Express Orange Chicken" }
39
+ its(:nutrition) do
40
+ should == {
41
+ calories: '304.9',
42
+ cholesterol: '128.0',
43
+ fiber: '0.4',
44
+ protein: '34.4',
45
+ saturated_fat: '1.1',
46
+ sodium: '1023.8',
47
+ sugar: '10.7',
48
+ total_carbohydrates: '26.6',
49
+ total_fat: '5.1',
50
+ trans_fat: nil,
51
+ unsaturated_fat: nil
52
+ }
53
+ end
54
+
55
+ its(:instructions) {
56
+ instructions = <<-EOS
57
+ 1
58
+ Place chicken pieces in large bowl.
59
+ 2
60
+ Stir in egg, salt, pepper and 1 tablespoon oil and mix well.
61
+ 3
62
+ Stir cornstarch and flour together.
63
+ 4
64
+ Mix flour mixture and egg mixture.
65
+ 5
66
+ Add chicken pieces, stirring to coat.
67
+ 6
68
+ Heat oil for deep-frying in wok or deep-fryer to 375 degrees.
69
+ 7
70
+ Add chicken, small batches at a time, and fry 3 to 4 minutes or until golden crisp.
71
+ 8
72
+ (Do not overcook chicken).
73
+ 9
74
+ Remove chicken from oil with slotted spoon and drain on paper towels; set aside.
75
+ 10
76
+ Clean wok and heat 15 seconds over high heat.
77
+ 11
78
+ Add 1 tablespoon oil.
79
+ 12
80
+ Add ginger and garlic and stir-fry until fragrant; about 10 seconds.
81
+ 13
82
+ Add and stir-fry crushed chiles and green onions.
83
+ 14
84
+ Add rice wine and stir 3 seconds.
85
+ 15
86
+ Add Orange Sauce and bring to boil.
87
+ 16
88
+ Add cooked chicken, stirring until well mixed.
89
+ 17
90
+ Stir water into remaining 1 tablespoon cornstarch until smooth and add to chicken.
91
+ 18
92
+ Heat until sauce is thickned.
93
+ 19
94
+ Stir in sesame oil and orange zest if desired.
95
+ 20
96
+ Serve over jasmine rice.
97
+ EOS
98
+ should == instructions.strip
99
+ }
100
+ its(:prep_time) { should == 15 }
101
+ its(:published_date) { should == Date.parse("2004-11-02") }
102
+ its(:total_time) { should == 45 }
103
+ its(:yield) { should == "1 (228 g)" }
104
+
105
+ end
106
+
107
+ end
108
+