2.7. Changing food traits

Pantry would not be very useful if you could only search the master for its contents and print results from it. Fortunately, Pantry makes it very easy for you to change the traits of foods.

When you run pantry with the search options we discussed above, pantry first searches the files you specified for foods with the traits you specified with your options. pantry then changes the resulting foods to the traits you specify, as we will discuss next. For instance, in the next example we change the date trait of a raw banana. However, as the example also shows, the change is only temporary. Only the food in the buffer is changed, and the food in the buffer is a copy of the food in the master file. Later we will learn how to save the new foods that you make.

Example 2.19. Changing foods

$ pantry --name "Bananas, raw" --print traits master
Bananas, raw
Group: Fruits and Fruit Juices
Refuse: 36 percent Skin
100 g (100g)
$ pantry --name "Bananas, raw" --c-date "2007-05-06" \
> --print traits master
Bananas, raw
Group: Fruits and Fruit Juices
Date: 2007-05-06 
Refuse: 36 percent Skin
100 g (100g)
$ pantry --name "Bananas, raw" --print traits master
Bananas, raw
Group: Fruits and Fruit Juices
Refuse: 36 percent Skin
100 g (100g)

There are eight options you use to change food traits. Each takes an argument to indicate what you would like to change the trait to:

Changing the name, group, date, meal, and comment traits is easy. You can change these to any string that you wish, including a zero-length string. This gives you a great deal of flexibility. The option trait need not be set to a "official" food group. The date trait does not need to respect any particular date format--indeed, strictly speaking, it need not be any date at all!

Only two traits are not this flexible. As with the other traits, Pantry stores the qty trait as a string, but it is converted internally to a number as needed, so the value of this trait must be something that can be converted. It can be an integer, a floating-point number, or even a fraction or mixed number. Entering zero does not delete foods; later we'll discuss how to delete foods.

The other inflexible trait is the unit trait. This trait must be equal to one of the available units for each particular food. The argument that the --c-unit takes is actually a regular expression. pantry searches the food's available units for a single unit matching that regular expression.

Example 2.20. Changing the unit trait

$ pantry --name "Bananas, raw" --c-date "May 7" \
> --c-qty 2 --c-unit medium --print traits-nuts master
Bananas, raw
Group: Fruits and Fruit Juices
Date: May 7 
Refuse: 36 percent Skin
2 medium (7" to 7-7/8" long) (236g)
Nutrient                  Amount         %G     %TOT  
-------------------------------------------------------
Calories                  210  kcal       11     100   
Total Fat                 1    g          1      100   
Saturated Fat             0    g          1      100   
Cholesterol               0    mg         0      0     
Sodium                    2    mg         0      100   
Total Carbohydrate        54   g          18     100   
Dietary Fiber             6    g          25     100   
Sugars                    29   g          NA     100   
Protein                   3    g          5      100   
Vitamin A                 151  IU         3      100   
Vitamin C                 21   mg         34     100   
Calcium                   12   mg         1      100   
Iron                      1    mg         3      100   

If the regular expression you enter as an argument for --c-unit matches more than one of a food's available units, pantry will give you a warning message. pantry will not include the food (either changed or unchanged) in the search results; therefore, the food will not be printed in any reports you may have asked for using the --print option. However, Pantry will still include in the search results other foods that it did change. In the next example, the food Bananas, raw cannot have its units changed, because the search string cup matches more than one of the food's available units. However, the food Bananas, dehydrated, or banana powder is included in the search results because its unit was successfully changed.

Example 2.21. Errors when changing the unit trait

$ pantry --name "Bananas," --print traits-units master
Bananas, dehydrated, or banana powder
Group: Fruits and Fruit Juices
100 g (100g)
   cup
   tbsp
Bananas, raw
Group: Fruits and Fruit Juices
Refuse: 36 percent Skin
100 g (100g)
   cup, mashed
   large (8" to 8-7/8" long)
   medium (7" to 7-7/8" long)
   extra small (less than 6" long)
   small (6" to 6-7/8" long)
   NLEA serving
   cup, sliced
   extra large (9" or longer)
$ pantry --name "Bananas," --c-unit cup --print traits-units \
> master
==========
pantry-dev: warning: food Bananas, raw will not be copied into the buffer.
Failed to set units using pattern cup
Matches:
cup, mashed
cup, sliced
==========
Bananas, dehydrated, or banana powder
Group: Fruits and Fruit Juices
100 cup (10000g)
   cup
   tbsp

One nicety is that you can use fractions and mixed numbers for the qty trait:

Example 2.22. qty may be a fraction or mixed number

$ pantry --name "Bananas, raw" --c-qty "1/2" \
> --c-unit medium --print traits-nuts master
Bananas, raw
Group: Fruits and Fruit Juices
Refuse: 36 percent Skin
1/2 medium (7" to 7-7/8" long) (59g)
Nutrient                  Amount         %G     %TOT  
-------------------------------------------------------
Calories                  53   kcal       3      100   
Total Fat                 0    g          0      100   
Saturated Fat             0    g          0      100   
Cholesterol               0    mg         0      0     
Sodium                    1    mg         0      100   
Total Carbohydrate        13   g          4      100   
Dietary Fiber             2    g          6      100   
Sugars                    7    g          NA     100   
Protein                   1    g          1      100   
Vitamin A                 38   IU         1      100   
Vitamin C                 5    mg         9      100   
Calcium                   3    mg         0      100   
Iron                      0    mg         1      100   
$ pantry --name "Bananas, raw" --c-qty "2 1/2" \
> --c-unit medium --print traits-nuts master
Bananas, raw
Group: Fruits and Fruit Juices
Refuse: 36 percent Skin
2 1/2 medium (7" to 7-7/8" long) (295g)
Nutrient                  Amount         %G     %TOT  
-------------------------------------------------------
Calories                  263  kcal       13     100   
Total Fat                 1    g          1      100   
Saturated Fat             0    g          2      100   
Cholesterol               0    mg         0      0     
Sodium                    3    mg         0      100   
Total Carbohydrate        67   g          22     100   
Dietary Fiber             8    g          31     100   
Sugars                    36   g          NA     100   
Protein                   3    g          6      100   
Vitamin A                 189  IU         4      100   
Vitamin C                 26   mg         43     100   
Calcium                   15   mg         1      100   
Iron                      1    mg         4      100   

You can use fractions or mixed numbers anywhere that Pantry expects to get a number. That includes all command-line options as well as within XML files, which we will discuss later.