1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169
|
2014-06-02 Bernhard Reiter <ockham@raz.or.at>
* Merge translations.
* Use *.po files from Launchpad.
* Remove obsolete po/xx_XX.po files.
* Update po/.
* When saving a shopping list as a menu, add the time in its title.
2014-06-01 Bernhard Reiter <ockham@raz.or.at>
* Fix links in InfoBars under Windows, also for threaded export/import.
* Fix links in InfoBars under Windows.
* Bump version to 0.17.4.
* Move offer_url() to reccard.py.
* Fix guess_singulars() in defaults_en_GB.py by copying it from defaults_en.py.
* Fix guess_plurals() in defaults_en_GB.py by copying it from defaults_en.py.
* Remove obsolete offer_url related functions.
2014-05-29 Jessica Eccles <pounamu>
* fixed typo
* added appdata file Fixes #759
2014-05-29 Bernhard Reiter <ockham@raz.or.at>
* Remove incorrect width and height attributes from gourmet.appdata.xml.in.
* Add gourmet.appdata.xml.in to po/POTFILES.in, MANIFEST.in, and setup.py.
* I18nize gourmet.appdata.xml.in.
* Fix error in gourmet.appdata.xml.in.
2014-05-27 Jessica Eccles <pounamu>
* changed keyboard shortcuts as per Tom's comment Fixes #264
* added requested keyboard shortcuts Fixes #264
2014-05-21 Bernhard Reiter <ockham@raz.or.at>
* In reccard, import launch_url.
* Have xml_importer accept unicode filenames.
2014-05-19 Bernhard Reiter <ockham@raz.or.at>
* Little fix in case get_pluralized_form is passed an empty string.
* When adding a recipe to the shopping list that's already there,
increase the amounts of ingredients accordingly.
2014-05-11 Bernhard Reiter <ockham@raz.or.at>
* INSTALL.md: add ReportLab download link.
2014-05-10 Bernhard Reiter <ockham@raz.or.at>
* Use InfoBar for message in duplicate finder after website import.
* Move import/export progress bar to InfoBar.
* Replace Jump to button in successful export infobar by link to file.
* When exporting from recipe card, display InfoBar there.
* In offer_url(), use InfoBar instead of MessageDialog.
2014-05-06 Bernhard Reiter <ockham@raz.or.at>
* I18n offer_url parameters.
* Revert "Don't use Gtk.InfoBar yet as it requires pyGtk >= 2.22.
We'll keep this in a branch for now."
2014-05-04 Bernhard Reiter <ockham@raz.or.at>
* MCB plugin: create XML in temporary directory.
* MCB plugin: Handle yields/servings properly.
* Add MCB plugin to default_active_plugin_sets.
* Add lxml dependencies to setup.py (required for MCB plugin on Windows).
* Rename mcb-plugin to mycookbook_plugin.
* Update ChangeLog.
2014-05-03 Bernhard Reiter <ockham@raz.or.at>
* Fix rating export and import for the MCB plugin.
* Update ChangeLog.
2014-05-02 Bernhard Reiter <ockham@raz.or.at>
* Fix the MCB plugin's Export all function.
2014-04-28 Bernhard Reiter <ockham@raz.or.at>
* Update ChangeLog.
2014-04-20 Bernhard Reiter <ockham@raz.or.at>
* Wrap a PIL import.
* Add Fink section to INSTALL.md
* Change manage.py location and contents for Django 1.6.
* Remove a couple of spurious imports from the MCB plugin.
* Add MyCookbook plugin files to po/POTFILES.in.
2014-04-20 thierry
* timestamp changed
* Add MyCookbook export plugin.
2014-04-19 thierry
* fix segfault
2014-04-14 Bernhard Reiter <ockham@raz.or.at>
* In the web plugin, fix the link to the Gourmet website.
* Replace compressed jQuery v1.4.2 by uncompressed v1.11.0.
2014-04-03 Bernhard Reiter <ockham@raz.or.at>
* Bump version to 0.17.3.
* Add xml.dom to packages included by cx_Freeze.
2014-04-02 Bernhard Reiter <ockham@raz.or.at>
* Add FAQ item on setting display resolution.
2014-03-23 Bernhard Reiter <ockham@raz.or.at>
* Use playbin2 instead of deprecated playbin for gst sound playback.
* More on OS X.
* Add MacPorts section to INSTALL.md
2014-03-20 Bernhard Reiter <ockham@raz.or.at>
* Update ChangeLog.
* Add note about code signing .msi file to INSTALL.md.
* Bump version to 0.17.2.
2014-03-16 Bernhard Reiter <ockham@raz.or.at>
* Remove a couple of spurious lines from setup.cfg.
* Update ChangeLog.
* Bump version to 0.17.1.
* Remove build_rpms.py and related.
* Remove obsolete lines from print plugin code.
* Add space to command invoking Adobe reader.
2014-03-09 Bernhard Reiter <ockham@raz.or.at>
* Add cx_Freeze requirement to INSTALL.md.
* Remove EclipseNSIS paragraph from CODING.md.
* Update CODING, rename to CODING.md.
* Update README.md and INSTALL.md.
2014-03-08 Bernhard Reiter <ockham@raz.or.at>
* Remove some obsolete code meant for PyGTK < 2.6.
* Require Python 2.7 in README.md.
* Add two imports to plugins/import_export/gxml_plugin/gxml2_importer.py.
2014-02-26 Bernhard Reiter <ockham@raz.or.at>
* Fix a number of regressions in html_exporter.py.
* Update ChangeLog.
2014-02-25 Bernhard Reiter <ockham@raz.or.at>
* Remove redundant newlines from error message.
* Update *.po[t] files and add/fix some German and Austrian strings.
* Update ChangeLog.
* Fix a translation bug in de_DE.po.
* Remove *.mo files that ware accidentally added to git.
2014-02-24 Bernhard Reiter <ockham@raz.or.at>
* Update gourmet.desktop.in.
* Shorten years listing in copyright notice.
* Add Flattr donations button to About dialog.
2014-02-23 Bernhard Reiter <ockham@raz.or.at>
* Fix loading of FAQ from recipe card and shopping UI.
* Fix web browser invocation from About dialog under Windows.
* Remove obsolete exception clause.
* Under Windows, use Adobe Reader to print reportlab created PDF.
2014-02-22 Bernhard Reiter <ockham@raz.or.at>
* Simplify loading of LICENSE file into About dialog.
* Add donations text and buttons to the About dialog.
* Update ChangeLog.
2014-02-20 Bernhard Reiter <ockham@raz.or.at>
* Add 2014 to copyright years.
2014-02-18 Bernhard Reiter <ockham@raz.or.at>
* Some gourmet/backends/db.py cleanup.
* When connecting to a MySQL database, force UTF-8 charset.
2014-02-09 Bernhard Reiter <ockham@raz.or.at>
* Replace deprecated PoolListener by @event.listens_for decorator.
2014-02-08 Bernhard Reiter <ockham@raz.or.at>
* Remove \r escape sequence from sl.po.
* Change Yield unit accelerator in batch editor, update po files.
* Fix a translation bug in nl.po.
* Fix bug in Dutch translation.
2014-01-23 Bernhard Reiter <ockham@raz.or.at>
* UTF-8-decode ingkey in shopping_key_editor_plugin.
2014-01-21 Bernhard Reiter <ockham@raz.or.at>
* Fix a regression introduced by the last commit.
2014-01-20 Bernhard Reiter <ockham@raz.or.at>
* When de-activating Browse Recipes plugin, remove its tab.
2014-01-12 Bernhard Reiter <ockham@raz.or.at>
* Fix a typo.
2014-01-11 Lyra <lyra2108@gmail.com>
* FIX: Create a shopping list even if one entry hasn't an amount
2014-01-06 Bernhard Reiter <ockham@raz.or.at>
* Some cleanup.
* Clean up gourmet/exporters/exporter.py a bit.
* Update MANIFEST.in.
* Remove tools/ directory.
* Remove an obsolete reportlab version check and related code.
2014-01-05 Thomas M. Hinkle <tmhinkle@gmail.com>
* Hackishly remove indents needed after if statement to workaround build error.
* Allow null units to be looked up. Otherwise, we can never get conversions for things like "3 eggs."
* Remove GourmetWindows.pyw
2014-01-05 Bernhard Reiter <ockham@raz.or.at>
* Revert "Fix stupid mistake."
2014-01-04 Bernhard Reiter <ockham@raz.or.at>
* Check if active_plugin is really there.
2014-01-03 Bernhard Reiter <ockham@raz.or.at>
* Add myself as maintainer in setup.py.
* Add 2012, 2013 to copyright years.
* Add comment to setup.py.
* Remove obsolete README.windows.md.
* Fix stupid mistake.
* Fix a typo in INSTALL.md.
* Update TODO, rename to TODO.md.
* Update CODING.
* Add more Windows building instructions to INSTALL.md.
* Disable the PDFPrintPlugin under Windows as poppler doesn't work there.
* Use Python logging instead of printing a traceback.
* Migrate from py2exe to cx_Freeze.
* Set data_dir correctly if Gourmet is frozen.
* Update IPython requirement in INSTALL.md.
* Update ChangelLog.
2014-01-02 Bernhard Reiter <ockham@raz.or.at>
* Remove NSIS related files.
2014-01-01 Bernhard Reiter <ockham@raz.or.at>
* Replace PIL by Pillow requirement.
* Move *.gourmet-plugin.in files to gourmet/plugins/.
* Remove an obsolete line.
* Replace pywin32 requirement by a ctypes function call.
* Small whitespace fix.
* Remove missing signal handlers.
* Bump version to 0.17.0.
* Fix a translation bug in po/de.po.
2013-12-15 Bernhard Reiter <ockham@raz.or.at>
* Add reportlab packages to setup.py so py2exe includes them.
2013-11-19 Bernhard Reiter <ockham@raz.or.at>
* De-dupe AboutDotComWebParser class.
* Move duplicate code into a common base class member.
* Remove some redundant code.
* Remove obsolete KeyManagerOldSchool class.
* Remove duplicate code from gourmet/recipeManager.py.
* Remove duplicate file gourmet/convertGui.py.
2013-11-15 Bernhard Reiter <ockham@raz.or.at>
* Fix wildcard imports.
2013-11-13 Bernhard Reiter <ockham@raz.or.at>
* Fix another PIL import.
2013-11-02 Joe Sapp <joe@babyjoe>
* Remove "Application" from desktop entry
2013-01-11 Bernhard Reiter <ockham@raz.or.at>
* s/options/args/ to make bin/gourmet launch.
2013-01-11 Jeff Raber <jeff.raber@gmail.com>
* Replace deprecated optparse with argparse, per issue 683 [1]
2013-10-12 Bernhard Reiter <ockham@raz.or.at>
* Fix a typo that broke the nutritional information plugin DB upgrade.
2013-10-11 Bernhard Reiter <ockham@raz.or.at>
* Remove some more metakit remnants.
* Update po[t] files.
* Remove legacy_db (i.e. metakit) stuff.
2013-10-10 Bernhard Reiter <ockham@raz.or.at>
* Clean up recindex.py.
* Clean up GourmetRecipeManager.py.
* Clean up reccard.py
2013-09-30 Bernhard Reiter <ockham@raz.or.at>
* In PDF export, print title only once (as heading).
2013-09-20 Bernhard Reiter <ockham@raz.or.at>
* Only set_current_folder if get_user_special_dir(USER_DIRECTORY_PICTURES) isn't None.
2013-09-09 Bernhard Reiter <ockham@raz.or.at>
* Update *.po[t] files.
* Fix batch editing of categories.
* Translate attributes in batch editor's confirmation message box.
* In Batch Editor, replace "Servings" by "Yield" and "Yield Unit" rows.
* Small fix to ui/catalog/README.
* Remove some obsolete code checking for old gtk versions.
* Remove some spurious imports from recindex.py.
2013-09-06 Bernhard Reiter <ockham@raz.or.at>
* s/ui/ui_string/ fix in a couple of files.
2013-09-01 Bernhard Reiter <ockham@raz.or.at>
* Remove some spurious Image (i.e. PIL) imports.
2013-08-30 Bernhard Reiter <ockham@raz.or.at>
* Update Changelog.
2013-08-29 Bernhard Reiter <ockham@raz.or.at>
* Update version to 0.16.1 in gourmet/version.py.
* Update MANIFEST.in.
* Update translation files.
2013-08-28 Bernhard Reiter <ockham@raz.or.at>
* Little schema.org parser improvement.
* Properly raise an exception in print_plugin.py.
* Fix a translation bug in po/de_AT.po.
* Update allrecipes.com test recipe URL.
In (commented out and still dysfunctional part of) testImporters.py.
2013-08-27 Bernhard Reiter <ockham@raz.or.at>
* Drop Python version 2.6 in INSTALL.md.
* Add PYTHON_ARGCOMPLETE_OK string to bin/gourmet.
* Remove some obsolete imports from gourmet/importers/html_importer.py.
* Fix testImporters.py.
* Merge pull request #724 from sappjw/master
Replace more 'Image' imports with Pillow-compatible blocks
* Fix allrecipes.com importer, by extending our newly created schema_org_parser.
Also add a test gourmet/test/test_allrecipes_com_plugin.py which is capable of
testing the importer offline, using gourmet/test/recipe_files/allrecipes_com.html.
(Trying to integrate such an offline test into the existing, commented-out
allrecipes.com test in gourmet/test/testImporters.py proved a nightmare as
the importer code is tightly interwoven with the web page download and interactive
importer functions.)
Fixes #261
* Make ica.se importer aware of a recipe's yields property.
* Scrap more schema.org/Recipe fields.
* Remove obsolete gtk import from gourmet/importers/generic_recipe_parser.py.
* Have ica_se tests check for presence of category field.
* Factor schema.org parsing out of ica_se_plugin.py into a newly created schema_org_parser.py.
* Have gourmet/test/test_ica_se_plugin.py also test for cooktime parsing.
* Small fix for more a expressive test result.
* Small fix, mainly for future BeautifulSoup4 compliance.
* Move foodnetwork and ica.se importer tests to gourmet/test/.
2013-08-27 Joe Sapp <joe@babyjoe>
* Replace more 'Image' imports with Pillow-compatible blocks
2013-08-25 Bernhard Reiter <ockham@raz.or.at>
* Fix testImporters.py.
Among other things, use a temporary in-memory SQLite database for testing.
2013-08-24 Bernhard Reiter <ockham@raz.or.at>
* Truncate Source field in PDF export.
Fixes #721
2013-08-10 Bernhard Reiter <ockham@raz.or.at>
* One more string exception to fix.
2013-08-09 Bernhard Reiter <ockham@raz.or.at>
* s/thinkle.github.com/thinkle.github.io/
2013-08-06 Bernhard Reiter <ockham@raz.or.at>
* Merge pull request #723 from gyp/master
importing gettext in exportManager as it has localized strings
2013-08-06 Peter Gyongyosi <gyp@balabit.hu>
* importing gettext in exportManager as it has localized strings
This fixes https://bugs.launchpad.net/gourmet/+bug/1157969
2013-08-04 Bernhard Reiter <ockham@raz.or.at>
* Add INSTALL.md.
2013-07-30 Bernhard Reiter <ockham@raz.or.at>
* Add db upgrade logic for the fix introduced with the previous commit.
Fixes #711.
* Merge pull request #722 from rleibman/master
Fixing issue with mysql, VARCHAR requires a length
2013-07-30 Roberto Leibman <roberto@leibmanland.com>
* Fixing issue with mysql, VARCHAR requires a length, I figure 255 is probably good enough
2013-06-01 Bernhard Reiter <ockham@raz.or.at>
* Remove obsolete tools/upgrade_pre_script.py.
* Remove hardwired sys.path.append('/usr/share/gourmet') lines.
2013-05-27 Bernhard Reiter <ockham@raz.or.at>
* Additional fix for plugins/python_shell/ipython_view.py.
* Fix interactive shell plugin to work with current IPython versions.
Achieved by updating plugins/python_shell/ipython_view.py
(which was taken from the Accerciser project)
to the commit before Accerciser's Python3 migration [1],
reverting their previous PyGI migration [2].
[1] https://git.gnome.org/browse/accerciser/commit/?id=b9bb2f48eebbf9f21ca633b6ecd6a58d6befe04a
[2] https://git.gnome.org/browse/accerciser/commit/?id=48b8c06d598f84943ab7a0af1259408b7409484d
* Prepare plugins/python_shell/ipython_view.py for update.
2013-05-17 Bernhard Reiter <ockham@raz.or.at>
* Remove a bunch of unused imports.
* Fix setup.py so it works on non-Windows platforms again.
* Remove obsolete checks for PyGTK version < 2.8.
* Remove obsolete gtk_extras/ThumbnailGenerator.py.
* Remove obsolete gtk_extras/chooserNotebook.py.
* Remove obsolete gtk_extras/fauxDruid.py.
* Remove obsolete gtk_extras/FauxActionGroups.py.
2013-05-07 jens persson <jens@persson.cx>
* Buglet found with tests and som whitespace triming in foodnetwork plugin
* Add tests for foodnetwork plugin
* Fix buglet discovered due to tests
* Add tests for ica.se plugin
2013-04-20 Bernhard Reiter <ockham@raz.or.at>
* Merge pull request #715 from MrShark/master
An importer for ica.se (Swedish storechain)
2013-04-11 jens persson <jens@persson.cx>
* First shot on an importer for ica.se
2013-04-06 Bernhard Reiter <ockham@raz.or.at>
* Revert "Add back gnomeprinter.py." (Accidental commit, meant to be in a new branch.)
This reverts commit acad0d848f7c0567bf553dae27d7e6bbd3fe67a4.
* Add FAQ item about Gourmet's data storage location.
* Add back gnomeprinter.py.
* Remove obsolete PIL import.
* Add 'Francouzská' and 'Indická' (French and Indian) to defaults_sk.py
* Add "French" and "Asian/Indian" to Cuisine defaults.
Fixes #713.
2013-03-25 Bernhard Reiter <ockham@raz.or.at>
* Add Development Tools section (taken from the Wiki).
* Move Windows version warning to README.windows.md.
2013-03-23 Bernhard Reiter <ockham@raz.or.at>
* Fix a bug in defaults_ru.py
2013-03-12 Bernhard Reiter <ockham@raz.or.at>
* Merge setup_win.py into setup.py.
Also add some extra functionality to include required Gtk+ Theme files.
* Add __init__.py to web_plugin to turn it into a module.
Otherwise, there's an error with py2exe.
2013-03-10 Bernhard Reiter <ockham@raz.or.at>
* Add (Eclipse's) .settings/ dir to .gitignore
* Fix a bug in get_pluralized_form.
2013-03-09 Bernhard Reiter <ockham@raz.or.at>
* Remove some obsolete imports from gourmet/importers/html_importer.py.
* Remove obsolete Queue import from gourmet/importers/imageBrowser.py.
This was causing problems with py2exe.
* Add *.pyo files to .gitignore.
2013-03-06 Bernhard Reiter <ockham@raz.or.at>
* Fix a bug that caused gourmet to fail when LC_ALL=C
2013-03-06 Bernhard Reiter <ockham@raz.or.at>
* Remove -dev suffix from version in gourmet/version.py.
* Update MANIFEST.in.
Running "python setup.py sdist" will now exactly reproduce
the current git state.
* Add .project to .gitignore.
* Remove gourmet/.gitignore as omission of *.pyc files is recursively
covered by our root .gitignore
* Remove bin/gourmet-importer and bin/gourmet-importer-profile.
Both are apparently unused, unmaintained and severely outdated.
* Remove translation scripts from po/ as they're obsoleted
by distutils-extra (see CODING file).
* Replace 'import Image' by 'try: from PIL import Image
except ImportError: import Image'.
Rationale: http://lists.debian.org/debian-python/2013/02/msg00017.html
* Update Gourmet and Python version in windows/gourmet-installer.nsi.
* Update *.po files to match current source.
* Update *.po files from Launchpad Translations.
* Add author_email field to setup.py.
* Update MANIFEST.in.
* Remove windows/Gourmet.pyw from po/POTFILES.in.
2013-03-04 Bernhard Reiter <ockham@raz.or.at>
* Remove obsolete files.
* Update LICENSE (new FSF address).
* Remove windows/Gourmet.pyw as it's obsoleted by bin/gourmet.
* Fix some py2exe parameters.
2013-03-03 Bernhard Reiter <ockham@raz.or.at>
* Fix directory locations in setup_win.py.
* Fix import path in setup_win.py
2013-02-27 Bernhard Reiter <ockham@raz.or.at>
* Backup when upgrading the DB to v0.16.
* Remove obsolete comment.
* Remove obsolete file gourmet/PngImagePluginUpToDate.py.
* Simplify a conditional expression.
* Avoid a KeyError when pressing Enter on an empty search entry.
* Remove gourmet/importers/mealmaster_importer.py from po/POTFILES.in.
2013-02-20 Bernhard Reiter <ockham@raz.or.at>
* Remove gourmet/importers/mealmaster_importer.py as it's obsolete.
That file lives now in gourmet/plugins/import_export/mealmaster_plugin/.
* Remove shebangs from non-executable files.
* Change wording of README.md a bit.
* Merge pull request #694 from MrShark/master
Make working in a virtualenv easier
2013-02-14 jens persson <jens@persson.cx>
* Update documentation
* changed /usr/bin/python to /usr/bin/env python to alow usage in virtualenvs
* Remove hardcoded install path
2013-02-06 Bernhard Reiter <ockham@raz.or.at>
Fix #288.
2013-02-05 Bernhard Reiter <ockham@raz.or.at>
* Remove some clauses that checked for SQLALchemy < 0.6 as we're relying on >= 0.7 anyway now.
* Add Integer primary key columns (named 'id') to all remaining tables.
2013-02-04 Bernhard Reiter <ockham@raz.or.at>
Remove pickle_key and pickle_val options from dbDic.
2013-02-03 Thomas Mills Hinkle <tom@pebble>
* gourmet/convert.py (integerp): Restore NUMBER_END_NO_RANGE_REGEXP
(integerp): Quick fix to NumberEnry
* gourmet/backends/db.py (regexp): Fix sqlite custom function
error -- regexp searching now works. This closes #691. This bug
was caused by a change in SQLAlchemy behavior 0.6->0.7.
2013-02-02 Thomas Mills Hinkle <tom@pebble>
* gourmet/plugins/import_export/mealmaster_plugin/mealmaster_importer.py (mmf_constants.__init__): servings->yields
* gourmet/plugins/import_export/krecipe_plugin/krecipe_importer.py (KrecHandler): servingsyields->
* gourmet/importers/importer.py (Importer.commit_rec): Update servings->yields.
* gourmet/backends/db.py (RecData.add_rec): Update servings/yields
code.
* gourmet/exporters/exportManager.py
(ExportManager.offer_multiple_export): Fix bug #234, #691.
2013-02-01 Bernhard Reiter <ockham@raz.or.at>
Unpickle Booleans and Strings that have erroneously remained pickled in the
database during previous Metakit -> SQLite -> SQLAlchemy database migrations.
Fixes #678.
2013-01-30 Bernhard Reiter <ockham@raz.or.at>
* Rename gourmet/sound_gnome.py to gourmet/sound_gst.py.
* Restructure directory layout once again.
Move images, icons, sound, and style directories to data/;
this is in preparation of a possible future move to DistutilExtra's
auto setup (see #679).
* Install FAQ and LICENSE to share/doc/gourmet/.
* Prepend chromium-browser to list of *.html document launchers.
* Prepend libreoffice to list of *.rtf document launchers.
* When exporting, point Save as dialog to user's Documents directory by default.
2013-01-29 Thomas Mills Hinkle <tom@pebble>
* gourmet/plugins/nutritional_information/nutrition.py
(NutritionData.get_matches): Make sure get_matches returns a list
as expected, not None.
(NutritionData.get_nutinfo_for_item): Handle empty units correctly.
(NutritionData.get_conversion_for_amt): Handle empty units correctly.
* gourmet/plugins/import_export/mealmaster_plugin/mealmaster_exporter.py (mealmaster_exporter.__init__): Fix boneheaded typo.
(mealmaster_exporter.write_attr): Update servings-->yields
(mealmaster_exporter.write_attr): Reduce padding to conform to MMF standard
(mealmaster_exporter.write_categories): Reduce padding to conform to MMF standard
(mealmaster_exporter.write_ing): Allow for empty units (fix boneheaded error)
* gourmet/plugins/import_export/html_plugin/html_exporter.py
(html_exporter.write_text): Fix NAME_TO_ATTR lookup issue w/
plugins.
* gourmet/plugins/field_editor/fieldEditor.py
(FieldEditor.fieldChangedCB): Fix possible issue with NAME_TO_ATTR
lookups and plugins searching for attributes that don't exist
there.
* gourmet/plugins/import_export/mealmaster_plugin/mealmaster_importer.py
(mmf_constants.__init__): Respect new Gourmet norms regarding
standard ingredient abbreviations (remove periods, mostly)
* gourmet/plugins/import_export/mealmaster_plugin/mealmaster_exporter.py
(mealmaster_exporter.__init__): Make sure category comes first as
per mealmaster specs.
(mealmaster_exporter.__init__): Remove redundant/stupid code
(mealmaster_exporter.write_ing): Fix ingredient code and make more
robust against future changes in defaults.
2013-01-25 Bernhard Reiter <ockham@raz.or.at>
* Mention BeautifulSoup in the Extra Requirements section of README.md.
* Merge pull request #689 from jraber/unbundleBeautifulSoup
Removed bundled (old) versions of BeautifulSoup.py
* Change back perms for bin/gourmet to 755.
2013-01-17 Jeff Raber <jeff.raber@gmail.com>
Removed bundled (old) versions of BeautifulSoup.py
BeautifulSoup.py seems to be available in the common linux distros. Otherwise, it can
be installed with 'pip install BeautifulSoup'
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=895228
2013-01-15 Bernhard Reiter <ockham@raz.or.at>
Add slogan to README.md ;-)
2013-01-12 Thomas Mills Hinkle <tom@pebble>
* gourmet/importers/importManager.py: gettext fix
2013-01-12 Bernhard Reiter <ockham@raz.or.at>
* Add new Integer primary keys to the shopcats, shopcatsorder, and pantry tables.
Those tables had Text columns as primary keys, which, when used with MySQL,
requires an extra parameter specifying the length of the substring that MySQL
is supposed to use for the key. Thus, we're adding columns named id of type
Integer and make them the new primary keys instead.
Fixes #681.
* Move *.gourmet-plugin files to plugins/, install to share/gourmet/plugins.
This is required for python-distutils-extra to be able
to translate and install *.gourmet-plugin files properly.
2013-01-09 Bernhard Reiter <ockham@raz.or.at>
* Change data/recipe.dtd perms from 755 to 644.
* .gitignore: Remove obsolete lines, add .pydevproject. .cvsignore: Delete.
2013-01-07 Bernhard Reiter <ockham@raz.or.at>
* Enable building of *.mo and *.gourmet-plugin files during development.
Furthermore, update CODING with instructions, and remove
bin/gourmet_in_place as it's now obsolete.
* Modify file locations in built settings.py, not the one in the source tree.
2013-01-06 Thomas Mills Hinkle <tom@pebble>
* gourmet/GourmetRecipeManager.py (RecGui.setup_main_window): Make sure search entry has focus.
* gourmet/plugins/listsaver/shoppingSaverPlugin.py: gettext fix
* gourmet/plugins/key_editor/recipeEditorPlugin.py: gettext fix
* gourmet/plugins/import_export/pdf_plugin/print_plugin.py: Fix gettext
2013-01-06 Bernhard Reiter <ockham@raz.or.at>
* Remove obsolete cruft from windows/ directory.
* Update website, download link and Tom's email address in NSIS script.
* In the HTML output, don't translate class names.
Otherwise, this would require CSS selectors to be also localized and would
not work across languages. That's obviously not how it should be done.
* Remove modules_check and other cruft from setup.py
This hasn't been used or updated for a while, and as it isn't really
supported by distutils, it has been more a source of redundancy (read
confusion and maintenance burden) in conjunction with dependencies
listed in our README.
* Rename README to README.md, and use Markdown to style it.
* Remove bin/__init__.py as it's obsolete now.
* Minor line layout fix.
* Replace our custom tools/gourmet_distutils.py by a python-distutils-extra dependency.
* Update po/POTFILES.in and po/gourmet.pot.
2013-01-05 Bernhard Reiter <ockham@raz.or.at>
* Replace some wildcard imports.
* Remove some cruft from gourmet/__init__.py.
2013-01-02 Bernhard Reiter <ockham@raz.or.at>
* Update requirements in the README file.
* Update setup.cfg to at least somewhat reflect current RPM based distributions.
* Remove rpm/gourmet.fedora.spec and rpm_build.sh.
This stuff was severely outdated, duplicates information from setup.py and
setup.cfg (if we're really going to keep providing RPMs which hasn't been done
during the past releases), and is maintained better at Fedora anyway.
* Change more URLS from Sourceforge to GitHub.
2013-01-01 Bernhard Reiter <ockham@raz.or.at>
* Change old SourceForge URLs to new GitHub ones where applicable.
* Move practically all program information to version.py and import it from there into setup.py and setup_win.py.
* Fix some install locations.
* Add back toolbar, with an option in the preferences dialog to hide it.
* Don't fall back to version = 0.11.0 in setup.py.
* Simplify some code.
2012-12-31 Bernhard Reiter <ockham@raz.or.at>
Remove BUG_URL link from gglobals.py as its both outdated and not used anywhere.
2012-12-30 Bernhard Reiter <ockham@raz.or.at>
* Don't use Gtk.InfoBar yet as it requires pyGtk >= 2.22. We'll keep this in a branch for now.
* Remove obsolete line from gglobals.py
* Move info.py contents back into version.py as we got rid of the critical circular dependency with OptionParser.py.
* Remove checks for gtk.CellRendererCombo as it has been part of GTK since v2.6.
* Determine location of installed files properly.
* Another stylesheet path fix in html_exporter.py.
2012-12-28 Bernhard Reiter <ockham@raz.or.at>
* Add *.html pattern to html_exporter_plugin.py's saveas_filters.
* Fix default.css location in HTML exporter plugin.
* Remove custom file type widget from FileSelectorDialog.
* Remove FileChooserSaveAs.py as it has long been obsoleted by gtk_extras/dialog_extras.py.
2012-12-25 Bernhard Reiter <ockham@raz.or.at>
* Let tools.gourmet_distutils.py take care of translation and installation of gourmet.desktop.
* Install png and svg icons to locations that enable desktop environments to pick proper file.
See http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#directory_layout
2012-12-19 Bernhard Reiter <ockham@raz.or.at>
Remove obsolete GourmetFauxThreads.py and GourmetThreads.py.
2012-12-17 Bernhard Reiter <ockham@raz.or.at>
* Fix db.py to allow (dev) version suffices like 0.16.0-dev.
* Add patch to include schema.org metadata for HTML exporter by SF user freedo.
See https://sourceforge.net/tracker/?func=detail&aid=3519632&group_id=108118&atid=649654
and http://www.schema.org/Recipe, respectively.
* Add plurals handling fix by A. Katz.
"Just a quick patch to fix a bug in default.py.
The function for converting a plural to a singular unit had two issues.
a) WORD_TO_SING_PLUR_PAIR keys are lowercase but the word being handed to the function could be in any case
b) if the word is not in WORD_TO_SING_PLUR_PAIR it does nothing, this patch tries lang.guess_singulars before
giving up."
See https://sourceforge.net/tracker/?func=detail&aid=3420657&group_id=108118&atid=649654
2012-11-27 Bernhard Reiter <ockham@raz.or.at>
Remove obsolete line from setup.py
2012-11-26 Bernhard Reiter <ockham@raz.or.at>
* Fix gourmet/backends/db.py so it works with SQLAlchemy >= 0.7.
* Remove po/*/LC_MESSAGES/gourmet.mo files as they are generated at build time from po/*.po files.
2012-11-22 Bernhard Reiter <ockham@raz.or.at>
Remove obsolete file (now in gourmet/plugins/import_export/mastercook_import_plugin/)
2012-05-25 Thomas Hinkle <tmhinkle@gmail.com>
* Fixed conflict
* ++gettext
2012-04-27 Tom <tom@localhost6.localdomain6>
* gourmet/plugins/unit_display_prefs/__init__.py: import gettext
* gourmet/plugins/python_shell/__init__.py: import gettext
* gourmet/plugins/nutritional_information/nutrition.py (NutritionData.get_nutinfo): remove verbosity
* gourmet/plugins/nutritional_information/nutPrefsPlugin.py: import gettext
* gourmet/plugins/nutritional_information/main_plugin.py: import gettext
* gourmet/plugins/field_editor/__init__.py: import gettext
* gourmet/plugins/email_plugin/emailer_plugin.py: import gettext
* gourmet/plugins/duplicate_finder/recipeMergerPlugin.py: import gettext
* gourmet/plugin_gui.py: import gettext
* gourmet/info.py: import gettext
* gourmet/plugin_loader.py (Pluggable.get_plugin_by_module): Add
convenience function for grabbing plugin instances.
2012-04-22 Bernhard Reiter <ockham@raz.or.at>
Bump version number to 0.16.0-dev
2012-03-06 Bernhard Reiter <ockham@raz.or.at>
* Remove gettext_setup.py as its logic has been split in settings.py and gglobals.py (and info.py)
* Remove some obsolete logic from setup.py.
* Move localized stuff from version.py to newly created info.py to avoid circular dependencies.
* Move logic that searches for the data files path from gglobals.py to newly created settings.py.
* Wrap the path finding stuff in bin/_preamble.py in a function
* Add __init__.py to the bin/ directory so we can import it as a module.
* Rename --data-directory cmdline option to --gourmet-base.
* Fix occurrences of HELP_FILE constant.
2012-02-27 Bernhard Reiter <ockham@raz.or.at>
* Remove --image-directory and --ui-directory cmd line options, as those are now subdirectories of --data-directory.
* Replace custom inquiry if existing file should be overwritten by GTK one.
2012-02-26 Bernhard Reiter <ockham@raz.or.at>
* Replace create_manifest.py by MANIFEST.in
* Remove some more duplicates
2012-02-20 Bernhard Reiter <ockham@raz.or.at>
Minor setup.py fix
2012-02-16 Bernhard Reiter <ockham@raz.or.at>
Remove tools/gourmet_distutils as it's unused (there's still tools/gourmet_distutils.py)
2012-02-12 Bernhard Reiter <ockham@raz.or.at>
* Move website URL from GRM.py to version.py
* Replace old splash screen by new one
* Change directory layout once more. Looks good now, but still a lot of code fixes ahead.
2012-02-11 Bernhard Reiter <ockham@raz.or.at>
* Un-hardwire intltool's path under windows in setup.py
* Fix FAQ and LICENSE locations in code
* Update setup.cfg, mostly to use .bz2 compression
* Restructure data/ directory
* Add images/gourmet.svg, and remove a couple of outdated images.
* Rename glade/ directory to ui/
* Restructure directory layout to comply more to
http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html
2012-02-10 Thomas Hinkle <tmhinkle@gmail.com>
* Fixed density of sugar (I think I'd used the density from a chemistry,
rather than a cooking, site, which didn't account for the air between
the sugar crystals when you measure it)
* Don't fail if elib.intl isn't present -- print a warning instead.
* Glade-->UI
2012-02-09 Bernhard Reiter <ockham@raz.or.at>
Rename i18n/ directory to po/ so intltool-update --maintain will work
2012-02-08 Bernhard Reiter <ockham@raz.or.at>
* Images cleanup
* Remove a stray .po file
* Rename gladed command line option to uid
* Rename some more methods from glade to ui (or builder)
* s/gladebase/uibase/g
* Use updated i18n/de.po from Launchpad
2012-02-07 Bernhard Reiter <ockham@raz.or.at>
* Replace custom hack in setup_gettext.py by elib.intl module
* Add Lauchpad header to i18n/de.po
2012-02-06 Bernhard Reiter <ockham@raz.or.at>
Update i18n/gourmet.pot translation template
2012-02-05 Bernhard Reiter <ockham@raz.or.at>
* New German translations by nobody (at) t4b.me
* i18n string unification fixes by nobody (at) t4b.me
* Another i18n fix
2012-02-01 Bernhard Reiter <ockham@raz.or.at>
* Yet another (somewhat prominent) i18n fix.
* Internationalize src/lib/plugins/import_export/archive_plugin/zip_importer_plugin.py
* s/ = /=/ in the *.gourmet-plugin.in files, which previously impeded
localization, as intltool-merge can't deal with whitespaces on the wrong places.
2012-01-31 Bernhard Reiter <ockham@raz.or.at>
* Fix i18n/POTFILES.in to properly include .gourmet-plugin.in files
* Add Russian localization files i18n/ru.po and src/lib/defaults/defaults_ru.py
by Alexander Prokoudine, from our Sourceforge patch tracker: see
https://sourceforge.net/tracker/?func=detail&aid=2858486&group_id=108118&atid=649654
and https://sourceforge.net/tracker/?func=detail&aid=2858485&group_id=108118&atid=649654
* Fix sort of a typo
* Replace occurrences of .props.someproperty by {g|s}et_property('someproperty') to fix bug #3480177
* Replace occurrences of .props.someproperty by {g|s}et_property('someproperty') to fix bug #3480177
* Another fix to make i18n work.
2012-01-30 Bernhard Reiter <ockham@raz.or.at>
Small i18n related fix.
2012-01-29 Bernhard Reiter <ockham@raz.or.at>
* Add domain=gourmet attribute to the interface tag in the .ui files
* Update i18n/POTFILES.in to reflect .glade -> .ui file conversion
* Add [type: gettext/glade] prefix to .ui files in i18n/POTFILES.in
so that they're actually searched for strings by intltool.
* Add locale.bindtextdomain('gourmet',DIR) so that the strings from
our .ui (and glade) files are actually translated -- which they previously weren't.
2012-01-21 Bernhard Reiter <ockham@raz.or.at>
* Add i18n/generate_mo.sh as i18n/generate_mo.py doesn't seem to work for me.
* In src/lib/version.py, import gettext_setup so trings get translated.
* Make ImageSelectorDialog open the user's Pictures directory when launching it.
2012-01-19 Bernhard Reiter <ockham@raz.or.at>
* Remove obsolete cmd line options documentation from gourmet.1
* Move LICENSE displaying logic from version.py to GourmetRecipeManager.py
as it requires some imports; and add LICENSE to setup.py
2012-01-17 Bernhard Reiter <ockham@raz.or.at>
Add LICENSE to MANIFEST as it's needed by the About dialog.
2012-01-12 Bernhard Reiter <ockham@raz.or.at>
Comment out an obsolete windows workaround.
2012-01-11 Bernhard Reiter <ockham@raz.or.at>
Remove a stray file that had sneaked into MANIFEST and i18n/POTFILES.in
2012-01-10 Bernhard Reiter <ockham@raz.or.at>
* Regenerate i18n/gourmet.pot and i18n/*.po files by running i18n/grab_strings.sh
* Update i18n/POTFILES.in based on MANIFEST contents
* Update MANIFEST
* Update POTFILES, translation template (gourmet.pot), and merge into individual *.po files
* Fix Nutritional Information plugin
2012-01-07 Bernhard Reiter <ockham@raz.or.at>
Remove make_star_button and make_star_image functions as they aren't needed anymore.
2012-01-06 Bernhard Reiter <ockham@raz.or.at>
* Replace gnome.sound_* stuff with gstreamer (gst) stuff.
This should conclude our removal of (python-)gnome dependencies.
We now need pygtk >= 2.16 and (py)gst instead (which is much less heavy-weight than gnome).
* Remove gnome stuff from the pdf_exporter.py test code.
* Replace gnome-open by the cross-desktop xdg-open command.
* Remove gnomeprint import from gglobals.py
* Remove obsolete 'printer' command line option.
* Remove call to gnome.url_show as we can assume gtk.show_uri to exist in PyGTK >= 2.16
2011-12-30 Bernhard Reiter <ockham@raz.or.at>
Replace gnome.ui.About dialog by gtk.AboutDialog
2011-12-27 Bernhard Reiter <ockham@raz.or.at>
Use an InfoBar to display deletion warning message
2011-12-19 Bernhard Reiter <ockham@raz.or.at>
Add alignment objects to recCardDisplay.ui as that information got lost during gtk.Builder migration.
2011-12-17 Bernhard Reiter <ockham@raz.or.at>
Add NutritionLabel widget back to nut_recipe_card_display.ui which got lost in the migration to gtk.Builder
2011-12-16 Bernhard Reiter <ockham@raz.or.at>
* Fix a signal handler related bug due to gtk.Builder migration
* Remove import gtk.glade statements everywhere.
* Remove custom_handlers stuff as it's obsolete now after migrating to gtk.Builder.
* Migrate even the faux stuff to gtk.Builder
* Remove references to *.glade files in setup.py and create_manifest.py; recreate MANIFEST.
* Migrate the Nutritional Information plugin to gtk.Builder. This requires still some polishing.
* Change NumberEntry's default_to_fractions argument default value to False
(as that's what it's set to practically everywhere, and it will make migration to gtk.Builder easier).
* Forgot to add keyeditor.ui and remove keyeditor.glade
* Migrate recipeMerger.py to gtk.Builder
* Migrate keyEditor.py to gtk.Builder
* Remove app.glade (in favor of app.gui)
* Migrate chooserNotebook.py to gtk.Builder (though currently unused)
* Remove recipeMerger.py from src/lib as it's now in a plugin subdirectory
* Replace remaining glade.XML occurrences in GRM.py by gtk.Builder equivalents.
* Migration to gtk.Builder: Add app.ui and change remaining occurrences of app.glade to app.ui
* Replace checks for app.glade by checks for app.ui
* Remove an unnecessary import from src/lib/reccard.py
* Migrate batchEditor from glade to gtk.Builder
* Remove glade/keyeditor.glade as that files is already in src/lib/plugins/key_editor/
* Remove glade/*.glade and glade/*.gladep files for which conversion to *.ui is complete.
* Migrate recipe card to gtk.Builder
2011-12-15 Bernhard Reiter <ockham@raz.or.at>
* Fix reccard.py after migration to gtk.Builder; plus two fixes to ratingWidget.py
* Add a README to glade/catalog
* More recCardDisplay to gtk.Builder fixes
* Properly migrate recCardDisplay to gtk.Builder
* Create gourmetwidgets catalog for glade, adapt widgets code.
2011-12-13 Bernhard Reiter <ockham@raz.or.at>
Start migrating recCardDisplay to gtk.Builder
2011-07-01 Tom <tom@localhost6.localdomain6>
* src/lib/convert.py (NUMBER_FINDER_REGEXP): Avoid seeing things
with a terminal . or , as numbers, thus avoiding seeing numbered
lists as ingredients.
2011-06-28 Tom <tom@localhost6.localdomain6>
* src/lib/reccard.py (IngredientController.commit_ingredients.commit_iter):
Fix attr lookup error in corner cases.
2011-03-20 Tom <tom@localhost6.localdomain6>
* src/lib/version.py (version): Version --> 0.15.9
* src/lib/shopgui.py (ShopGui.show): Make sure window shows up
when something's added.
* src/lib/backends/db.py (RecData.initialize_connection): Remove
threadlocal strategy. This may be a mistake, but it seems to clear
up the commit errors numerous people were experiencing.
* src/lib/shopgui.py (ShopGui.__init__): Make sure popup menu gets
set-up for changing categories in shopping list.
* src/lib/reccard.py (shop_for_recipe_cb): Fix shopping list, and improve error messages.
* src/lib/GourmetRecipeManager.py (StuffThatShouldBePlugins.shop_recs): fix shopping list.
* src/lib/shopping.py: Fix refactoring error.
* src/lib/shopgui.py (ShopGui.getOptionalIngDic): Fix refactoring
error that broke "add-to-shopping list" behavior
2011-03-08 Tom <tom@localhost6.localdomain6>
* src/lib/version.py (version): Version --> 0.15.8
2011-03-07 Tom <tom@localhost6.localdomain6>
* src/lib/backends/db.py (RecData._force_unicode): Don't unicode-ify images!
2011-02-02 Tom <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_importer.py:
Adapt mealmaster plugin to handle 'Windows Gourmet' file (who
knows what this program was, but we appreciate their name!). The
adaptations shouldn't do any harm to mealmaster, and may help with
imports of some of the many broken mealmaster files that exist on
the internet.
2011-01-05 Tom <Thomas_Hinkle@sf.net>
* create_manifest.py:
(write_lst_to_file): Include *.ui files!
* README: Remove obsolete material about Gnomeprint.
* src/lib/plugin.py (RecEditorModule.grab_focus): Add method for
editor modules to setup focus for editing.
* src/lib/reccard.py (RecEditor.present): Add code to allow each
module to grab focus programatically to set up editing.
(DescriptionEditorModule.grab_focus): Make DescriptionEditorModule
grab focus for the "title" box right away, so that when you open
the editor window you can start typing.
* src/lib/backends/db.py (RecData.get_unique_values): Fix bug in
DB code that caused a SQL error.
2010-12-16 Tom <Thomas_Hinkle@sf.net>
* src/lib/version.py (version): Version->0.15.7
* src/lib/backends/db.py (RecData.get_unique_values): Patch from
Steve Langasek for Ubuntu bug #534088
(RecData.get_unique_values): Fix handling of null criteria.
2010-12-10 Tom <Thomas_Hinkle@sf.net>
* src/lib/plugins/web_plugin/gourmetweb/templates/shop.html: Add forms to add/remove from pantry.
* src/lib/plugins/web_plugin/gourmetweb/recview/views.py (MyShoppingList.get_shopper): Use database for shopping list so we can store e.g. pantry data.
(multiply_rec): Use 'yields' when possible; otherwise use multiply
(shop_to_pantry): Add callback to move items to pantry
(shop_to_list): Add callback to remove items from pantry
* src/lib/plugins/web_plugin/gourmetweb/urls.py: Add shopping list
callbacks (move to/from pantry)
2010-12-09 Tom <Thomas_Hinkle@sf.net>
* src/lib/plugins/key_editor/keyEditor.py (KeyEditor.isearchCB):
Set cursor to busy while searching.
* src/lib/recindex.py (RecIndex.search): Fix busy cursor while searching.
* src/lib/backends/db.py (RecData.get_ingkeys_with_count): Fix bug
that broke IngredientEditor view entirely.
* src/lib/plugins/key_editor/keyEditor.py (KeyStore.reset_views):
Don't undo search when resetting view after applying an edit.
* src/lib/backends/db.py (RecData.do_modify): Force unicode (Fixes #3120915)
2010-11-28 Thomas Mills Hinkle <Thomas_Hinkle@sf.net>
* src/lib/backends/db.py (RecData.update_version_info): Patch from Jeff Raber to remove sqlite3 reference
(RecData.get_unique_values): Patch from buergi to get working with MySQL
2010-11-16 Thomas Mills Hinkle <Thomas_Hinkle@sf.net>
* src/lib/reccard.py (DescriptionEditorModule.update_from_database):
Fix signal used for spinbutton for yield and any other
spinbuttons. (patch from Saulius Lukauskas)
* src/lib/plugins/import_export/mastercook_import_plugin/mastercook_plaintext_importer.py:
Patch from Saulius Lukauskas fixing column-matching/dash-matching
conflict that broke ingredient import.
2010-10-20 Thomas Hinkle <tom@grenville>
* src/lib/plugins/web_plugin/gourmetweb/templates/rec.html: Start
adding some style to web-based recipe view.
* src/lib/backends/db.py (RecData.add_column_to_table): Workaround
sqlalchemy 0.6.0 incompatability
* src/lib/plugins/nutritional_information/nutrition.py (NutritionData.get_nutinfo_for_ing):
Take into account amounts on recipes called as ingredients.
2010-08-01 Thomas Mills Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/web_plugin/gourmetweb/templates/rec.html: Add
AJAX magic to do multiplication ajax-style when javascript is
available.
2010-07-30 Thomas Mills Hinkle <Thomas_Hinkle@sf.net>
* src/lib/shopping.py: Refactor code -- move some code from
shopgui classes to front-end neutral ShoppingList class that can
be base class for HTML front-end.
* src/lib/shopgui.py: Refactor code to allow web-front-end
* src/lib/plugins/web_plugin/: Start a django-based web-front-end
to Gourmet
2010-07-21 Thomas M. Hinkle <tom@grenville>
* src/lib/version.py (version): Version->0.15.6
2010-07-20 Thomas M. Hinkle <tom@grenville>
* src/lib/plugins/import_export/web_import_plugin/generic_web_importer_plugin.py (GenericWebImporter.mimetypes):
Fixed bug in mimetypes, by adding expected application/xhtml+xml
type.
* src/lib/backends/db.py (RecData.get_criteria): Fix another
sqlalchemy-API-change-caused bug.
2010-07-13 Thomas M. Hinkle <tom@grenville>
* src/lib/backends/db.py (RecData.save): Try to work around
sqlalchemy bug that seems to through error on some (extra?)
commits.
2010-07-10 Thomas M. Hinkle <tom@grenville>
* src/lib/version.py (version): Version-->0.15.5
* src/lib/recindex.py (RecIndex.tree_keypress_cb): Handle Page-Up,
Page-Down, Home and End properly for our multiple page interface.
2010-07-09 Thomas M. Hinkle <tom@grenville>
* src/lib/backends/db.py (RecipeManager.parse_ingredient): Fix
typo/logic-error that prevented some units from being recognized.
* src/lib/* Get rid of raise + string calls, as python 2.6
prohibits them (patch from #2979619)
* src/lib/recindex.py (RecIndex.make_search_dic): Look anywhere in
text, not just at beginning. (fixes bug #3021913)
* src/lib/reccard.py (DescriptionEditorModule.save): Remove old
debug statements. Note to self: leaving in print statements is
dangerous, as it can raise unicode errors and create bugs where
all was well, as in bug #3018283
* glade/recCardIngredientsEditor.glade: Update ingredient editor tooltip.
2010-06-07 Thomas Mills Hinkle <Thomas_Hinkle@sf.net>
* src/lib/backends/db.py (map_type_to_sqlalchemy): Use LargeBinary type if available (sqlalchemy 0.6+)
(RecData.get_unique_values): Fix boolean-related sqlalchemy 0.6+ bug.
* src/lib/importers/interactive_importer.py (InteractiveImporter.label_selection):
Fix error (we needed iter, we got mark) (patch from Jeff Spaleta)
(InteractiveImporter.set_text): Fix logic error (remove extra
newlines before parsing when it still matters).(patch from Jeff
Spaleta)
* src/lib/plugins/import_export/web_import_plugin/generic_web_importer_plugin.py (GenericWebImporter.test_url):
Check that content_type is iterable (modified version of patch
from Jeff Spaleta).
2010-05-19 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/db.py: Change name of ingredient_parser to
parse_ingredient (following naming conventions used everyone else
by pretty much everyone alive). Make this change throughout other
source files.
* src/lib/importers/generic_recipe_parser.py (RecipeParser): Fix
unicode/regexp issue with ing_matcher
2010-03-25 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/backends/db.py (RecData.update_version_info): Make sure
recipe_id doesn't already exist as a column before altering old
databases -- apparently we were wrong about when this change was
made.
2010-03-05 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/gglobals.py (FLOAT_REC_ATTRS): Add list of recipe
attributes that are floats (as opposed to ints, text, etc)
* src/lib/reccard.py (DescriptionEditorModule.save): Make sure
floating attributes (e.g. yields) get grabbed as values and not as
text.
* glade/recCardDescriptionEditor.glade: Make yields amount entry
accept decimals.
* src/lib/defaults/defaults_en.py (UNITS): ++drops
* src/lib/defaults/defaults_en_GB.py (UNITS): ++drops
* src/lib/reccard.py (IngredientTreeUI.ingtree_keypress_cb): Make
delete-key in ingredient editor view only work in treeview (same
as change made for main view on 2/9/2010).
2010-03-03 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/GourmetRecipeManager.py (GourmetApplication.get_attribute_model):
Don't bother caching the attribute models. It results in
inconsistency for the user and it's not that expensive to just
regenerate the lists each time we need them.
* defaults_en.py defaults_en_GB.py ++T. and t. as abbreviations
for Tablespoon and teaspoon
2010-02-09 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/GourmetRecipeManager.py (RecGui): Make
delete-key-deletes-recipe behavior a callback on keypresses only
in treeview. This prevents users using the delete key in the
search box from accidentally deleting recipes. Also, let backspace
delete recipes as well for convenience.
* src/lib/backends/db.py (RecData.get_criteria): Make sure search
strings are proper unicode objects. Fixes bug #2948135.
2010-01-16 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/version.py Version->0.15.4
* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.postparse):
Strip extra newlines.
(MenuAndAdStrippingWebParser.cut_menus): Add more common website
nav class ID's (footer, header, sitemap).
(MenuAndAdStrippingWebParser.cut_menus): Don't ignore the whole
body tag, no matter what (fixes epicurious import)
* src/lib/importers/interactive_importer.py (InteractiveImporter.set_text):
Strip extra newlines.
2010-01-15 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/gtk_extras/thumbnail.py (check_for_thumbnail): Catch
non-ASCII characters in URLs.
2010-01-06 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/importers/interactive_importer.py (InteractiveImporter):
Replace text-tags in buffers with ComboBox widget that allows user
to change tag of marked-up region. Also, separated out giant list
of buttons into categories and made more suitable for wider and
shorter screens.
2010-01-02 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/key_editor/recipeEditorPlugin.py (IngredientKeyEditor.setup_tree):
Wrap text in treeview when it is too long; automatically reflow as
window is resized.
2009-12-29 Thomas M Hinkle <tom@minime>
* src/lib/plugins/import_export/web_import_plugin/generic_web_importer_plugin.py (GenericWebImporter.test_file):
Add support for xhtml. Be fallback option whenever we match a file
pattern.
* src/lib/plugins/import_export/plaintext_plugin/plaintext_importer_plugin.py (PlainTextImporterPlugin.test_file):
Don't match *all* files as fallback options -- have a list of
"antipatterns" to exclude.
2009-12-18 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/gtk_extras/dialog_extras.py (SimpleFaqDialog.NESTED_MATCHER):
Fix bug in REGEXP in number-header parsing.
* src/lib/plugins/nutritional_information/databaseGrabber.py (DatabaseGrabber.parse_abbrevfile):
Remove old code.
* FAQ: Update FAQ (which was pretty seriously out-of-date).
2009-12-17 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/backends/db.py (RecData.validate_recdic): Ensure recipe
info is unicode.
* src/lib/check_encodings.py: Be less verbose.
* Version -> 0.15.3
* src/lib/plugins/nutritional_information/parser_data.py (NUTRITION_FIELDS): Update fields for SR21.
* src/lib/plugins/nutritional_information/nutritionGrabberGui.py (check_for_db):
Update DBs from SR20 (check if there are choline entries to see if
the DB is old).
* src/lib/plugins/nutritional_information/databaseGrabber.py (DatabaseGrabber.parse_abbrevfile):
Update fields when adding doesn't work.
* src/lib/plugins/nutritional_information/data_plugin.py (NutritionDataPlugin.update_version): Add new field (choline)
* src/lib/backends/db.py (RecData.update_version_info): Fix update
from versions < 0.11.x
* i18n/gourmet.pot: Update.
* i18n/POTFILES.in: Update to reflect current MANIFEST
* src/lib/plugins/nutritional_information/parser_data.py (NUTRITION_FIELDS):
Reorder fields and add choline for SR21 (they changed more than I
had first thought!)
2009-12-14 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/backends/db.py (RecData.update_version_info): Fix update
from versions < 0.11.x
2009-12-11 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/nutritional_information/nutrition.py (foo.SimpleInterface.print_info):
Be less verbose.
* src/lib/importers/importer.py (Importer.commit_rec): Make sure
we provide unicode strings to db.
* src/lib/reccard.py (IngredientEditorModule.quick_add): Make sure
we provide unicode strings to DB.
(DescriptionEditorModule.save): Make sure we provide unicode strings.
2009-12-02 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/check_encodings.py (GetFile.__init__): Divide lines
using built-in splitlines() function -- this fixes problems with
line breaks on e.g. mac text files.
* src/lib/importers/importManager.py (ImportManager.finish_web_import):
Print information about importer being used.
2009-12-01 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/GourmetRecipeManager.py (RecGui.setup_main_window): Add
right-click menu back to main interface (we use the contents of
the action menu for the right-click).
* src/lib/reccard.py (RecCardDisplay.update_yields_multiplier):
Fix updating of yield_unit on yield_change.
2009-11-29 Thomas M Hinkle <tom@minime>
* src/lib/prefsGui.py (PreferencesGui): Make PreferencesGui
pluggable.
* src/lib/plugins/nutritional_information/__init__.py: ++
preferences plugin
* src/lib/plugins/nutritional_information/export_plugin.py (NutritionBaseExporterPlugin):
Add preference that allows user to turn off nutritional export
altogether or to turn it off when information is only partial.
* src/lib/plugin.py (BaseExporterPlugin.add_field): Add parameter
write_empty_field (which defaults to False) to determine whether
we add custom fields with no content.
(DatabasePlugin.remove): Change "deactivate" call to "remove",
which was what was intended (deactivate is called when the
pluggable is destroyed; remove is called when the plugin is
deactivated).
(PrefsPlugin): Add base class for adding tabs to preferences
dialog.
* src/lib/plugin_loader.py (MasterLoader.register_pluggable): Fix
typo.
* glade/preferenceDialog.glade: Remove hardcoded email
preferences (if we want them back, they belong in the email
plugin).
2009-11-22 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py (CustomUnitOption):
Add custom widget for setting margins that allows adjusting of
units (cm/inch/points).
(PdfPrefGetter.get_args_from_opts): Save page layout preferences
correctly.
* src/lib/gtk_extras/optionTable.py (OptionTable.createOptionWidgets):
Add CustomOption option for callers who want to provide their own
widget for setting an option.
* src/lib/plugins/nutritional_information/export_plugin.py (NutritionBaseExporterPlugin.get_nutritional_info_as_text_blob):
Escape items in case they have &s or other characters that screw
up XML.
2009-11-21 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/pdf_plugin/print_plugin.py (PDFRecipePrinter.begin_print):
Try to raise an error if there's a problem with the PDF.
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py (PdfPrefTable):
Use prefs to save pdf settings automatically.
* src/lib/gtk_extras/optionTable.py (OptionTable.createOptionWidgets):
Fix bug where having a default value of 0 made any other value
unsettable.
* src/lib/reccard.py (RecCardDisplay.print_cb): Move repetitive
code to printmanager.
* src/lib/exporters/printer.py (PrintManager.print_recipes): Move
basic printing code to PrintManager.
* src/lib/GourmetRecipeManager.py (ImporterExporter.print_recs):
Move repetitive print code to print manager so we can do things
like handle exceptions elegantly there.
2009-11-20 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/nutritional_information/export_plugin.py (NutritionBaseExporterPlugin.get_nutritional_info_as_text_blob):
Fix typo that broke printing.
* src/lib/GourmetRecipeManager.py (GourmetApplication.setup_recipes):
Clarify code around autosave.
* src/lib/plugins/nutritional_information/reccard_plugin.py (NutritionDisplayModule.enter_page):
Fix keyError bug on initialization.
* src/lib/plugins/nutritional_information/nutritionLabel.py (NutritionLabel.setup_yield_label):
Use singular form for "amount per ___" yield unit.
* src/lib/plugins/nutritional_information/export_plugin.py (NutritionBaseExporterPlugin.get_nutritional_info_as_text_blob):
Use singular form for "amount per ____" yield unit.
* src/lib/shopgui.py (ShopGui.setup_main): Don't show window
initially.
* src/lib/reccard.py (RecCardDisplay.update_yields_multiplier):
Use singular forms when settings yields to 1.
2009-11-19 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py (write_ingref):
Only write links that will work -- we do this by tracking which
recipes are going into our document and checking links against
that list of recipes.
* src/lib/plugins/import_export/pdf.gourmet-plugin.in: Change name
and description to reflect this plugin's new status as the primary
printing provider.
* src/lib/exporters/printer.py: Add simple message telling user
which plugin to install to get printing if there is no printing.
* src/lib/exporters/exporter.py (ExporterMultirec.append_referenced_recipes):
Add method to automatically append referenced recipes to the list
of recipes to be exported.
* src/lib/plugin_loader.py (MasterLoader.deactivate_plugin_set):
Fix typo that broke deactivation of plugins.
2009-11-17 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* src/lib/GourmetRecipeManager.py (ImporterExporter.print_recs):
Use new printing API to print.
* src/lib/plugin.py (PrinterPlugin): Add new plugin for printing.
* src/lib/reccard.py (RecCardDisplay.print_cb): Use new printing
API to print.
* src/lib/shopgui.py (ShopGui.doSave): No longer use "lprprinter"
to do text save.
(ShopGui.printList): Use new printing API to print.
* src/lib/exporters/printer.py: Rewrite printer.py to use a plugin
architecture. If no plugins are available, no printing. The
expected plugin will be the PDF plugin using Reportlab.
* plugins/import_export/pdf_plugin/print_plugin.py: Create plugin
for new printing plugin architecture.
2009-11-06 Thomas M Hinkle <tom@minime>
* src/lib/plugins/import_export/website_import_plugins/__init__.py (plugins):
++new AllRecipes plugin
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py (PdfPrefTable):
Add preference widget that can be embedded in print preview
dialog (in preparation for new printing back-end using
poppler+reportlab)
* src/lib/backends/db.py (RecData.update_version_info): Make sure
we do updates for 0.14.7 ++ for people updatings from versions
before 0.14
2009-11-01 Thomas M. Hinkle <Thomas_Hinkle@sf.net>
* lib/GourmetRecipeManager.py Make sure all actions w/o icons are
marked as important (fixes Gourmet in horizontal-toolbar mode)
* lib/plugin.py ditto (fix Gourmet in horizontal-toolbar mode)
* lib/reccard.py ditto (fix Gourmet in horizontal-toolbar mode)
* lib/shopgui.py ditto (fix Gourmet in horizontal-toolbar mode)
* lib/gtk_extras/__init__.py (fix_action_group_importance): New
convenience method to make sure all actions in an ActionGroup that
don't have icons are marked important
2009-10-31 Thomas M Hinkle <tom@minime>
* src/lib/plugins/key_editor/recipeEditorPlugin.py (IngredientKeyEditor.update_from_ingredient_editor_cb.process_row):
Handle groups correctly.
* README: Fix sql dependencies.
2009-08-26 Thomas Hinkle <Thomas_Hinkle@sf.net>
* data/ABBREV.txt
* data/WEIGHT.txt
* data/FOOD_DES.txt update nutritional database version to SR21
2009-08-22 Thomas M Hinkle <tom@minime>
* glade/recCardDisplay.glade: Fix add-to-shopping-list button (use stock id)
2009-08-18 Thomas M Hinkle <tom@minime>
* src/lib/shopgui.py (ShopGui.__init__): Fix bug that screwed up
positions of panes in shopping list view.
2009-08-15 Thomas M Hinkle <tom@minime>
* src/lib/version.py (version): Push version to 0.15.0 (will be
stable release -- dependencies, alas, have changed enough that
0.13.x has become unstable on up-to-date systems.
* create_manifest.py: Add style/ directory to manifest.
* src/test_gui.py (BasicTests.tearDown): Make sure processes
really die.
* src/lib/threadManager.py (ThreadManagerGui.__init__): Add title
to default dialog.
* src/lib/reccard.py (TextFieldEditor.setup_main_interface): Add
a11y names for all entries to help make dogtail-based testing
easier.
* src/lib/importers/interactive_importer.py: Fix default tags to
include tags for all text fields.
* src/lib/importers/importManager.py (ImportManager.offer_web_import):
Remove "." from dialog title (Enter website address)
* src/lib/importers/generic_recipe_parser.py (RecipeParser):
Include notes in list of fields automatically parsed.
(RecipeParser.ing_matcher): Fix typo in regexp that made any line
starting with the letter "a" look like in ingredient (require a
space between number or article and word)
* src/lib/gglobals.py (REC_ATTRS): Fix typo that put extra colon in yield unit field.
2009-08-06 Thomas M Hinkle <tom@minime>
* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.IGNORE):
Ignore style tag.
* src/lib/plugins/import_export/web_import_plugin/generic_web_importer_plugin.py (GenericWebImporter.get_importer):
Fix typo (get_web_importer -> self.get_web_importer
2009-08-03 Thomas M Hinkle <tom@minime>
* src/lib/plugins/key_editor/keyEditor.py (KeyEditor.__init__):
Fix case of 'key' (error caused extra search to be run on
launching keyEditor.py)
(KeyStore.limit): Only limit if text has changed.
(KeyStore.get_recs): Fix recipe fetching (old DB change --
id->recipe_id in ingredients table)
2009-07-28 Thomas M Hinkle <tom@minime>
* src/lib/reccard.py (RecCardDisplay.multiplication_change_cb):
Implement multiplication again.
2009-07-15 Thomas M Hinkle <tom@minime>
* src/lib/ImageExtras.py (get_pixbuf_from_jpg): Create one unique
tempfile per session, rather than hardcoding name
gourmet_tempfile, which breaks Gourmet in multiuser
environments (bug #271712)
* windows/gtkrc: Remove custom theme to try to work around bug
with vertical notebooks (see bug #2768204)
* src/lib/plugin_loader.py (MasterLoader.load_plugin_directories):
Fix hardcoded / in glob path. Fix from Julianne Sharer.
2009-07-14 Thomas M Hinkle <tom@minime>
* src/lib/importers/interactive_importer.py (InteractiveImporter.commit_changes):
Fix syntax error in last commit (parens).
* src/lib/defaults/defaults_de.py: Unicodify strings (u'')
* src/lib/convert.py (float_to_metric): Use integer format
code (%i) instead of string format-code which allows decimals to
slip through formatting algorithm when they shouldn't (and
non-localized decimals at that)
(float_string): Allow people with commas as decimal separators to
correctly parse recipes from period-separated locales where
unambiguous (e.g. 23.00 and not 23.000).
2009-06-27 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/importers/interactive_importer.py (InteractiveImporter.commit_changes.mark_sorter):
Handle markup in title of recipe in imageBrowser dialog window.
2009-06-18 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/* Get rid of old debugging print statements throughout library.
* src/lib/importers/interactive_importer.py (InteractiveImporter.setup_window):
Set parent to threadManagerGui dialog.
* src/lib/version.py: version->0.14.10
* src/lib/threadManager.py (ThreadManagerGui.__init__): Make
thread manager dialog transient for main Gourmet window if not
told who its transient for.
2009-06-17 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/gxml_plugin/gxml_exporter_plugin.py (GourmetExportChecker.check_attrs):
Fix tests (read files as utf-8)
* src/lib/plugins/nutritional_information/reccard_plugin.py: servings->yields
* src/lib/plugins/nutritional_information/nutritionLabel.py: servings->yields
* src/lib/plugins/nutritional_information/export_plugin.py (NutritionBaseExporterPlugin.get_nutritional_info_as_text_blob): servings->yields
* src/lib/GourmetRecipeManager.py (StuffThatShouldBePlugins.batch_edit_recs):
Remove obsolete FieldEditor (moved to plugin).
2009-06-17 Thomas M Hinkle <tom@minime>
* src/lib/keymanager.py (KeyManager.__init__): Initialize categories again.
2009-06-16 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/nutritional_information/nutritionDruid.py (NutritionInfoDruid.apply_custom):
Fix custom information for fat.
2009-06-07 Thomas M Hinkle <tom@minime>
* src/lib/recipeManager.py (DatabaseShopper.init_orgdic): Use new
initailize method of dbDic
(DatabaseShopper.init_pantry): Use new initialize method of dbDic
* src/lib/plugin_loader.py (MasterLoader.default_active_plugin_sets):
Fix typo in list of plugins (missing comma).
* src/lib/backends/db.py (dbDic.initialize): Add fast method for
initializing a dbDic from defaults (faster than adding rows one at
a time)
* src/lib/keyEditor: Get rid of cruft (moved to plugin long ago)
* src/lib/keymanager.py (KeyManager.__init__): Speed up
initialization of keydic. Don't initialize each word in keydic
from defaults (this should be part of the key editor plugin -- in
our default mode, our users don't really care about keys (they
always get the defaults) so we don't need to worry about setting
up the DB for search (which is costly and makes first load seem
unduly slow).
* src/lib/version.py (version): Version->0.14.9
2009-06-04 Thomas M Hinkle <tom@minime>
* src/lib/plugin_loader.py (MasterLoader.default_active_plugin_sets):
Add spellcheck to plugins that default to on.
* src/lib/gtk_extras/TextBufferMarkup.py (PangoBuffer.get_text):
Ignore tags that we didn't put there (such as those from
gtkspell).
* src/lib/plugins/spellcheck*: Add spellcheck plugin (adds
automatic spell checking to all TextViews in recipe card editor.
* src/lib/convert.py (NUM_AND_FRACTION_REGEXP): Fix typo for
langauges without fraction support (ubuntu bug #352678)
* test_deb.sh: Wipe out packages installed by python2.6 as well.
* src/lib/reccard.py (RecCard.__init__): ++ get app if not handed
GRM instance.
* src/lib/plugin.py (RecEditorPlugin): ++documentation
* src/lib/gtk_extras/dialog_extras.py (MessageDialog.setup_dialog):
++title on dialog (helps out with testing w/ dogtail + just makes
sense).
2009-06-04 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/importers/interactive_importer.py: Add support for old
style "servings" tags to support legacy importer/markup scripts.
* src/lib/importers/importer.py (Importer.commit_rec): Make sure
yields is floated.
2009-05-30 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/reccard.py (RecSelector.ok): If recipe has a yields
value, ask user how much they would like to add (this allows user
to specify e.g. "3 cups" or "2 crusts", which is easier than
changing the amount of recipes, which is what shows up in the
ingredient list.
(YieldSelector): Dialog for selecting amount of recipe based on
yields value.
(getYieldSelection): Convenience function for grabbing amount of
recipe based on yields value (or not).
2009-05-30 Thomas M Hinkle <tom@minime>
* src/lib/test_plugin_loader.py: Add simple plugin_loader test
file.
* src/lib/gtk_extras/dialog_extras.py (ProgressDialog.setup_buttons):
Bypass strange bug in pygtk with python2.6 which effectively
changes ToggleButton API
* Release 0.14.8
2009-05-29 Thomas M Hinkle <tom@minime>
* gourmet.desktop.in (_Comment): Update description of app.
* setup.py (maybe_intltool): Apply patch from Rupert Swarbrick
<rswarbrick@googlemail.com> which avoids running intltool-merge
when not necessary.
2009-05-28 Thomas M Hinkle <tom@minime>
* MANIFEST: Don't include test_* files in MANIFEST.
2009-05-26 Thomas M Hinkle <tom@minime>
* src/lib/plugins/browse_recipes/browser.py (RecipeBrowserView.build_base_model):
Don't include yields in browser.
2009-05-25 Thomas M Hinkle <tom@minime>
* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_importer_plugin.py (test_dir):
Look for sample recs in src/tests/recipe_files...
* src/lib/exporters/test_exportManager.py (TestExports.testSingleExport):
Improve error message when plugin's check_export method throws an
error.
2009-05-24 Thomas M Hinkle <tom@minime>
* src/lib/importers/xml_importer.py (Converter.do_run): Make sure
we get added_recs from recHandler class.
* src/lib/importers/importer.py (Importer.__init__): Get
keymanager using new singleton access method.
* src/lib/importers/importManager.py (ImportManager.import_filenames):
make import_filenames return a list of importer instances that we
used.
2009-05-24 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/exporters/exportManager.py (ExportManager.get_extra_prefs):
Add method for handling of extra prefs (through UI or
automagically).
(do_multiple_export): Use get_extra_prefs / extra_prefs parameter
(ExportManager.do_single_export): Use get_extra_prefs /
extra_prefs parameter
2009-05-24 Thomas M Hinkle <tom@minime>
* src/lib/plugins/import_export/gxml_plugin/gxml_exporter_plugin.py (GourmetExportChecker):
Add class for testing exports for validity.
(GourmetExporterPlugin.check_export): Run export checker.
* src/lib/exporters/test_exportManager.py (TestExports.testSingleExport):
Run plugin's check_export script if it has one (allows plugins to
implement their own test).
* src/lib/reccard.py (IngredientController.get_extra_ingredient_attributes):
Don't throw error if item is blank/None
2009-05-23 Thomas M Hinkle <tom@minime>
* src/tests/recipe_files/mealmaster.mmf: Add custom yield (6 puffs
for Almond puff)
* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_importer.py (mmf_importer.handle_line):
Add support for yields units other than servingts.
2009-05-19 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/exporters/exporter.py (exporter.__init__._grab_attr_):
Fix handling of yield/yield unit output.
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter_plugin.py (PdfExporterPlugin.get_default_prefs):
Use DEFAULT_PDF_ARGS for default PDF prefs.
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py: Update default PDF args.
* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_exporter_plugin.py (MealmasterExporterPlugin.get_multiple_exporter):
Remove obsolete args (conv/prog)
* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_exporter.py (mealmaster_exporter.__init__):
Get mealmaster_importer from plugin, not from obsolete location
inside Gourmet's main libraries.
* src/lib/plugins/import_export/html_plugin/html_exporter.py (website_exporter): Update servings->yields
* (Head): Rename test suites (*_tests.py -> test_*). I had
preferred the alphabetization of *_tests.py, but a number of
unittest tools are written to work only the other way.
2009-05-17 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/nutritional_information/nutrition.py (NutritionData.get_nutinfo_for_ing):
Catch very unusual corner case where i.rangeamount and i.amount
don't add cleanly (this means something's wrong with the inputs --
but the least we can do is display a nicer error message).
* src/lib/backends/db_tests.py (TestMoreDataStuff.test_modify_rec):
Add test to make sure modify_rec is working.
(TestMoreDataStuff.test_modify_ing): Add test to make sure
modify_ing is working (this would have caught the regression in my
last commit).
* src/lib/backends/db.py (RecData.add_ings): Move fix previously
put in validate_ingdic here (putting it in validate_ingdic has bad
side effects -- oops)
(validate_ingdic): Remove code put here earlier today (it caused
modify_ing, etc. to delete data)
* src/lib/importers/importer_tests.py: Add new test suites for
base import class (including test against regression of today's
new bugfix)
* src/test_gourmet.py: Add new tests suites.
* src/lib/importers/interactive_importer_tests.py: basic test
suite for interactive importer (created to track down bug with
"disappearing" ingredient units).
* src/lib/importers/importer.py (RatingConverter.get_conversions):
Fix converter (bad import call)
* src/lib/backends/db.py (RecData.validate_ingdic): Make sure
ingdic includes keys for all columns. This avoids a very nasty bug
when executing an insert statement with more than one
row (basically, we'd drop random columns if the rows didn't all
have the same columns).
2009-05-16 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/test_gourmet.py: Add unit testing script (currently tests DB
and convert backends.)
* src/lib/backends/db_tests.py: Convert db tests to use unittest
module.
* src/lib/convert_tests.py: Add testing file for our convert module.
2009-05-15 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/tests/recipe_files/athenos.mx2: Add test mastercook file for importing.
src/lib/plugins/import_export/gxml_plugin/gxml2_importer.py (RecHandler.endElement):
Add code for parsing yields field into yields and yields_unit.
* src/lib/plugins/import_export/gxml_plugin/gxml2_exporter.py (recipe_table_to_xml.__init__):
Change servings to yields.
* src/lib/backends/db_tests.py (test_unicode): Extend tests of
unicode support.
2009-05-10 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/importers/xml_importer.py (Converter.__init__): Get rid
of self.name assignment (Thread throws an error otherwise)
* src/lib/backends/db.py (RecData._force_unicode): Force unicode
for modify methods as well (fixes traceback on import with
non-unicode text that was getting fed straight to sqlite.
2009-05-07 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/exporters/exporter.py (exporter_mult._grab_attr_): Add yields/yield_unit
(exporter.__init__._grab_attr_): Add support for yields/yield_unit
2009-05-05 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/threadManager.py (SuspendableThread.__init__): Don't set name attribute on Thread (pass it to Thread.__init__() call (setting name throws an error in python 2.6)
* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.__init__):
No longer set name attribute (this breaks the python 2.6
implementation of Thread)
* src/lib/importers/interactive_importer.py: Add yield_unit to
buttons.
2009-05-01 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/recipeIdentifier.py (get_ingredient_hash): md5 ->
hashlib (remove deprecated md5 lib)
* src/lib/gtk_extras/thumbnail.py (check_for_thumbnail): md5 ->
hashlib (remove deprecated md5 lib)
* src/lib/backends/db.py : Fix unicode type errors from sqlalchemy.
* src/lib/*: Change servings->yields
2009-03-27 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/exporters/exportManager.py (ExportManager.offer_multiple_export):
Include any recipes linked to in your recipes in your export.
* src/lib/backends/db.py (RecData.include_linked_recipes): Add
convenience method to append linked recipes (from
recipe-as-ingredient) to a list of recipes.
2009-03-26 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/gtk_extras/dialog_extras.py (saveas_file): If we can't
guess our file type based on the extension, use whatever is
selected in the filetype combo box as fallback.
* src/lib/exporters/exportManager.py (ExportManager.offer_multiple_export):
Show error message if we don't get an export type.
* src/lib/backends/db.py (RecData.get_amount_and_unit): Don't
require conv argument to be passed (switching to singleton design
pattern...)
2009-03-26 Artis Rozentāls <artis.rozentals@gmail.com>
* src/lib/plugins/nutritional_information/nutrition.py (NutritionData.set_key_from_ndbno):
Fix association editing.
2009-03-24 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/html_plugin/html_exporter_plugin.py (HtmlExporterPlugin.get_multiple_exporter):
Eliminate obsolete arguments (progress_func is no longer needed
with our new signal interface and converters are now gotten using
a singleton design pattern.
2009-03-14 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugin_gui.py (PluginChooser.do_change_plugin): Display
error to user when loading a plugin fails. Give suggestions as to
how to install dependencies in case of import error.
* src/lib/plugin_loader.py (MasterLoader): Remove key_editor from
default plugin set. This is a lot of functionality to put on
people who don't want it -- removing it greatly simplifies Gourmet
for those not interested.
(MasterLoader.__init__): Add class variable 'errors' to keep track
of errors raised in instantiating plugins, etc. This allows
plugin_gui to display these errors to users. Use this variable
when instantiating PluginSets to keep track of error messages our
users may want.
2009-03-07 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/shopgui.py (ShopGui): Prevent ShopGui window from
getting destroyed on delete-event (when user closes window from WM
control).
2009-03-01 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/shopgui.py (ShopGui.item_added): Make sure added items
don't end up in the pantry.
2009-02-28 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/listsaver: Added plugin (this was in the tarball
released earlier, but had accidentally not been added to CVS).
2009-02-22 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/key_editor/recipeEditorPlugin.py (IngredientKeyEditor.update_from_ingredient_editor_cb):
Fix typo that caused weirdness in ingredient key editor
view (where key of last ingredient in list got propogated to
ingredients as they were added).
(IngredientKeyEditor.update_from_ingredient_editor_cb): Actually
guess the key using keyManager rather than just cutting off key
after the semicolon.
* src/lib/reccard.py (IngredientEditor): Remove old
IngredientEditor class (This has all been simplified or moved to
plugins).
* src/lib/keymanager.py (KeyManager.look_for_key): Change math on
key lookup slightly so that multi-word keys such as "chocolate
chips" get penalized when matching on single-word
items ("chocolate"), just as we would punish "chocolate" for being
only one word in "chocolate chips".
* src/lib/plugins/key_editor/keyEditor.py (KeyEditor.__init__):
Create our own keymodel (old use of rg.rd.inginfo is obsolete).
2009-02-21 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/version.py - Version-> 0.14.7. Released 0.14.7
tarball+deb to SF
2009-02-21 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/nutritional_information/main_plugin.py (NutritionMainPlugin.activate):
Fix add_icon call.
* src/lib/plugins/nutritional_information/__init__.py (plugins): Add shopping list plugin
* src/lib/shopgui.py (ui): Add placeholder to file menu for
plugins to add things above "close".
(ShopGui.__init__): Add ShoppingListPlugin
* src/lib/reccard.py (IngredientEditorModule.add_ingredient_from_line):
Fix ingredient-adding for lines with no amount.
* src/lib/plugin.py (ShoppingListPlugin.__init__): Fix
ShoppingListPlugin API (no menu_bars params necessary, just a ui
string)
* src/lib/gglobals.py (add_icon): Fix add_icon to work as
advertised.
2009-02-19 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/GourmetRecipeManager.py (GourmetApplication.setup_prefs):
Use singleton method to get prefs
(GourmetApplication.setup_shopping): No arguments necessary now to
get ShopGUI
2009-02-18 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugin.py (ShoppingListPlugin): Add ShoppingListPlugin
class.
* src/lib/shopgui.py: Complete overhaul of the shopping UI -- we
now use a UIManager based GUI in place of the glade-based one from
previous Gourmet versions. This allows us to be easily pluggable,
among other things. In addition to converting the interface, a
"Change Category" button has been added to the toolbar so that it
does not require right-clicking to discover (those right-clicking
still works).
2009-02-16 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/python_shell/ipython_view.py: Import IPython
outright -- if there's an ImportError, let the plugin fail to
instantiate (this makes sense, since the plugin won't work without
IPython)
* src/lib/exporters/exporter.py (exporter.__init__.handle_markup):
Handle case where handle_markup is handed None
* Release 0.14.6 tarball and .deb to SF.net
* src/lib/check_encodings.py (EncodingDialog): Fix type on encodings.
(EncodingDialog.diff_texts): Make sure we base our diffs on the
encoding with the most lines. Otherwise, utf-16 screws us up in
most cases so the diff-view no longer works properly.
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py (PdfExporter.__init__):
Sshhh.
* src/lib/gtk_extras/dialog_extras.py (MessageDialog): Allow
passing modal=False to make this a non-modal dialog.
* src/lib/GourmetRecipeManager.py (RecGui.offer_url): Make dialog
non-modal -- the modal dialog was freezing up Gourmet after user
clicked "Jump to" button.
2009-02-15 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/nutritional_information/databaseGrabber.py (DatabaseGrabber.parse_abbrevfile):
Use new do_add_fast and commit_fast_adds method to drastically
speed-up initial population of nutritional DB
(DatabaseGrabber.parse_weightfile): Use new do_add_fast and
commit_fast_adds method to drastically speed-up initial population
of nutritional DB.
* src/lib/backends/db.py (RecData.do_add_fast): Add method that
uses sqlite (bypassing sqlalchemy) to add to the DB. This
substantially speeds up adding things to the DB. The method
returns nothing (unlike do_add, which returns a reference to the
added object) and we need to call commit_fast_adds in order to
commit the additions to the DB.
(RecData.commit_fast_adds): A method to commit anything added
using do_add_fast
2009-02-13 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/shopping_associations/shopping_key_editor_plugin.py (KeyEditorPlugin):
Add text box that allows editing shopping category for multiple
selected ingredient keys at a time.
* src/lib/plugins/nutritional_information/data_plugin.py (NutritionDataPlugin.create_tables):
Use Text() type from sqlalchemy instead of deprecated
String(length=None)
* src/lib/plugins/key_editor/recipeEditorPlugin.py (IngredientKeyEditor.setup_main_interface):
Make TreeView allow multiple selections so we can do actions on
multiple keys at once.
(IngredientKeyEditor.setup_main_interface): Setup any extra
widgets provided by plugins.
* src/lib/plugins/key_editor/keyEditorPluggable.py (KeyEditorPlugin):
Update API to allow plugins to provide a widget for changing value
for all selected rows.
* src/lib/backends/db.py (RecData.alter_table): Use embedded
select in insert statement rather than pythonic for-loop to loop
through data -- this is enormously faster.
* src/lib/reccard.py (RecEditor.ui): Remove KeyEditor (moved to plugin)
(UndoableTreeStuff.record_positions): Fix mess with attribute name changes.
* src/lib/GourmetRecipeManager.py (GourmetApplication.show_about):
Remove colons from strings marked for translation.
2009-02-08 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/key_editor/keyEditor.py (KeyEditor.tree_edited):
rd.update -> rd.update_by_criteria (correct method name)
* src/lib/defaults/defaults.py: Fix SF bug #1947796 where calling
Gourmet with an unsupported locale broke Gourmet and made it fail
to start.
2009-02-07 Thomas Mills Hinkle <tom@hydrophax>
* glade/recCardIngredientsEditor.glade: Simplify ingredient
interface -- remove detailed expander widget. We now simply have
an "Add" textbox and a list of ingredients. All of the complexity
of ingredient keys is hidden in this view now, leaving our basic
interface simpler and cleaner.
* src/lib/plugin.py (RecEditorPlugin): Create RecEditorPlugin
class.
(RecEditorModule.__gsignals__): Add signals 'saved' and
'toggle-edited' to RecEditorModule for communicating state-changes
of individual modules.
(IngredientControllerPlugin): ++IngredientControllerPlugin.
* src/lib/reccard.py (RecEditor.add_plugin): Rework
plugin-interface as part of making ingkey-editor plugin a recipe
card editor module.
(DescriptionEditorModule.save): Use new signal interface to
indicate saved.
(IngredientController): Make controller pluggable so that plugins
can add info to ingredients if they like.
(IngredientTreeUI.setup_columns): Remove ingredient key and
shopping category from standard treeview -- these are now only
visible with plugins.
* src/lib/version.py (version): Version->0.14.6
2009-02-03 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/defaults/defaults_en_GB.py: Replace missing
comma (syntax error)
* src/lib/version.py: Version->0.14.5 for release
* src/lib/reccard.py: Change icon to new recipe card/editor icons.
2009-02-01 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/key_editor/keyeditor.glade: Remove "Edit
nutritional info" button.
* src/lib/plugins/key_editor/keyEditor.py (KeyEditor): Remove
references to nutritional info. Update to work with current DB
front-end.
* src/lib/gtk_extras/treeview_extras.py (selectionSaver.add_selection):
Fix mysterious bug that occurred when we tried to use sqlalchemy
0.5 rowobjects as dictionary keys.
(selectionSaver.restore_selections): Fix mysterious bug that
occurred when we tried to use sqlalchemy 0.5 rowobjects as
dictionary keys.
* src/lib/backends/db.py (RecData.get_ingkeys_with_count):
Implement the functionality needed for a keyEditor interface.
* src/lib/gglobals.py: ++ png icons for reccard and reccard_edit.
2009-01-31 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/unit_display_prefs: New plugin that allows user
to specify which kinds of units to display, resulting in
displaying e.g. all metric units without the need to tinker with
the underlying data.
* src/lib/defaults/defaults_en_GB.py (CONVERTER_TABLE): Add units for
non-American cups (Japanese cup, metric cup, imperial cup,
imperial pint).
* src/lib/defaults/defaults_en.py (CONVERTER_TABLE): same change as defaults_en.py
* src/lib/defaults/defaults.py (unit_rounding_guide): Add
parameter unit_rounding_guide (which can be overridden in the
defaults_XX files). This allows us to hone what kinds of decimal
values we show for different units.
* src/lib/backends/db.py (RecData.get_amount_and_unit): Make
get_amount_and_unit take arguments favor_current_unit and
preferred_unit_group to allow further control over how it handles
conversion. Also make pluggable, enabling our new
unit_display_prefs plugin to do its work.
* src/lib/shopping.py (Shopper._ing_compare): Disable special
ingorder comparisons, falling back to alphabetical. In the future,
it would be worth looking into what was implemented and why it was
failing -- I've simply disabled the functionality since it wasn't
working properly anyway.
* src/lib/reccard.py (RecCardDisplay.toggle_readable_units_cb):
Fix reference to obsolete method resetIngList (replaced by
display_ingredients)
* src/lib/plugin_loader.py (Pluggable.run_pre_hook): Changed API
around pre_hook -- pre-hooks can now modify the args fed to the
function they're hooking around by returning args,kwargs as the
return value. If they don't return a tuple and a dictionary, then
we fail with a warning (this means the old API will fail with a
warning until I update old plugins that use this).
(pluggable_method._): Changed pre-hook API (see above)
* src/lib/convert.py (float_to_metric): Changes to float-to-metric
to allow rounding based on an approx value rather than always
assuming we want 2 decimal points.
(float_to_frac): Return a simple integer if we're within approx of
an integer.
(Converter.adjust_unit): Accept a parameter
preferred_unit_groups. If we have this parameter, we look for
conversions within our preferred groups and convert if possible. A
group could be, e.g. metric mass, metric volume, imperial volume,
etc., as defined in UNIT_GROUPS in defaults.
(Converter.readability_score): Adjust scoring algorithm: being a
weird decimal is less bad than being out of the defined range (I
was getting values like 2034 mL instead of 2 L because it
preferred the integer (2034) to the decimal even though the
integer was outside the preferred range for mL).
2009-01-28 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/reccard.py: Add shop-recipe to menus. Add key commands
for most menu items.
* glade/shopList.glade: Remove nutritional info button/icon (this
should become a plugin anyway)
* test_deb.sh (LATEST_DEB): Remove python version specificity.
* Released 0.14.4 to SF as .deb and .tar.gz
* src/lib/gtk_extras/treeview_extras.py (selectionSaver.restore_selections):
Change variable names from iter->itr (to avoid unintended
consequences). Unsuccessfully trying to get at mysterious
traceback in restore_selections and add_selection (somehow builtin
dictionary method get() is not working).
* images/reccard.ico: Added reccard icon
* images/Nutrition.png: Moved to the plugin
* src/lib/plugins/nutritional_information/images/Nutrition.png: Moved from images/
2009-01-27 Thomas Mills Hinkle <tom@hydrophax>
* create_manifest.py: Add png's to plugin files to include; add images/*.ico to included files.
* gourmet.desktop.in (Categories): Category->Utility
* setup.py: Apply debian patch; include png etc.
* src/lib/plugins/nutritional_information/main_plugin.py (NutritionMainPlugin.activate):
Add nutritional icon.
* src/lib/plugins/import_export/website_import_plugins/foodnetwork_plugin.py (test_url):
Be less verbose.
* src/lib/plugins/import_export/website_import_plugins/about_dot_com_plugin.py (test_url):
Be less verbose.
* src/lib/gtk_extras/treeview_extras.py: Remove python version
dependency
* src/lib/version.py (version): Version->0.14.4
(copyright): ++2009
* src/lib/threadManager.py (ThreadManagerGui): Fix resizing
ugliness on table (it's still ugly, but less so)
* src/lib/reccard.py (RecCardDisplay.setup_main_window): Add icon
(RecEditor.setup_main_interface): Add icon
* src/lib/gglobals.py (add_icon): Rework code for adding icons to
make it easy for plugins to add stock icons using the convenience
function add_icon
* src/lib/gdebug.py: Remove python version dependency.
* src/lib/GourmetRecipeManager.py (RecGui.setup_main_window): Add icon to window.
2009-01-19 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/timeScanner.py (make_time_links): Remove line that
escaped text automatically (caller can handle escaping)
2009-01-18 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/gtk_extras/TextBufferMarkup.py (PangoBuffer.set_text):
Give a better error message when we have problems with unescaped
text.
* src/lib/gtk_extras/LinkedTextView.py (set_text): Remove line
that unescapes incoming text (this was an attempt to fix another
bug in the wrong place, but it causes problems when the clients
are behaving properly...)
(set_text): Remove line that unescapes incoming text (see above
comment about dumb fixes creating more problems than they solve).
* src/lib/plugins/python_shell/ipython_view.py: Eitan Isaacson's
IPython console widget, with a few modifications.
* src/lib/plugins/python_shell/__init__.py (ConsolePlugin): Plugin
to allow access to a python shell from within Gourmet. This is
incredibly handy for testing/development. It also allows a
super-geeky user to modify their DB on the fly etc.
* src/lib/plugins/field_editor/__init__.py (FieldEditorPlugin.show_field_editor):
Grab GourmetApplication singleton rather than relying on pluggable
being the GourmetApp, which it isn't always.
* src/lib/plugins/browse_recipes/browser.py (RecipeBrowserView):
to selection-multiple mode
(RecipeBrowserView.get_selected_recipes): Add handy method to grab
selected recs.
(RecipeBrowserView.reset_model): Add handy method to reset model
in response to DB updates.
* src/lib/plugins/browse_recipes/__init__.py (BrowserPlugin): Set
up hooks so that actions-on-recipes work (add-to-shopping list,
delete, etc)
* src/lib/backends/db.py (RecData.fetch_count): Fix fetch_count to
actually work as described. Previously, it ignored criteria.
(RecData.fetch_len): Fix fetch_len to actually use criteria.
* src/lib/plugin_loader.py (Pluggable.run_post_hook): Post hooks
should be allowed to modify the return value -- now they're
required to do so (otherwise they change the return value of the
method to None, of course.
* src/lib/GourmetRecipeManager.py (RecGui.get_selected_recs_from_rec_tree):
Add this method here as a pluggable_method so that plugins can
implement recipe browsers/search of their own and have it work
with actions that require selected recipes.
(RecGui.update_recipe): Make pluggable
(RecGui.redo_search): Make pluggable
(RecGui.delete_open_card_carefully): Use
get_selected_recs_from_rec_tree for deletion (this allows plugins
to simply modify get_selected_recs_from_rec_tree and have deletion
of selected recipes work right)
(RecGui.rec_tree_delete_recs): Add call to show user a message
telling them they've deleted recipes and offering undo.
(RecGui.setup_delete_messagebox): Method to set up a message to
user offering undo after delete.
2009-01-16 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/field_editor.gourmet-plugin.in: Added field
editor plugin (provides material previously in valueEditor
module).
* src/lib/GourmetRecipeManager.py (showValueEditor): Removed value
editor -- this is now a plugin (field-editor).
* src/lib/ValueEditor.py - removed file (moved to field_editor plugin)
2009-01-13 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/browse_recipes/images/cooktime_empty_clock.png:
Adjust pixel height so preptime and cooktime clock-pie-wedges can
be drawn with same size and position
* src/lib/batchEditor.py (BatchEditor.setup_glade): Use new
gglobals-based custom handler system.
* src/lib/GourmetRecipeManager.py (StuffThatShouldBePlugins.batch_edit_recs):
Fix batch edit callback (self.update_rec_iter ->
self.rmodel.update_recipe
2009-01-13 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/backends/db.py (RecData.fetch_count): Correctly alias
select "COUNT AS COUNT" using sqlalchemy's "label" keyword,
avoiding ugly hack that fails in 0.5 anyway.
* src/lib/exporters/exportManager.py (ExportManager.do_single_export):
Fix API for exporting single recipes (this fixes recipe export
from recipe card view).
2009-01-12 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/backends/db.py (make_order_by): Sort nulls last
(RecData.search_recipes): Special case sorting of 'rating' (the
default feels backwards)
2009-01-11 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/browse_recipes/browser.py (RecipeBrowser.append_button):
Use i18n'd text rather than attribute names themselves for
breadcrumbs buttons.
(RecipeBrowserView.get_pixbuf): Use generic icons differentiated
by attribute (source, category, etc)
(RecipeBrowserView.build_base_model): Don't browse by link attribute.
(RecipeBrowserView.get_base_icon): Use base icons from icon_helpers.py
* src/lib/plugins/browse_recipes/icon_helpers.py (get_pixbuf_from_image):
Add the rest of the icons.
2009-01-11 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/importers/imageBrowser.py (ImageBrowserDialog.setup_dialog):
Fix giant-dialog-window problem caused when Progressbar gets
super-long text (e.g. if an image name is gigantic). Fixes Ubuntu
bug #289861
* src/lib/backends/db.py (make_simple_select_arg): Update in_()
call to comply with SQLAlchemy 0.5 API change.
2009-01-10 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/backends/db.py (RecData._setup_object_for_table): All
tables need an explicit primary key declared now -- sqlalchemy no
longer supports implicit oid/rowid in 0.5
(RecData.setup_info_table): Add sqlite rowid column to table
explicitly.
* src/lib/plugin.py (MainPlugin): Add base methods to MainPlugin
to make it easy to add a tab to main interface (add_tab)
* src/lib/GourmetRecipeManager.py (RecGui.setup_main_window): Add
notebook to which plugins can add tabs.
2009-01-07 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/nutritional_information/parser_data.py (ABBREVS):
Remove RED as abbreviation (and add more specification
abbreviations like RED NA, RED FAT, RED CAL). (bug # 2492442)
* src/lib/plugins/browse_recipes/* Implement basic recipe browsing
interface as alternative to search (a new plugin).
2009-01-03 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/duplicate_finder/recipeMerger.glade: Add
auto-merge button to glade file. Rename some buttons for
convenient handling from recipeMerger dialog.
* src/lib/importers/plaintext_importer.py (TextImporter.pre_run):
Change attribute total to total_lines to avoid confusing ourbase
class into thinking that we know how many recipes have based on
how many lines we have (this fixes a bug where users would see
something like "Imported 56 of 5000 recipes" for a 5000 lines text
file with 56 recipes in it).
* src/lib/importers/importManager.py (ImportManager.__init__): Add
support for ImportManager plugins (which are separate from our
standard ImporterPlugins). This allows our RecipeMerger plugin to
add a post-import hook.
* src/lib/plugin.py (ImportManagerPlugin): Add base class for
plugings that modify the ImportManager itself (not new import
plugins which are already covered by the ImporterPlugin)
* src/lib/plugins/duplicate_finder/recipeMergerPlugin.py (RecipeMergerImportManagerPlugin):
Separate out plugin that adds a check for duplicates after new
imports
* src/lib/plugins/duplicate_finder/recipeMerger.py (RecipeMergerDialog.merge_next_recipe):
Add label to interface showing how many recipes have been merged
so far (giving user a sense of progress).
(RecipeMergerDialog): Add last_modified time to list of attributes
shown to user so they can see which recipe is older/newer.
(RecipeMergerDialog.offer_auto_merge): Add option to automatically
merge, always selecting for newer or older recipes.
* src/lib/GourmetRecipeManager.py (GourmetApplication.setup_recipes):
Remove misleading catchall database connection error message
* src/lib/check_encodings.py (getEncoding): Fix typo that broke
encoding dialog by always returning ascii
2008-12-28 Thomas Mills Hinkle <tom@hydrophax>
* README: Cut down README to keep it from going out of date so
fast; update README to describe plugin system; add reportlab as a
requirement.
2008-12-22 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_exporter_plugin.py (MealmasterExporterPlugin):
Mealmaster file are text/plain, not text/html
* src/lib/plugins/import_export/gxml_plugin/gxml_exporter_plugin.py (GourmetExporterPlugin.get_multiple_exporter):
Remove obsolete references to progress_func
* src/lib/plugins/import_export/gxml_plugin/gxml2_exporter.py (__init__):
Remove obsolete references to progress_func
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter_plugin.py (PdfExporterPlugin.get_default_prefs):
Add method to bypass prefs dialog when necessary.
* src/lib/gtk_extras/dialog_extras.py (get_type_for_filters):
Separate function to grab the type of a file based on the filters
used to save it. Split this out of the functions that get the
actual file.
* src/lib/exporters/exportManager.py (ExportManager): Split off
separate do_multiple_export and do_single_export methods to allow
outside functions/plugins to use exporters without having the user
select the file name/type through the UI.
* src/lib/backends/db.py (RecData.backup_db): Warn user when doing
a DB update with little/no feedback on progress.
* src/lib/plugin.py (ExporterPlugin): Add get_default_prefs method
as alternative to run_extra_prefs_dialog (to enable full
automation, for example, of libraries that like to ask users for
prefs)
* src/lib/plugins/email_plugin/*: Pluginify email
functionality. We now just support PDF and plain text (the HTML
was a failed attempt to write HTML email anyway)
* TESTS: Add some more tests we should do before stable releases.
2008-12-21 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/plaintext.gourmet-plugin.in (_Comment):
++export.
* src/lib/plugins/import_export/plaintext_plugin/__init__.py: Add
plaintext_exporter to plaintext_plugin.
* src/lib/backends/db.py (RecData.backup_db): Let user know when
we're doing a potentially slow DB upgrade (note that this is
implemented directly in GTK so the DB code now depends on GTK at
least in the upgrade spot; if we ever properly abstract the DB for
another front-end we'll need to rework this.
* src/lib/plugin.py (BaseExporterPlugin.add_field.do_write): Don't
pass mark-up to exporters that expect plain text.
2008-12-19 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/tests/testImporters.py (ImportTestCase.testArchive): Add
test of archive plugin
* src/lib/plugins/import_export/archive_plugin/zip_importer_plugin.py (ArchiveImporterPlugin.test_file):
Fix file pattern matching using fnmatch.
* glade/preferenceDialog.glade: Hide label for removing items you
don't use from recipe card interface, since this interface isn't
currently functional anyway.
* src/lib/exporters/exporter.py (exporter): Create new
ALLOW_PLUGINS_TO_WRITE_NEW_FIELDS attribute (defaults to True).
* src/lib/plugins/import_export/gxml_plugin/gxml2_exporter.py (rec_to_xml):
Don't allow plugins to create new fields since supposedly we could
be creating valid XML and plugins would create a moving target.
* src/lib/plugin.py (BaseExporterPlugin.add_field.do_write):
Respect new exporter attribute ALLOW_PLUGINS_TO_WRITE_NEW_FIELDS
which allows exporters to prevent their write_attr/write_text
methods from being called with new plugin-invented fields
* src/lib/importers/importManager.py (ImportManager.get_filters):
Remove repeat filetypes in file dialog filter dropdown + add "All
importable files" filter as default file filter.
* src/lib/check_encodings.py (EncodingDialog.create_options): Make
encodings in encoding choosing dialog follow order given in source
code for encodings/all_encodings (presumably the order of common
to uncommon).
(getEncoding): If user cancels dialog, give them the first
encoding on the list rather than throwing an error.
2008-12-19 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/check_encodings.py: Fix bug #2446589 by adding utf-16 to
our list of commonly tried encodings. Also, fix a bug in
check-encodings/diffy code.
2008-12-16 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.__init__):
Instantiate InteractiveImporter in __init__.py call.
* src/lib/importers/imageBrowser.py (grab_thumbnail): Ignore errors
in thumbnail creation (with warning).
* src/lib/plugins/nutritional_information/data_plugin.py (NutritionDataPlugin.do_add_nutrition):
Add do_add_nutrition convenience method (fix bug #2405494)
2008-12-15 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugin_loader.py (MasterLoader.register_pluggable):
Fixed warning message.
* src/lib/GourmetRecipeManager.py (SuspendableDeletions): Create
class for running deletions in their own thread. This used to be
in the moribund GourmetThreads module.
(purge_selected_recs): Update deletion code to work with new
threadManager module.
(ImporterExporter): Get rid of unused old code.
(purge_rec_tree): Remove old lock-checking code.
(RecGui.purge_rec_tree): Update deletion code to work with new
threadManager module.
* src/lib/gtk_extras/LinkedTextView.py (LinkedPangoBuffer.set_text):
Unescape all text so that markup outside of links works
properly (fixes bug where <span> tags showed up in recipe card
display view.)
2008-12-13 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/exporters/exportManager.py (ExportManager.offer_single_export):
Give us a useful error message when ignoring an invalid file mode.
* src/lib/backends/db.py (RecData._format_amount_string_from_amount):
Don't set default here to be FRACTIONS_ALL. Instead, default to
use the converter default (whatever that has been set to). This
will be correct as far as i18n etc.
2008-12-13 Thomas Mills Hinkle <tom@hydrophax>
* src/tests/testImporters.py: Update testImporters to work with
importManager.
* src/tests/test.py: Use same method gourmet_in_place uses for
making sure we use our version of Gourmet libraries and not ones
installed elsewhere in system.
(profile): Add convenience function for profiling calls.
* src/lib/plugins/unit_converter/convertGui.py (ConvGui.__init__):
Use new convert.get_converter() method instead of
convert.Converter()
* src/lib/plugins/nutritional_information/enter_nutritional_defaults.py:
Use new get_converter() method.
* src/lib/plugins/import_export/mastercook_import_plugin/mastercook_importer_plugin.py (MastercookTextImporterPlugin.get_importer):
Fix typo (actually return an importer object instead of none).
* src/lib/plugins/import_export/mastercook_import_plugin/mastercook_importer.py (MastercookXMLHandler.IngR_handler):
Update start_ing() call (we no longer set recipe_ids before
commit-time.
* src/lib/plugins/import_export/gxml_plugin/gxml2_importer.py (RecHandler.endElement):
Make sure our keys in our dictionary rec are all strings and not
unicode objects (this throws an error on the DB side).
* src/lib/version.py (version): 0.14.3 - Get ready for another release soon.
* src/lib/importers/importer.py (Importer.__init__): use new
get_converter() method to get Converter singleton. This speeds up
import by a factor of 3 or so (we were wasting a lot of time
instantiating new Converter classes all the time because we
weren't passing it around as designed. It's easier just to use the
singleton and not have to worry about remembering to pass the
converter instance back and forth.
(Importer.check_for_sleep): Fix name error (we no longer import
anything as gt)
(Importer.start_rec): Add a warning when ingredients are left from
previous recipe at start of next recipe.
(Importer.start_rec): Don't generate new id in start_rec code.
(Importer.commit_rec): Fix IDs here -- if we have an ID from our
importer, we add it here to our ID converter (or get it from our
ID converter if we already created it -- if, for example, another
recipe in the import referenced this recipe before it was
created). We also add ingredients to the database all at once now
rather than making separate INSERT calls for each ingredient.
(Importer.start_ing): No longer set recipe_id up in start_ing --
it will be handled in commit_rec now.
(Importer.finish_ing): Change commit_ing to finish_ing as we no
longer commit our ingredients here (we commit all ingredients
together in commit_rec. This should help speed up imports.
(Importer.commit_ing): commit_ing is now an alias for finish_ing
-- this enables all our old code to keep working. However, if any
old code actually depended on commit_ing commiting the ingredient
to the database, it will break. The model now is that we run
start_ing and finish_ing for each ing before running commit_rec.
(MultipleImporter): Remove MultipleImporter class. This is now
handled in importManager (and has been for some time)
* src/lib/importers/importManager.py (ImportManager.__init__):
Singleton exception should be the first thing that happens here.
(ImportManager.get_app_and_prefs): Move the get_application() call
out of __init__ for convenience of subclassing (this allows the
creation of non-gui-dependant subclasses easily.
* src/lib/gtk_extras/timeEntry.py (TimeEntry.__init__): use new
get_converter() method to get Converter singleton.
* src/lib/exporters/exporter.py (exporter.__init__): use new
get_converter() method to get Converter singleton.
* src/lib/backends/db.py (RecData.initialize_connection): Run
commit() once after initialization. This appears to fix a problem
where some importers were throwing a "database locked" error on
import if no recipe had been created yet in that instance of the
application.
(RecData.add_rec): Always return ID of recipe (it was
unpredictable before whether this would return an ID or an object.
* src/lib/timeScanner.py (c): use new get_converter() method to
get Converter singleton
* src/lib/recipeManager.py (DatabaseShopper.init_converter): use
new get_converter() method to get Converter singleton
* src/lib/recipeIdentifier.py (hash_recipe): use new
get_converter() method to get Converter singleton
* src/lib/convertGui.py (ConvGui.__init__): Converter is now a singleton.
(get_converter): Convenience method to get the Converter singleton.
* src/lib/convert.py (Converter.__single): Converter is now a singleton.
(get_converter): Convenience method to get the Converter singleton.
* src/lib/GourmetRecipeManager.py (GourmetApplication.__init__):
use new get_converter() method to get Converter singleton
(GourmetApplication.setup_prefs): Make sure that we set
useFractions the same way from prefs and from user toggling.
2008-12-06 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/importers/importManager.py: Remove broken import of
zip_importer (this has moved into a plugin)
* test_tarball.sh: Print contents of TESTS as a reminder of what
to test.
* create_manifest.py (STARTER_LIST): Include TESTS file in MANIFEST
* MANIFEST: Include TESTS file in MANIFEST (list of common tests
we should run on releases -- this might be something downstream
packages want to make sure they run through.
* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.get_images):
Ignore <img> tags with no src= attribute (I didn't realize there
were such tags)
* src/lib/recipeIdentifier.py (apply_line_markup): Don't throw
error when we get diff markup we don't expect
* src/lib/gglobals.py (launch_url): Project Ridley -
gnome.url_show -> gtk.show_uri
* MANIFEST Update manifest.
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter_plugin.py (PdfExporterPlugin.do_single_export):
Fix name of method.
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py (PdfExporter.__init__):
Fix handling of output arg that is an open file.
2008-12-04 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/gtk_extras/treeview_extras.py (print_tree): Add a handy
convenience function for debugging treeview changes
(move_iter): Fix destination description on drag-n-drop
calls. This should fix dnd.
* src/lib/gdebug.py (debug_decorator): Add handy decorator for
quick debugging.
2008-12-02 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/import_export/html_plugin/html_exporter_plugin.py (HtmlExporterPlugin.do_single_export):
Fix single export (export from recipe card view)
* src/lib/reccard.py (RecCardDisplay.ui): Eliminate KeyEditor (it's a plugin now).
(IngredientEditorModule.setup_action_groups): Shorten button names
for ingredient editing toolbar.
(TextEditor): Add generic TextEditor base class with copy/paste/cut support.
(DescriptionEditorModule.ui): Add "Cut" item
(TextFieldEditor.ui): Add "Cut" item
(TextFieldEditor.setup_action_groups): Add rich text editing (bold/italic/underline)
(IngredientController.get_path_from_persistent_ref): Avoid
throwing error when we don't find an iter (return None instead)
(IngredientController.commit_ingredients.commit_iter): Save new
ingredient object into ListStore -- this fixes bug that broke
editing of new ingredients once committed.
(UndoableTreeStuff.record_positions): Fix typo (rc->re)
2008-12-01 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/backends/db.py (RecData.setup_info_table): String->Text
fix to avoid annoying warning.
(make_simple_select_arg): Make sure we use unicode in our select
args.
2008-11-23 Thomas Hinkle <Thomas_Hinkle@sf.net>
* setup.py: Fix typo that prevented new import/export .in files from being i18n'd.
2008-11-23 Thomas Mills Hinkle <tom@hydrophax>
* setup.py (crawl): Automate addition of plugin directories to
setup.py script.
2008-11-23 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugins/import_export/krecipe_plugin.gourmet-plugin.in:
Port old krecipe importer to new plugin system.
* src/lib/plugins/import_export/krecipe_plugin/ New krecipe plugin.
* src/lib/threadManager.py (ThreadManagerGui.thread_done): Handle
case where there is no text when we're done with progress bar;
show completed processes as progress 100% no matter what.
* src/lib/plugin_loader.py (MasterLoader): Add all import/export
as defaults (these don't clog up the interface, so why not include
them).
* src/lib/GourmetRecipeManager.py (GourmetApplication.quit): Fix
error saving recipe card on quit.
2008-11-22 Thomas Hinkle <Thomas_Hinkle@sf.net>
This is the warning-fix edition, where we get rid of all the
annoying warnings on Gourmet startup!
* src/lib/backends/db.py: Use Text() class explicitly for strings
without length limit instead of deprecated String(length=None
* src/lib/GourmetRecipeManager.py (RecGui.__init__): Add action
group search_action before calling setup_main_window -- this gets
rid of annoying warning about missing actions on startup.
* src/lib/recindex.py (RecIndex.setup_reccolumns.get_colnum): cell
renderers take pango.WRAP_* enums, not gtk.WRAP_* enums
* src/lib/reccard.py (IngredientDisplay.setup_widgets): cell
renderers take pango.WRAP_ enums, not gtk.WRAP_* enums.
* glade/preferenceDialog.glade: Fix deprecation error about
setting an adjustment with non-zero page size.
2008-11-20 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py:
Change back to BeautifulSoup instead of BeautifulStoneSoup -- this
makes sure we know about, e.g., standard self-closing tags.
2008-11-17 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/import_export/gxml_plugin/gxml2_exporter.py (rec_to_xml.write_text):
Make sure we don't create element names with spaces in them.
2008-11-15 Thomas Mills Hinkle <tom@hydrophax>
* src/lib/plugins/import_export/web_import_plugin/webpage_importer.py (WebParser.add_buffer_to_parsed):
Add code to cycle through MS chars and eliminate those that
remain/were foobarred by beautifupsoup.
2008-11-11 Thomas Mills Hinkle <thomas_hinkle@users.sf.net>
* src/lib/importers/importManager.py (ImportManager.finish_web_import):
Recognize mimetypes with ;'s and encoding declarations to fix
issue reported at
https://sourceforge.net/forum/message.php?msg_id=5619998
2008-11-08 Thomas Mills Hinkle <thomas_hinkle@users.sf.net>
* src/lib/plugin_loader.py: Catch plugin errors and display as
warning; don't let plugin failures bring down whole app at
start-up.
2008-10-27 Thomas Hinkle <Thomas_Hinkle@sf.net>
* Version->0.14.2
* src/lib/importers/html_importer.py: Don't import old
html_plugins directory
v * setup.py (result): Add new plugins.
(data_files): Fix data files.
* src/lib/backends/db.py (RecData.backup_db): Automatically make a
copy of the database when we're about to do a DB update, just in
case something ugly happens.
2008-10-27 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/plugin_loader.py: Add debug calls to make it easy to see
what plugins are being loaded from where with a -v flag.
* src/lib/backends/db.py (RecData.do_add): On ValueError, try
coercing our dictionary of column->values into proper types or
None and reinserting. This fixes a bug with the update code, where
empty strings were being passed where we needed null (None).
2008-10-25 Thomas Hinkle <thomas_hinkle@users.sourceforge.net>
* Release 0.14.1
2008-10-25 Thomas Mills HInkle <tom@hydrophax>
* src/lib/recindex.py (RecIndex.setup_widgets): Make
search-as-you-type the default.
* create_manifest.py: Add data directory
* src/lib/plugins/import_export/gxml.gourmet-plugin.in: This is an
import and export plugin
2008-10-25 Thomas Mills HInkle <thomas_hinkle@users.sourceforge.net>
* MANIFEST: Include data/ directory.
* src/lib/legacy_db/db_085/rdatabase.py (mkConverter.create_conv_table):
Fix capitalization of converter.Converter
2008-10-18 Thomas Mills HInkle <thomas_hinkle@users.sourceforge.net>
* src/lib/gtk_extras/mnemonic_manager.py: Fix mnemonic-manager's
handling of submenus. Automatically add TreeViews to mnemonic
manager.
* src/lib/GourmetRecipeManager.py: Add mnemonic-manager calls to
resolve conflicts.
* src/lib/reccard.py: Add mnemonic-manager calls to resolve
mnemonic conflicts.
2008-10-16 Thomas Mills HInkle <thomas_hinkle@users.sourceforge.net>
* src/lib/plugins/import_export/web_import_plugin/* - Add web
import plugin. We've removed the fully-automated web import in
favor of a preparser to the interactive importer; this means that
work we do building scrapers can only help, since users can always
fall-back to fully manual marking up if the scraper does a bad
job.
* src/lib/plugins/import_export/website_import_plugins/* - Add web
import plugin plugin for helping scrape specific websites (food
channel, about.com, etc).
* src/lib/importers/interactive_importer.py
(InteractiveImporter.commit_changes): Add image browser dialog
back to interactive importer (if self.images is populated)
* src/lib/plugin_loader.py (MasterLoader.activate_plugin_set):
Don't iterate over the dictionary since we might modify it.
* src/lib/plugin.py (PluginPlugin): Create PluginPlugin class for
allowing Pluggables in plugin classes -- we have plugin plugins
specify a target string so that different pluggable plugins can
differentiate among themselves. (This is currently used only for
allowing the web importer to accept plugins).
2008-10-13 Thomas Mills HInkle <thinkle@sf.net>
* src/lib/plugin_loader.py (Pluggable.__init__): Be less verbose...
* src/lib/GourmetRecipeManager.py (print_recs): Remove gt.* calls.
* src/lib/exporters/gnomeprinter.py: Correct printing (we were
using old exporter API in which exporter's did export on
instantiation. We now work with the new API, though printing is
not properly threaded (this is a one-line fix to get printing back
for now -- printing should be reworked with the different printers
written as plug-ins etc).
* src/lib/gglobals.py (GladeCustomHandlers.__init__.custom_handler):
Be less verbose.
2008-10-12 Thomas Mills HInkle <thomas_hinkle@users.sourceforge.net>
* src/lib/plugins/import_export/pdf_plugin/pdf_exporter.py: Move
finish-up code out of PdfExporter.__init__ and into write_foot, so
that it happens after writing the recipe (this reflects a change
in the design of exporters -- everything used to happen on
instantiation, but with threading, everything should happen in the
do_run call that can be run as a separate thread.
* src/lib/plugin_loader.py: Fix dependency checking. Add
check_if_depended_upon and make deactivating a dependee plugin
deactivate depender plugins well.
* src/lib/plugin_gui.py (PluginChooser): Check dependencies when
activating and deactivating and act appropriately. Automatically
activate dependencies. Ask users when deactivating a
depeneded-upon plugin.
* src/lib/sound.py (Player.play_file): Remove debug print statement
2008-10-12 Thomas Mills Hinkle <thomas_hinkle@sf.net>
* src/lib/reccard.py (IngredientController.commit_ingredients.commit_iter):
Fix null amounts (they should be None, not the empty string).
2008-10-12 Thomas Mills HInkle <thomas_hinkle@sf.net>
* src/lib/plugin_loader.py: Remove excess print statements. Don't
write duplicate entries for plugins in saved_plugins file.
* src/lib/GourmetRecipeManager.py: Remove all obsolete
gt.threads calls
* style/default.css: Make title sans-serif
* src/lib/exporters/gnomeprinter.py (renderer.write_paragraph):
Catch IndexErrors if we're trying to break a string with no spaces
in it.
2008-10-03 Thomas Mills HInkle <thomas_hinkle@sf.net>
* src/lib/importers/interactive_importer.py Add support for
'ignore' tag in parsed data. This will lead to "hidden" text (we
display a button to un-hide it if the user so chooses).
* src/lib/importers/generic_recipe_parser.py (RecipeParser.parse):
Add 'ignored' keyword to base parser (this allows a preparser to
mark some text not worth the user seeing (for example, banner ads
in HTML import)
* src/lib/backends/db
* src/lib/plugins/import_export/web_import_plugin Port basic
web import plugin to plugin system. Still not clear on how
we'll do web import plugin plugins.
2008-08-10 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/exporters/xml_exporter.py (XmlExporter.append_text):
Raise a clear type error when handed non-text.
* src/lib/backends/db.py (RecData): Fix alter table and
add-column-to-table routines. Add new table plugin_info for
storing version info on plugins, so that plugins know the Gourmet
version and Plugin version at the last time of
instantiation (since a plugin could have been in use, then out of
use, then reactivated after an upgrade).
* src/lib/plugin_loader.py (MasterLoader.activate_plugin_set):
Avoid activating a plugin set twice.
* src/lib/plugin.py (DatabasePlugin.activate): Update database
plugin code to work with new versioning code for telling plugins
about version changes reliably. Fix bug in exporter plugin when we
get a None where we expect text.
2008-08-10 Thomas Hinkle <Thomas_Hinkle@sf.net>
* src/lib/exporters/xml_exporter.py (XmlExporter.append_text):
Raise a clear type error when handed non-text.
* src/lib/backends/db.py (RecData): Fix alter table and
add-column-to-table routines. Add new table plugin_info for
storing version info on plugins, so that plugins know the Gourmet
version and Plugin version at the last time of
instantiation (since a plugin could have been in use, then out of
use, then reactivated after an upgrade).
* src/lib/plugin_loader.py (MasterLoader.activate_plugin_set):
Avoid activating a plugin set twice.
* src/lib/plugin.py (DatabasePlugin.activate): Update database
plugin code to work with new versioning code for telling plugins
about version changes reliably. Fix bug in exporter plugin when we
get a None where we expect text.
2008-07-24 Thomas Mills HInkle <thomas_hinkle@sf.net>
* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_importer_plugin.py (MealmasterImporterPlugin.test_file):
Fix typo but that made no file look like a Mealmaster file.
* src/lib/importers/xml_importer.py: Stop passing around recData
instances (use singleton pattern instead). Also, fix
capitalization of classes.
* src/lib/importers/interactive_importer.py: Rewrite interactive
importer to allow removing tags once applied and to include
auto-markup of recipes. The UI is basic but functional now, with a
number of obvious improvements yet-to-be-made. Once this UI is
mature, it is likely many imprecise importers will be implemented
as preparsers for the interactive importer rather than as their
own importers.
* src/lib/importers/importManager.py (ImportManager): Add code to
handle web-based import (asking user for URL, fetching file,
finding importer)
* src/lib/importers/generic_recipe_parser.py (RecipeParser.parse):
Update code to work with threadManager based progress-reporting
* src/lib/backends/db.py (RecData.update_version_info): Fix
indentation error bug in version update that meant that in new
installations, the version was being set to an old verison,
resulting in an attempt to run upgrade code on the 2nd run.
* src/lib/threadManager.py (NotThreadSafe): Add class
NotThreadSafe for the somewhat hackish purpose of allowing
e.g. importer classes that touch the GUI. By inheriting
NotThreadSafe, subclasses will ensure that such classes are not
run in their own threads, no matter what, even when they look like
they should be.
* src/lib/plugin.py (ImporterPlugin.test_url): Add web methods
test_url and get_web_importer to ImporterPlugin base class. By
default, these methods act on normal files (which our
importManager will retrieve for us), so nothing special has to
happen except for importers that might, for example, need to know
the URL whence a file came.
* src/lib/GourmetRecipeManager.py (ImporterExporter.import_webpageg):
Move import code for web import to importManager where it belongs
2008-07-08 Thomas Mills HInkle <thomas_hinkle@sf.net>
* src/lib/importers/importManager.py (ImportFileList): Add a way
to handle an importer calling more importers -- specifically, we
allow ourselves to raise an exception that contains a list of
files, thus circumventing any threading problems that would happen
from calling importManager methods within an importer.
* src/lib/plugin.py (ImporterPlugin.get_importer): Update method
name in accordance with actual usage (we return an importer class
rather than doing the import here, so the import manager can
handle threading etc.
* src/lib/importers/plaintext_importer.py (TextImporter.__init__):
Remove rd argument from TextImporter.
* src/lib/plugins/import_export/ Add mealmaster plugin to cvs. Add
plugin to handle zip archives and tarballs.
* src/lib/recipeManager.py (get_recipe_manager): Add
get_recipe_manager name as alias for poorly named
default_rec_manager (the right thing would be just to replace the
name, but I'm lazy just now)
* src/lib/importers/importer.py (Importer): Rename class Importer
in accord with conventions. Remove rd argument (as we move to
singleton pattern to handle this). Remove prog arguments (as we
move to SuspendableThread to handle this). Move convenience
function add_to_fn to this file
2008-06-01 Thomas Hinkle <tmhinkle@gmail.com>
* Release 0.14.0
* src/lib/plugins/duplicate_finder/recipeMergerPlugin.py: Get rid
of all GourmetThreads calls (as we plan to delete that module).
* src/lib/importers/importManager.py (ImportManager.offer_import):
Call make_rec_visible when we're done importing to show newly
imported recipes.
* src/lib/version.py (copyright): ++ last 2 years
* src/lib/gglobals.py: Get rid of attempts to use gnomevfs
* setup.py: Remove obsolete nutrition module
* create_manifest.py: Create a script to generate a MANIFEST
automatically (this is what MANIFEST.in should do, but trying to
use MANIFEST.in was turning into a living hell, so I gave up and
hand-coded a script to do the job more easily)
* test_tarball.sh: Add call to new MANIFEST-generating script +
clear out old directories from /tmp/ before starting.
* src/lib/reccard.py (RecCardDisplay.ui): Remove e-mail
stuff (this will be reimplemented as a plugin).
* src/lib/GourmetRecipeManager.py: Remove all e-mail stuff (this
will be reimplemented in a plugin).
2008-05-24 Thomas Mills Hinkle <tmhinkle@gmail.com>
* setup.py (result): Change location of import/export plugins.
* src/lib/reccard.py (RecCardDisplay.update_image): Show/hide
image when image has been created or removed.
(ImageBox.commit): Fix typo that raised error.
2008-05-20 Thomas Mills HInkle <tmhinkle@gmail.com>
* src/lib/backends/db.py (RecData.initialize_connection): Handle
newer sqlalchemy API
* src/lib/threadManager.py: Add Terminated exception class
* src/lib/GourmetRecipeManager.py: Make use of new threading for
export and import
* src/lib/gglobals.py: Remove old threading stuff
* src/lib/prefs.py: Make Prefs a singleton
* src/lib/exporters/exportManager.py: Use threadManager
* src/lib/exporters/exporter.py: Use threadManager
* src/lib/gtk_extras/dialog_extras.py (ModalDialog.setup_expander):
Put expander into a scrolled window so we don't create monstrous
dialogs that exceed the screenspace.
* src/lib/importers/*: Continue working to port importers to
threadManager and to plugins...
2008-04-26 Thomas Mills HInkle <tmhinkle@gmail.com>
* src/lib/plugins/import_export/mealmaster_plugin/mealmaster_exporter.py (mealmaster_exporter.write_text):
Fix from Christopher Donham (#1151150)
2008-04-23 Thomas Mills HInkle <tmhinkle@gmail.com>
* src/lib/gtk_extras/dialog_extras.py (ModalDialog.setup_expander):
Add expander text in scrolled window in case it's too big to fit
in one dialog
2008-03-05 Thomas Mills HInkle <tmhinkle@gmail.com>
** Note - I'm half-way through re-implementing importers and
import plugins.
* src/lib/threadManager.py : Create a new module to handle
threading (so we can move this out of GourmetRecipeManager.py and
handle it more carefully. This will lead to the elimination of
GourmetThreads.py and GourmetFauxThreads.py
* src/lib/importers/__init__.py (Module): Remove importer set-up
code from here. It now belongs in the new file name
importManager.py
* src/lib/keymanager.py (get_keymanager): Make KeyManager a singleton.
* src/lib/GourmetRecipeManager.py (GourmetApplication.__init__):
Use new import manager to do imports.
2008-02-25 Thomas Mills HInkle <tmhinkle@gmail.com>
* glade/recCardDescriptionEditor.glade: Put recipe card
description into its own Glade file (part of UIManager rewrite)
* glade/recCardDisplay.glade UIManager rewrite
* glade/recCardIngredientsEditor.glade UIManager rewrite
* glade/recipe_index.glade - Move recipe index view into its own
individual glade file
* src/gourmet_in_place Update gourmet_in_place script to i18n .in files.
* src/lib/gtk_extras/timeEntry.py (make_time_entry): Rename
makeTimeEntry to make_time_entry for consistency with new coding
style.
* MANIFEST: Add many of plugins to Manifest. (This probably isn't
all-the-way-updated yet though).
* Various-other-files-I'm-too-lazy-to-track Making the change to a
plugin system, this means adding logs of plugins and moving around
import/export modules. As of this commit, exporters have been
fully plugin-a-fied; importers have yet to be converted properly.
2008-02-24 Thomas Mills HInkle <tmhinkle@gmail.com>
* gourmet.desktop.in: This is now the gourmet desktop file (built
into an i18n'd version with intltool).
* setup.py : Add calls to intltool to build desktop files. Add new
export_plugins.
2008-01-26 Thomas Mills HInkle <tmhinkle@gmail.com>
* src/lib/gglobals.py: Add our own icons as stock icons.
* src/lib/backends/db.py (RecData.get_amount_as_float): Our new
SQLAlchemy class can make amounts show up as floats *or* integers.
2008-01-18 Thomas Mills HInkle <tmhinkle@gmail.com>
* setup.py: Proper i18n of desktop file and plugin information files.
* gourmet.desktop.in: Proper i18n of desktop file.
* glade/app.glade Remove app.glade
* glade/converter.glade Remove converter.glade -- this now belongs
in the UnitConverter plugin.
* glade/recCardDescriptionEditor.glade Break recCard.glade into pieces
* glade/recCardDisplay.glade Break recCard.glade into pieces.
* glade/recCardIngredientsEditor.glade Break recCard.glade up
* glade/recipe_index.glade Main search view (replaces app.glade)
* src/lib/plugins/key_editor/*: Create keyEditorPlugin (move
keyEditor from src/lib/keyEditor to here).
* src/lib/plugins/key_editor.gourmet-plugin.in: Add Key Editor
plugin.
* src/lib/plugins/unit_converter.gourmet-plugin.in: Add Unit
Converter plugin.
* src/lib/plugins/nutritional_information.gourmet-plugin.in: Add
nutritional information plugin.
* src/lib/plugins/nutritional_information/* Move files from
src/lib/nutrition/ here. Create reccard_plugin, main_plugin and
data_plugin
* src/lib/plugins/duplicate_finder.gourmet-plugin.in: Add
duplicate_finder plugin.
* src/lib/gtk_extras/timeEntry.py (make_time_entry): Use proper
function_or_method_style name for function (was makeTimeEntry)
* src/lib/exporters/*: Fix Converter capitalization.
* src/lib/backends/db.py (RecData): Make RecData pluggable.
(RecData.__init__): Make RecData a singleton (on a per-file basis
-- that is, we keep a dictionary of database files and only allow
one instance to be created per file. Also, add a _created flag so
plugins can tell if they're being plugged in before or after the
creation of the DB.
(RecData.setup_tables): Make setup_tables pluggable.
(setup_nutrition_tables): Remove all nutrition table setup code -
this is now implemented in the nutrition plugin.
(RecData.update_version_info): Add code to run the plugin method
update_version()
(get_database): Add method to grab singleton database.
* src/lib/shopgui.py: Remove nutritional information code -- will
be reimplemented as part of our plugin.
* src/lib/recipeManager.py (default_rec_manager): Return singleton
RecipeManager() (singleton for a given db file, that is)
* src/lib/reccard.py: Remove nutrition items and import new plugin
framework -- nutrition is now a plugin!
(GladeCustomHandlers): Remove GladeCustomHandlers -- this is now
part of gglobals. Update code to use gglobals.gladeCustomHandlers.
(RecCard.set_edited): Allow edited property to be set (when
GourmetApplication saves, it does this)
(RecCardDisplay): Make RecCardDisplay pluggable.
(RecCardDisplay.setup_style): Make widgets white.
(RecCardDisplay.remove_plugin_to_left_notebook): Make it possible
to remove plugin
(RecEditor): Make RecEditor pluggable.
(DescriptionEditorModule.setup_main_interface): Use separate glade
file - recCardDescriptionEditor.glade
(TextFieldEditor.setup_main_interface): Workaround textview bug by
setting scroll policy to AUTOMATIC,AUTOMATIC even though we don't
really want it that way.
* src/lib/GourmetRecipeManager.py (GourmetApplication.__init__):
Make GourmetApplication a singleton -- this simplifies life here
on out.
(setup_nutrition): Remove - nutrition into a plugin
(quit): Update reccard calls to work with new recipe card.
(ImporterExporter.import_cleanup): Add plugin
hook (pluggable_method decorator) so that the recipeMerger plugin
can hook into imports.
(UnitModel): Move UnitModel from convertGui (which is now a
plugin) here.
(show_duplicate_finder): Remove - now a plugin
(show_duplicate_editor): Remove - now a plugin
(RecGui.__init__): Make Pluggable
(RecGui.setup_actions): Add show_plugin_chooser action. Remove
items that are now plugins
(get_application): Create convenience method to get our singleton
application.
* src/lib/Undo.py (UndoHistoryList.set_sensitive): Be less verbose.
(Module):
* src/lib/gglobals.py (GladeCustomHandlers): Add custom handler
code for glade here. Now anyone who needs a custom handler
registers it through the gladeCustomHandlers instance that's
instantiated in gglobals.
(Module):
* src/lib/plugin.py New plugin module. This provides the base
classes that plugins need to subclass.
(Module):
* src/lib/plugin_gui.py Dialog for turning plugins on and off.
* src/lib/plugin_loader.py Plugin management module. This provides
the base class that pluggables need to subclass, as well as
providing a nice decorator function for making individual methods
"pluggable" (i.e. for adding pre-hooks and post-hooks)
2008-01-17 Thomas Mills HInkle <tmhinkle@gmail.com>
* src/lib/gtk_extras/timeEntry.py (make_time_entry): Update
function name to new underscore_function_name norm
2008-01-09 Thomas Mills HInkle <tmhinkle@gmail.com>
* src/lib/convertGui.py:
* src/lib/recipeMerger.py:
2008-01-06 Thomas Mills HInkle <tmhinkle@gmail.com>
* glade/recCard.glade (Module): Reorganize glade file as we move
more of the UI construction into code and out of glade.
* src/lib/GourmetRecipeManager.py (Module): Reorganize module in
preparation for coming change to plugin basis. Separate out
various bits of RecGui class into sub-classes that make more sense
-- ImporterExporter, GourmetApplication, and so on. Use UIManager
and ActionManager to build UI rather than glade -- now we use
UIManager's nifty merging to handle our updated Go menu (formerly
View menu)
* src/lib/Undo.py (Module): Move undo stuff that was in reccard.py here.
* src/lib/batchEditor.py (Module): changed method names (from GourmetRecipeManager.py)
* src/lib/reccard.py (Module): Completely rearrange module. We
break recipe editor and recipe display into separate classes. We
use UIManager and ActionManager for the UI in preparation for the
coming plugin interface.
* src/lib/recindex.py (Module): Setup searchActions action group
for user with uimanager.
setup_search_views - respect the default_searches parameter.
searchentry_activate_cb - this callback belongs here and not in
subclasses.
* src/lib/backends/db.py: Allow sorting by category. Implement
duplicate-finding methods. make_simple_select_arg now supports
operators including "in"
* src/lib/defaults/defaults_en.py: Remove periods from units.
* src/lib/defaults/defaults_en_GB.py: Remove periods from units.
* src/lib/gtk_extras/ratingWidget.py: Don't throw an error when we
receive a click event w/ no selected row
* src/lib/nutrition/nutritionDruid.py: Use proper exception class
so that unicode doesn't throw an error in the error-throwing.
2008-01-04 Thomas Mills HInkle <thomas_hinkle@sf.net>
* src/lib/exporters/lprprinter.py (Module): Fix import statement
for dialog_extras (moved to gtk_extras)
* src/lib/exporters/winprinter.py (Module): Fix import statement
for dialog_extras (moved to gtk_extras)
2007-12-29 Thomas Mills HInkle <thomas_hinkle@sf.net>
* src/lib/convert.py (Module): adjust_amount - if we somehow have
units in our unit list that don't convert, print warning rather
than defaulting to no conversion.
* src/lib/defaults/defaults_en_GB.py (Module): Fix tsp/Tbs. Remove
periods after imperial unit names.
* src/lib/defaults/defaults_en.py (Module): Fix tsp/Tbs
conversion. Remove periods after imperial unit names.
* src/lib/backends/db.py (Module): Fix category modifications. Fix
amount-fetching convenience methods (apparently sqlalchemy can
return an integer out of a float field!?!) Fix dbDic.
2007-12-28 Thomas Mills HInkle <tmhinkle@gmail.com>
* Everywhere Change names of database tables from views (metakit
legacy) to table (current reality). Capitalize all classes.
* MANIFEST - Remove old database modules; add new one.
* test_tarball.sh - Assume python2.5 rather than python2.4
* glade/app.glade - Move search options to menus; hide and
simplify search interface by default (now that we have "search
anywhere")
* src/gourmet_in_place - Some improvements to make sure this gets
its glade and data files from the source directory.
* src/lib/convertGui.py (Module): Fix import statement to work
with the new code organization (gtk_extras.cb_extras)
* src/lib/gglobals.py (Module): Remove old database stuff (metakit
v sqlite etc), replace with new.
* src/lib/GourmetRecipeManager.py (Module) - Break up giant
__init__ method so it is more readable. Make hitting return work
if we are not in search-as-you-type mode.
* src/lib/OptionParser.py (Module) - Remove old database
options. Add --database-url argument for custom database
arguments.
* src/lib/recindex.py (Module): Add "anywhere" to search options
-- this allows us to search for a string in any of the columns
without specifying! Also, fix search-as-you-type toggle.
* src/lib/recipeManager.py (Module): Update to use new database.
* src/lib/timeScanner.py (Module): Update to use capitalized Converter class name.
* src/lib/upgradeHandler.py (Module): Fix import dialog_extras statement.
* src/lib/backends/__init__.py (Module): Remove inaccurate comments
* src/lib/backends/db.py (Module) - New database backend class
based on sqlalchemy. This provides at least the basis for support
for all sql dialects that sqlalchemy supports. You can try other
database settings by using the database-url argument to Gourmet.
* src/lib/backends/db_tests.py (Module) - Move tests that were at the
bottom of rdatabase.py to a separate test file.
* src/lib/backends/db/* - Remove old legacy database files.
* src/lib/gtk_extras/timeEntry.py (Module): Fix reference to
capitalized Converter() class
* src/lib/exporters/__init__.py (Module): Change rview_to_xml to
recipe_table_to_xml in accordance with our new freedom from
metakit semantics.
* src/lib/importers/imageBrowser.py (Module): Fix gtk_extras import.
* src/lib/importers/importer.py (Module): Fix gtk_extras import.
* src/lib/nutrition/nutritionDruid.py (Module): Fix up various import
statements for modules now in gtk_extras.
2007-11-19 Thomas Mills HInkle <thomas_hinkle@sf.net>
* src/lib/FileChooserSaveAs.py Class renaming - capitalize all class names.
* src/lib/convert.py Class renaming - capitalize all class names.
* src/lib/convertGui.py Class renaming - capitalize all class names.
* src/lib/reccard.py Class renaming - capitalize all class names.
* src/lib/recipeManager.py Class renaming - capitalize all class names.
* src/lib/shopgui.py Class renaming - capitalize all class names.
* src/lib/shopping.py Class renaming - capitalize all class names.
* src/lib/backends/rdatabase.py Class renaming - capitalize all class names.
* src/tests/reference_setup/recipes.db Class renaming - capitalize all class names.
2007-11-19 Thomas Mills HInkle <thomas_hinkle@sf.net>
* src/lib/exporters/gxml2_exporter.py Rearrange order of
attributes to be slightly more logical (with link following
source, since they are related).
2007-11-11 Thomas Mills HInkle <thomas_hinkle@sf.net>
* everything or close to it: Rearrange code -- move all defaults_*
files into defaults/. Move all widgety convenience libraries into
gtk_extras
2007-10-12 Thomas Mills HInkle <thomas_hinkle@sf.net>
* Fix non-GNOME fallback about dialog in GourmetRecipeManager.py
2007-09-12 Thomas M. Hinkle <thomas_hinkle@sf.net>
* i18n/ca.po Updated Catalan translation from Raul Cambero.
2007-09-10 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/defaults_de.py patch from SF user enfant_terribly fixing
up some problems in the German translation.
* src/lib/defaults.py patch from SF user enfant_terrible
fixing language support on Windows.
* src/lib/gettext_setup.py patch from SF user enfant_terrible
fixing language support on Windows.
* src/lib/GourmetRecipeManager.py patch from SF user
enfant_terrible fixing language support on Windows.
* src/lib/recipeMerger.py Properly destroy dialog on close.
* src/lib/exporters/html_exporter.py Actually apply the changes
logged on 8/25
* i18n/de_AT.po Updates from enfant_terrible
* i18n/de_DE.po Updates from enfant_terrible
2007-08-25 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/exporters/html_exporter.py Make recipe links hyperlinks.
2007-08-25 Thomas M. Hinkle <thomas_hinkle@sf.net>
* RELEASE 0.13.7
* TODO Update todo list.
* glade/nutritionDruid.glade Fix reversion/bug introduced in UI
cleanup from Jeff/Kiddo
* src/lib/version.py Upped version to 0.13.7
* src/lib/backends/sql_db.py Respect SQL libraries different
paramstyles rather than hardcoding the question mark.
* src/lib/backends/sqlite_db.py Make sqlite3 (built-into
python2.5) the default and fallback to pysqlite2 only as
needed. Respect SQL libraries different paramstyles rather than
hardcoding the question mark.
* src/lib/exporters/exporter.py Update exporter so that if two
recipes have the same name, they can both be exported
(generate_filename now gets a flag -- if we are exporting multiple
recipes, we automatically append ID numbers, otherwise we don't,
since they are unnecessarily ugly if someone just wants to e-mail
a copy of a single recipe to their mom or whatnot.
* src/lib/exporters/pdf_exporter.py Fix bug 1776930 (formatting
broken in PDF). Add links for recipe references and for webpages.
* src/lib/exporters/html_exporter.py Use the changes in exporter.py
to avoid screwing up if more than one recipe have the same name.
* src/lib/exporters/gxml2_exporter.py Export the link field.
* src/lib/nutrition/nutritionDruid.py Fix nutrition labels per
ingredients so they don't say "per recipe". Fix bug that broke the
nutrition druid when user changed an ingredient key.
* src/tests/testExporters.py Update export tests.
* src/tests/reference_setup/recipes.db Add a webpage to export
test suite.
2007-08-20 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/defaults_en.py Call granulated sugar granulated sugar,
not white sugar.
* src/lib/GourmetRecipeManager When threaded quitting fails, save
our database just in case the user force-quits and loses
data. Also, purge deleted ingredients on quit since they won't be
of any use (they're already lost to the UI--why keep them in the DB)
* src/lib/backends/sql_db.py Don't return deleted ingredients in
list of ingredient keys (in get_ingkeys_with_count)
2007-08-15 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/backends/sql_db.py Applied patch from Anthony Foglia to
fix typo bug in find_dupliaces
2007-08-08 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/timer.py Backwards compatability for pre-2.8 versions:
set_urgency_hint.
2007-08-08 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/Undo.py Fix potential bug that prevents action_hooks
from being run correctly -- we grab a reference to the action
directly in case carrying the action out modifies the history list
itself.
* src/tests/testRecCard.py Reduce repetition of try/except blocks
by abstracting out the try/except-with-informative-message
pattern. Also, make VERBOSE into a global variable (again,
simplifies).
2007-08-04 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/importers/mastercook_importer.py Make Notes import as
Notes rather than instructions (bug report from Anthony Foglia).
2007-08-03 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/prefs.py Handle broken config files gracefully. Namely,
if there is an error loading, print the error to the screen and
save a backup of the broken file. Then proceed as if there had
been no original config file (overwriting the old one on a clean
close with a new, clean config file).
* src/lib/importers/mastercook_importer.py Fix for attributes with
< or > signs - path from Anthony Foglia.
2007-07-30 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/recSelector.glade Fix reversion introduced in Jeff/Kiddo
patch (ShowingLabel had gone missing)
2007-07-19 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/app.glade Glade cleanup from Jeff/Kiddo
* glade/generic_importer.glade Glade cleanup from Jeff/Kiddo
* glade/nutritionDruid.glade Glade cleanup from Jeff/Kiddo
* glade/recMerger.glade Glade cleanup from Jeff/Kiddo
* glade/recSelector.glade Glade cleanup from Jeff/Kiddo
* glade/valueEditor.glade Glade cleanup from Jeff/Kiddo
* src/lib/nutrition/nutritionInfoEditor.py: Add to CVS.
2007-07-19 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/GourmetRecipeManager Use default DEFAULT_HIDDEN_COLUMNS
for hidden columns (so that not all columns are shown by default).
* src/lib/cb_extras.py Don't screw up the alignment of combo boxes.
* src/lib/gglobals.py Add DEFAULT_HIDDEN_COLUMNS so that link,
servings, preptime and cooktime are not included in index views by
default.
* src/lib/recindex.py Use DEFAULT_HIDDEN_COLUMNS
variable. Ellipsize links when they are shown rather than wraping
them.
2007-07-17 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/gourmet Update copyright dates.
* src/gourmet_in_place Add convenient script to run Gourmet from
source in tree.
* glade/app.glade Change name of ingredient editor, since now it
edits nutritional info as well as keys.
* src/lib/ImageExtras.py Commit method needed in bugfix committed
on on 6/29
2007-07-15 Thomas M. Hinkle <thomas_hinkle@sf.net>
* MANIFEST Added nutritionInfoEditor.py
* src/lib/defaults_en_GB.py Declared encoding (PEP 263)
2007-06-29 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/reccard.py Fix bug that prevented images from being
deleted. While we're at it, remove confirmation dialog on image
deletion, since it is undo-able.
2007-06-29 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/keyeditor.glade Add button to edit nutritional
information.
* glade/nutritionDruid.glade Fix name collisions between two
different treeview setups that are now in this druid. Make various
tweaks to nutritional info display page.
* glade/recCard.glade Add generic "edit nutritional info" button
(in parallel with all other edit buttons).
* src/lib/keyEditor.py Add check mark to show whether there is
nutritional info. Also add callbacks to handle editing nutritional
info from this view. Wrap text if possible to avoid horizontal
scrolling.
* src/lib/reccard.py Add edit_nutrition callback.
* src/lib/backends/rdatabase.py Add fetch_join method.
* src/lib/backends/sql_db.py Tweak make_where_statement call to
allow "in (foo, bar)" SQL queries. Also change handling of "OR"
and "AND" syntax. Add fetch_join method to allow simple joins.
* src/lib/nutrition/nutrition.py Allow modifying of existing
ingkey->ndbno association and conversions. Change from "g." to "g"
everywhere.
* src/lib/nutrition/nutritionDruid.py We now allow editing
nutritional information (and viewing and searching existing info
in the database). Change "g." to "g" everywhere. Added methods for
display of nutrtional information. Reconceptualize "back" button
to work with a simpler stack model.
* src/lib/nutrition/nutritionLabel.py Add generic show_druid
method to show druid even when there is no vapor.
2007-06-28 Thomas M. Hinkle <thomas_hinkle@sf.net>
* nutritionDruid.py Clean up code for nutrition druid (part way to
a complete rewrite).
2007-06-27 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/importers/mastercook_importer.py Fixed order of
encodings, fixing bug #1721376
2007-06-23 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/recipeMerger.glade Add label for possible message when
merger window is used as a dialog. Fix close and cancel buttons.
* src/lib/backends/sql_db.py Fix behavior of find_duplicates and
find_complete_duplicates when given a recipes parameter.
* src/lib/importers.py Make MulipleImporter track added_recs
* src/lib/importers/xml_importer.py Give converters added_ings and
added_rec attributes (references to underlying importer class)
* src/lib/GourmetRecipeManager.py Fix typo bug in progress_dialog
close callback. Add importer callback to bring up duplicates
dialog when we import recipes that look like duplicates. Fix
normal RecipeMergerDialog call (from Tools->Find Duplicates) so
that it uses our new callbacks that will try to show whatever kind
of duplicate there is rather than show an empty list.
* src/lib/recipeMerger Merge identical recipes in one-click rather
than making user click "Apply". Add show_if_there_are_dups
callback to show the dialog only if there are duplicates found
(i.e. for use as a post-importer dialog). Also add
populate_tree_if_possible callback to attempt to set the
searchType combo box so there will be something to show. Add a
parameter for a on_close_callback that allows our creator to do
something when we're closed. Add very lame image display (namely,
text that says "An image" or "No image").
* src/lib/version.py Up version to 0.13.6
2007-06-18 Thomas M. Hinkle <thomas_hinkle@sf.net>
* MANIFEST Added recipeMerger stuff.
2007-06-18 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/app.glade Add button to get to recipe merger tool
(duplicate finder)
* glade/recipeMerger.glade Make cancel buttons visible. Hide
tabs. Improve spacing.
* src/lib/GourmetRecipeManager.py Add callback to show duplicate
finder/recipe merger.
* src/lib/recipeIdentifier.py Added header comment.
* src/lib/recipeMerger.py Fix bug that made ingredient selection
fail. Add close callback. Remove print statements and add better
documentation.
* src/lib/version.py Bring version to 0.13.5 -- we'll up to 0.14
when we have a "stable" version with our handy new features.
2007-06-17 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/defaults_* Remove . from SI units (such as g, kg, etc.).
2007-05-19 Thomas Hinkle <thomas_hinkle@sf.net>
* src/lib/convert.py Fix bug in regexp in time parser that would
through error on some misidentified times.
2007-05-18 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/dialog_extras.py Improve docstring
* src/lib/mnemonic_manager.py Improve crawling algorithm for
finding mnemonic labels.
* src/lib/nutrition/nutritionDruid.py Behave better when user
cancels out of a dialog.
* src/lib/reccard.py Move selection down when user adds an
ingredient.
* src/lib/recipeIdentifier.py Rework API as I work on writing a
recipeMerger dialog.
* src/lib/recipeMerger.py Check in incomplete duplicate-recipe
merger/eliminator code.
* glade/recipeMerger.glade Check in incomplete duplicate-recipe
merger/eliminator code.
* src/lib/recindex.py Expand title column by default (rather than
letting the last column take up all the extra space)
* src/lib/version.py Bump up version number - When we finish this
merger stuff &c this will be a new .x version (0.14.0)
* src/lib/backends/rdatabase.py Add methods for finding duplicates
* src/lib/backends/sql_db.py Improve duplicate-finding SQL
* src/lib/exporters/recipe_emailer.py Allow e-mailing PDFs.
2007-03-25 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/importers/rezkonv_importer.py Fix encoding on top. Also
fix some other errors -- import convert module and fix a regexp.
2007-03-18 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/mnemonic_manager.py Improve documentation.
2007-03-17 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/exporters/xml_exporter.py Patch [ 1682624 ] Remove
double escaping in xml export from Lennart Fricke
* src/lib/exporters/exporter.py Fix Bug [ 1682613 ] Export with
German locale Servings multiplied by 10. We avoid unnecessary
float->text->float conversion in mult_exporter.py. Hopefully this
fixes the issue (not yet tested in German Locale)
2007-03-09 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/importers/interactive_importer.py Fix bug where, when
unknown units are put into the item string, a space was omitted.
2007-02-11 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/convert.py Fix bug in timestring_to_seconds that threw
error in some unparseable times.
2007-02-10 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/recipeIdentifier.py Only round when we have something to
round.
2007-01-21 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/backends/rdatabase.py Fix bug in update code that kept
us from properly updating if a version was not stored correctly.
* src/lib/recipeIdentifier.py Fix bug in standardize_ingredient
that threw an exception with g. or ml. and no amount
2007-01-20 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/shopgui.py Clarify logic around optional ingredient
adding.
* src/lib/recipeIdentifier.py Some more work toward a diff-ing
interface (not done)
2007-01-17 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/importers/html_importer.py Raise more useful error
message when a rule is malformed. If custom ingdic has ['text']
but not ['item'], make sure we end up with an item.
* src/lib/importers/html_plugins/recipezaar.py Update importer
script for updated website. Add import for cuisine and category
and servings.
2007-01-17 Thomas M. Hinkle <thomas_hinkle@sf.net>
* MANIFEST add batchEditor.py and batchEditor.glade
* glade/app.glade Add menu items for launching batch editor
* glade/recCard.glade Fix alignment of items on Recipe Details page.
* src/lib/GourmetRecipeManager.py Add batch editor. Create new
methods to store models for attributes (cuisine, category, etc) in
one place, rather than re-creating them in each recipe card,
etc. that needs them.
* src/lib/reccard.py Use new methods for creating global attribute
models.
* src/lib/recindex.py Fix type error that cropped up in update_recipe
* src/lib/backends/sql_db.py
* src/lib/importers/html_importer.py When dealing with pre-parsed
ingredient dictionaries, only use our own parsing to fill in gaps
(this allows html importer scripts to do some but not all parsing
on their own).
2007-01-11 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/importers/html_importer.py When scrapers fail, display
the error, but fallback to a generic importer -- this is really
important since scrapers will certainly fail as websites change.
2007-01-06 Thomas M. Hinkle <thomas_hinkle@sf.net>
* MANIFEST add valueEditor.glade and valueEditor.py
* glade/app.glade add button to open valueEditor (called fieldEditor)
* glade/valueEditor.glade Fix typo in "title" label. Add interface
for changing *other* values (i.e. so that you can change the
cuisine from foo->bar wherever the source is set to baz.)
* src/lib/GourmetRecipeManager.py Add valueEditor to main interface.
* src/lib/valueEditor.py Add ability to change *other* fields that
the field selected for (i.e. so that you can change the cuisine
from foo->bar wherever the source is set to baz.) Make sure the
recipe index is updated when we make a change.
2007-01-04 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/valueEditor.glade Create basic value editor for editing
values of e.g. categories throughout the database.
* src/lib/backends/sql_db.py Make get_unique_values() sort
results. Allow new syntax for criteria for make_where_statement
whereby we can have a list of "and"/"or" values for a single
column. Add update_by_criteria alias for update since that's what
the rdatabase.py parent class uses.
* src/lib/defaults_es.py Added gr. abbreviation.
* src/lib/defaults_en.py Added gr. abbreviation.
* src/lib/valueEditor.py Create basic value editor for editing
values of e.g. categories throughout the database.
2007-01-03 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/recindex.py Hide First/Last/Prev/Next buttons when there
are only 1 page's worth of recipes.
2007-01-02 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/importers/html_plugins/allrecipes.py Disable this plugin
temporarily -- it isn't working properly and I don't have time to
fix it.
* src/lib/reccard.py Fix up group undo/redo so that ingredient
group editing works again. This started with a simple typo fix
(self.history->self.rc.history), but in the process of fixing it,
I realized the undo was more fundamentally broken and had to be
updated to properly use "permanent references"
* src/lib/reccard.py Disable ingredient group toggling from the UI
since it does not work and cannot be easily made to sensibly work
given the structure of our ingredient DB.
* src/lib/version.py Version 0.13.3
* src/tests/testExporters.py Update to work with fancy PDF Export.
* src/tests/testImporters.py Disable AllRecipes test since it's
broken and we're disabling the plugin. Also, improve message on
failure of import to produce a recipe with the expected title.
* src/tests/reference_setup/recipes.db Update to latest DB.
* src/tests/testRecCard.py Add a test for group editing. Exit when
tests complete successfully.
2007-01-01 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/convert.py Fix i18n related bug in new unit-parsing
regular expression. Also, keep new code for debugging bug (this
will make us fail more verbosely if we haven't caught all such
bugs with our new unicode() call
* src/lib/defaults_es.py Fix some typos in Spanish defaults.
2006-12-29 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/recCard.glade Move scrollbar inside of notebook so that
nutrition/Recipe tabs are always in view.
* src/lib/backends/rdatabase.py Only update if we have a new
database.
* src/lib/backends/sqlite_db.py Set a flag if we are a new database.
* src/lib/exports/pdf_exporter.py Fix typo in get_pdf_prefs that
required extra nonsense argument.
* src/lib/defaults_en.py Fix fl. oz.
* src/lib/nutrition/databaseGrabber.py Be less verbose.
* src/lib/nutrition/nutritionLabel.py Improve formatting
* src/lib/reccard.py Respect "Allow Units to Change" preference
(previously, we were always adjusting the units in the recipe card
display and never adjusting them in the nutritional info
display). Properly handle redrawing and flowing with changed
reccard glade layout.
* src/lib/version.py Version 0.13.2
2006-12-28 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/defaults_en.py Fix tablespoons (standardized to Tbs.)
2006-12-27 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/backends/rdatabase.py Fix bug in URL-finding code in updater.
* src/lib/ratingWidget.py Prevent warning about integer v. float
* src/lib/shopgui.py Fix typo which prevented add-to-shopping-list
from working with optional ingredients in some cases.
* src/lib/shopping.py Fix ingredients when a range is being added
to "None"
* src/lib/TextBufferMarkup.py Make sure we are using unicode for
text we get from textbuffer. (This seems to prevent unicode
conversion errors elsewhere).
* src/lib/version.py Set version to 0.13.1
2006-12-26 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/backends/rdatabase.py Fix bug in new installations (this
change was actually made before 0.13.0 went up to SF but not
committed to cvs). Also, fix bug in ingredient parser that meant
the space between two words in an ingredient got eliminated.
* src/lib/Undo.py Catch all "Too many changes" errors that can
happen in our text-change undo routine.
2006-12-24 Thomas M. Hinkle <thomas_hinkle@sf.net>
* src/lib/reccard Hide "Website:" label when there is no link.
2006-12-23 Thomas M. Hinkle <thomas_hinkle@sf.net>
* data/recipe.dtd Add link
* glade/recCard.glade Move title and shopping-list button above
other stuff to un-clutter ingredient text and keep title in view
at all times.
* src/lib/reccard.py Default to highlighting calories, and save
last-highlighted nutritional item as a preference. Update flowing
to take into account different default widths (so that our title,
which is not the width of the whole card, can be wrapped
appropriately). Highlight ingredients with boldness as well as
color. Also, change color highlighting so that all items with some
of the content will have a visible amount of yellow behind them.
* src/lib/nutrition/nutritionLabel.py Hide MINOR items for which
there is no nutritional content. Also, track toggles in a
dictionary so that callers can programatically toggle highlighting
(i.e. so that we can store preferences for which nutritional info
to highlight)
2006-12-22 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/recCard.glade Less confusing naming of notebook widgets.
* src/lib/nutrition/nutrition.py Allow nested
NutritionInfoLists. Handle embedded recipes from here. rather than
forcing caller to deal with them.
* src/lib/nutrition/nutritionLabel.py Set up label to work as
button for selecting one part of nutrition to focus on elsewhere
(e.g. to choose "Calories" or "Protein" or what have you.
* src/lib/reccard.py Set up nutritional highlighting of ingredients.
* src/lib/shopgui.py Use modify_ing method to modify ings (not assignment).
* src/lib/TextBufferMarkup.py Fix bug in setting background color.
2006-12-16 Thomas M. Hinkle <thomas_hinkle@sf.net>
* glade/recCard.glade Move nutrition into a separate tab to reduce clutter/scrolling.
* src/lib/LinkedTextView.py Fix links with escaped characters (e.g. &)
* src/lib/defaults_en.py Add fluid ounces
* src/lib/reccard.py Comment on text-wrapping code. Fix title display.
* src/lib/recindex.py Set up text wrapping for index view
* src/lib/backends/rdatabase.py Add last-modified timestamp. Add some methods for dealing with dups.
* src/lib/backends/sql_db.py Raise an error if we set attributes on read-only RowObject
* src/lib/recipeIdentifier.py Updates in still-experimental-and-incomplete recipeIdentifier code
* src/lib/importers/html_importer.py Automatically add 'link' attribute to all HTML imports
|