From 61d5b082031fcba098f0009aa6707c75be5d01e4 Mon Sep 17 00:00:00 2001 From: Mike Knell Date: Fri, 12 May 2017 16:17:42 +0200 Subject: [PATCH 1/7] =?UTF-8?q?Add=20support=20for=20=F0=9F=87=A6?= =?UTF-8?q?=F0=9F=87=B9=20=20and=20constituent=20states.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/feiertage/feiertage.go | 32 +++++++- cmd/feiertage/feiertagecmd_test.go | 4 +- feiertage.go | 64 ++++++++++++++- region.go | 125 ++++++++++++++++++++++------- 4 files changed, 190 insertions(+), 35 deletions(-) diff --git a/cmd/feiertage/feiertage.go b/cmd/feiertage/feiertage.go index 86041a3..dbd608d 100644 --- a/cmd/feiertage/feiertage.go +++ b/cmd/feiertage/feiertage.go @@ -3,7 +3,7 @@ package main import ( "flag" "fmt" - "github.com/wlbr/feiertage" + "github.com/uffish/feiertage" "strconv" "strings" ) @@ -56,6 +56,26 @@ func getRegion(region string, year int, includingSundays bool) feiertage.Region r = feiertage.Thüringen(year, includingSundays) case "deutschland": r = feiertage.Deutschland(year, includingSundays) + case "burgenland": + r = feiertage.Burgenland(year, includingSundays) + case "kaernten": + r = feiertage.Kärnten(year, includingSundays) + case "niederoesterreich": + r = feiertage.Niederösterreich(year, includingSundays) + case "oberoesterreich": + r = feiertage.Oberösterreich(year, includingSundays) + case "salzburg": + r = feiertage.Salzburg(year, includingSundays) + case "steiermark": + r = feiertage.Steiermark(year, includingSundays) + case "tirol": + r = feiertage.Tirol(year, includingSundays) + case "vorarlberg": + r = feiertage.Vorarlberg(year, includingSundays) + case "wien": + r = feiertage.Wien(year, includingSundays) + case "oesterreich": + r = feiertage.Österreich(year, includingSundays) default: r = feiertage.All(year, includingSundays) } @@ -82,6 +102,16 @@ func main() { "\t\tSchleswigHolstein\n"+ "\t\tThüringen\n"+ "\t\tDeutschland\n"+ + "\t\tBurgenland\n"+ + "\t\tKärnten\n"+ + "\t\tNiederösterreich\n"+ + "\t\tOberösterreich\n"+ + "\t\tSalzburg\n"+ + "\t\tSteiermark\n"+ + "\t\tTirol\n"+ + "\t\tVorarlberg\n"+ + "\t\tWien\n"+ + "\t\tÖsterreich\n"+ "\t\tAll\n") var includingSundays = flag.Bool("inklusiveSonntage", false, "Sollen Feiertag an Sonntagen mit ausgegeben werden?") var asTaskjugglerCode = flag.Bool("asTaskjugglerCode", false, "Taskjuggler Code ausgeben.") diff --git a/cmd/feiertage/feiertagecmd_test.go b/cmd/feiertage/feiertagecmd_test.go index fc728fa..e3c5fb9 100644 --- a/cmd/feiertage/feiertagecmd_test.go +++ b/cmd/feiertage/feiertagecmd_test.go @@ -1,10 +1,10 @@ package main import ( - "testing" "fmt" "github.com/wlbr/feiertage" "regexp" + "testing" ) func compareAndFail(t *testing.T, f feiertage.Feiertag, d string) { @@ -14,7 +14,6 @@ func compareAndFail(t *testing.T, f feiertage.Feiertag, d string) { } } - func TestGetRegion(t *testing.T) { bay := getRegion("Bayern", 2016, true) fron := bay.Feiertage[7] @@ -26,7 +25,6 @@ func TestGetRegion(t *testing.T) { } - func TestFmtTaskjuggler(t *testing.T) { reg := getRegion("Brandenburg", 2016, true) jug := fmtTaskjuggler(reg) diff --git a/feiertage.go b/feiertage.go index 77a72de..cebf247 100644 --- a/feiertage.go +++ b/feiertage.go @@ -61,7 +61,7 @@ type Feiertag struct { Text string } -//The String function of Firetag will print its concrete Time (Date) plus the name of the Feiertag. +//The String function of Feiertag will print its concrete Time (Date) plus the name of the Feiertag. func (f Feiertag) String() string { return fmt.Sprintf("%s %s", f.Format("02.01.2006"), f.Text) } @@ -98,18 +98,23 @@ func Epiphanias(x int) Feiertag { return Feiertag{time.Date(x, time.January, 6, 0, 0, 0, 0, time.UTC), "Epiphanias"} } -// HeiligeDreiKönige is another Name for Epiphany, a fixed date. +// HeiligeDreiKönige is another name for Epiphany, a fixed date. func HeiligeDreiKönige(x int) Feiertag { e := Epiphanias(x) e.Text = "Heilige drei Könige" return e } -// Valentinstag is Valentine's Daym a fixed date. +// Valentinstag is Valentine's Day, a fixed date. func Valentinstag(x int) Feiertag { return Feiertag{time.Date(x, time.February, 14, 0, 0, 0, 0, time.UTC), "Valentinstag"} } +// Josefitag is St Joseph's Day, a fixed date. +func Josefitag(x int) Feiertag { + return Feiertag{time.Date(x, time.March, 19, 0, 0, 0, 0, time.UTC), "Josefitag"} +} + // Weiberfastnacht is a part of carnival, 52 days before Easter. func Weiberfastnacht(x int) Feiertag { o := Ostern(x) @@ -200,6 +205,18 @@ func TagDerArbeit(x int) Feiertag { return Feiertag{time.Date(x, time.May, 1, 0, 0, 0, 0, time.UTC), "Tag der Arbeit"} } +// Staatsfeiertag is May 1st in Austria, a fixed date. +func Staatsfeiertag(x int) Feiertag { + e := TagDerArbeit(x) + e.Text = "Staatsfeiertag" + return e +} + +// Florianitag is St Florian's Day, a fixed date. +func Florianitag(x int) Feiertag { + return Feiertag{time.Date(x, time.May, 4, 0, 0, 0, 0, time.UTC), "Florianitag"} +} + // TagDerBefreiung is Victory in Europe Day, a fixed date. func TagDerBefreiung(x int) Feiertag { return Feiertag{time.Date(x, time.May, 8, 0, 0, 0, 0, time.UTC), "Tag der Befreiung"} @@ -254,11 +271,21 @@ func MariäHimmelfahrt(x int) Feiertag { return Feiertag{time.Date(x, time.August, 15, 0, 0, 0, 0, time.UTC), "Mariä Himmelfahrt"} } +// Rupertitag is St Rupert's Day, a fixed date. +func Rupertitag(x int) Feiertag { + return Feiertag{time.Date(x, time.September, 24, 0, 0, 0, 0, time.UTC), "Rupertitag"} +} + // TagDerDeutschenEinheit is German Unity Day, a fixed date. func TagDerDeutschenEinheit(x int) Feiertag { return Feiertag{time.Date(x, time.October, 3, 0, 0, 0, 0, time.UTC), "Tag der deutschen Einheit"} } +// TagDerVolksabstimming is Referendum Day in Carinthia, a fixed date. +func TagDerVolksabstimming(x int) Feiertag { + return Feiertag{time.Date(x, time.October, 10, 0, 0, 0, 0, time.UTC), "Tag der Volksabstimmung"} +} + // Erntedankfest is Thanksgiving or Harvest Festival, the first Sunday of October. // The german Erntedankfest is not the same than the US Thanksgiving. func Erntedankfest(x int) Feiertag { @@ -267,6 +294,11 @@ func Erntedankfest(x int) Feiertag { return Feiertag{o.AddDate(0, 0, d), "Erntedankfest"} } +// Nationalfeiertag is the Austrian national day, a fixed date. +func Nationalfeiertag(x int) Feiertag { + return Feiertag{time.Date(x, time.October, 26, 0, 0, 0, 0, time.UTC), "Nationalfeiertag"} +} + // Reformationstag is Reformation Day, a fixed date. func Reformationstag(x int) Feiertag { return Feiertag{time.Date(x, time.October, 31, 0, 0, 0, 0, time.UTC), "Reformationstag"} @@ -304,6 +336,11 @@ func Karnevalsbeginn(x int) Feiertag { return Feiertag{time.Date(x, time.November, 11, 11, 11, 11, 11, time.UTC), "Karnevalsbeginn"} } +// Leopolditag is St Leopold's Day, a fixed date. +func Leopolditag(x int) Feiertag { + return Feiertag{time.Date(x, time.November, 15, 0, 0, 0, 0, time.UTC), "Leopolditag"} +} + // BußUndBettag is Penance Day, 11 days before the first Sunday in Advent func BußUndBettag(x int) Feiertag { o := time.Date(x, time.November, 22, 0, 0, 0, 0, time.UTC) @@ -339,6 +376,13 @@ func MariäUnbefleckteEmpfängnis(x int) Feiertag { return Feiertag{time.Date(x, time.December, 8, 0, 0, 0, 0, time.UTC), "Mariä unbefleckte Empfängnis"} } +// MariaEmpfängnis has a shorter name in Austria. +func MariäEmpfängnis(x int) Feiertag { + e := MariäUnbefleckteEmpfängnis(x) + e.Text = "Mariä Empfängnis" + return e +} + // Totensonntag is Sunday in commemoration of the dead, the last Sunday before the fourth Sunday in Advent func Totensonntag(x int) Feiertag { o := VierterAdvent(x) @@ -380,11 +424,25 @@ func Weihnachten(x int) Feiertag { return Feiertag{time.Date(x, time.December, 25, 0, 0, 0, 0, time.UTC), "Weihnachten"} } +// In Austria, Christmas is Christtag. +func Christtag(x int) Feiertag { + e := Weihnachten(x) + e.Text = "Christtag" + return e +} + // ZweiterWeihnachtsfeiertag is day after Christmas, a fixed date func ZweiterWeihnachtsfeiertag(x int) Feiertag { return Feiertag{time.Date(x, time.December, 26, 0, 0, 0, 0, time.UTC), "Zweiter Weihnachtsfeiertag"} } +// In Austria, December 26th is Stefanitag. +func Stefanitag(x int) Feiertag { + e := Christtag(x) + e.Text = "Stefanitag" + return e +} + // Silvester is NewYearsEve, a fixed date. func Silvester(x int) Feiertag { return Feiertag{time.Date(x, time.December, 31, 0, 0, 0, 0, time.UTC), "Silvester"} diff --git a/region.go b/region.go index 4fef3d5..3d3dc9a 100644 --- a/region.go +++ b/region.go @@ -5,8 +5,9 @@ import ( "sort" ) -// Region represents a Federal State of Germany (Bundesland). Some of the public holidays in -// Germany are common throughout the whole country, while other depend of the Bundesland. +// Region represents a Federal State of Germany or Austria (Bundesland). Some +// public holidays are common throughout the whole country, while others depend on the Bundesland. +// Short names of Austrian states are as suggested in ÖNORM A 1080. type Region struct { Name string Shortname string @@ -23,13 +24,21 @@ func (r Region) String() string { return s } -func createFeiertagsList(y int, ffun []func(int) Feiertag) []Feiertag { - feiern := []func(int) Feiertag{Neujahr, Karfreitag, Ostermontag, - TagDerArbeit, ChristiHimmelfahrt, PfingstMontag, - TagDerDeutschenEinheit, Weihnachten, ZweiterWeihnachtsfeiertag} - // in 2017 the Reformationstag is a one time Feiertag in all states - if y == 2017 { - feiern = append(feiern, Reformationstag) +func createFeiertagsList(y int, l string, ffun []func(int) Feiertag) []Feiertag { +var feiern []func(int) Feiertag + if l == "AT" { + feiern = []func(int) Feiertag{Neujahr, HeiligeDreiKönige, Ostermontag, + Staatsfeiertag, ChristiHimmelfahrt, PfingstMontag, Fronleichnam, + MariäHimmelfahrt, Nationalfeiertag, Allerheiligen, MariäEmpfängnis, + Christtag, Stefanitag} + } else { + feiern = []func(int) Feiertag{Neujahr, Karfreitag, Ostermontag, + TagDerArbeit, ChristiHimmelfahrt, PfingstMontag, + TagDerDeutschenEinheit, Weihnachten, ZweiterWeihnachtsfeiertag} + // in 2017 the Reformationstag is a one time Feiertag in all states + if y == 2017 { + feiern = append(feiern, Reformationstag) + } } for _, f := range ffun { @@ -49,19 +58,19 @@ func createFeiertagsList(y int, ffun []func(int) Feiertag) []Feiertag { // Baden-Württemberg func BadenWürttemberg(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Epiphanias, Fronleichnam, Allerheiligen} - return Region{"Baden-Württemberg", "BW", createFeiertagsList(y, ffun)} + return Region{"Baden-Württemberg", "BW", createFeiertagsList(y, "DE", ffun)} } // Bayern returns a Region object holding all public holidays in the state Bayern func Bayern(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Epiphanias, Fronleichnam, Allerheiligen} - return Region{"Bayern", "BY", createFeiertagsList(y, ffun)} + return Region{"Bayern", "BY", createFeiertagsList(y, "DE", ffun)} } // Berlin returns a Region object holding all public holidays in the state Berlin func Berlin(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{} - return Region{"Berlin", "BE", createFeiertagsList(y, ffun)} + return Region{"Berlin", "BE", createFeiertagsList(y, "DE", ffun)} } // Brandenburg returns a Region object holding all public holidays in the state @@ -73,91 +82,151 @@ func Brandenburg(y int, inklSonntage ...bool) Region { } else { ffun = []func(int) Feiertag{Ostern, Pfingsten, Reformationstag} } - return Region{"Brandenburg", "BB", createFeiertagsList(y, ffun)} + return Region{"Brandenburg", "BB", createFeiertagsList(y, "DE", ffun)} } // Bremen returns a Region object holding all public holidays in the state Bremen func Bremen(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{} - return Region{"Bremen", "HB", createFeiertagsList(y, ffun)} + return Region{"Bremen", "HB", createFeiertagsList(y, "DE", ffun)} } // Hamburg returns a Region object holding all public holidays in the state Hamburg func Hamburg(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{} - return Region{"Hamburg", "HH", createFeiertagsList(y, ffun)} + return Region{"Hamburg", "HH", createFeiertagsList(y, "DE", ffun)} } // Hessen returns a Region object holding all public holidays in the state Hessen func Hessen(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Fronleichnam} - return Region{"Hessen", "HE", createFeiertagsList(y, ffun)} + return Region{"Hessen", "HE", createFeiertagsList(y, "DE", ffun)} } // MecklenburgVorpommern returns a Region object holding all public holidays in // the state Mecklenburg-Vorpommern func MecklenburgVorpommern(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Reformationstag} - return Region{"Mecklenburg-Vorpommern", "MV", createFeiertagsList(y, ffun)} + return Region{"Mecklenburg-Vorpommern", "MV", createFeiertagsList(y, "DE", ffun)} } // Niedersachsen returns a Region object holding all public holidays in the // state Niedersachsen func Niedersachsen(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{} - return Region{"Niedersachsen", "NI", createFeiertagsList(y, ffun)} + return Region{"Niedersachsen", "NI", createFeiertagsList(y, "DE", ffun)} } // NordrheinWestfalen returns a Region object holding all public holidays in the // state Nordrhein-Westfalen func NordrheinWestfalen(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Fronleichnam, Allerheiligen} - return Region{"Nordrhein-Westfalen", "NW", createFeiertagsList(y, ffun)} + return Region{"Nordrhein-Westfalen", "NW", createFeiertagsList(y, "DE", ffun)} } // RheinlandPfalz returns a Region object holding all public holidays in the // state Rheinland-Pfalz func RheinlandPfalz(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Fronleichnam, Allerheiligen} - return Region{"Rheinland-Pfalz", "RP", createFeiertagsList(y, ffun)} + return Region{"Rheinland-Pfalz", "RP", createFeiertagsList(y, "DE", ffun)} } // Saarland returns a Region object holding all public holidays in the state Saarland func Saarland(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Fronleichnam, MariäHimmelfahrt, Allerheiligen} - return Region{"Saarland", "SL", createFeiertagsList(y, ffun)} + return Region{"Saarland", "SL", createFeiertagsList(y, "DE", ffun)} } // Sachsen returns a Region object holding all public holidays in the state Sachsen func Sachsen(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Reformationstag, BußUndBettag} - return Region{"Sachsen", "SN", createFeiertagsList(y, ffun)} + return Region{"Sachsen", "SN", createFeiertagsList(y, "DE", ffun)} } // SachsenAnhalt returns a Region object holding all public holidays in the state SachsenAnhalt func SachsenAnhalt(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Epiphanias, Reformationstag} - return Region{"Sachsen-Anhalt", "ST", createFeiertagsList(y, ffun)} + return Region{"Sachsen-Anhalt", "ST", createFeiertagsList(y, "DE", ffun)} } // SchleswigHolstein returns a Region object holding all public holidays in the state SchleswigHolstein func SchleswigHolstein(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{} - return Region{"Schleswig-Holstein", "SH", createFeiertagsList(y, ffun)} + return Region{"Schleswig-Holstein", "SH", createFeiertagsList(y, "DE", ffun)} } // Thüringen returns a Region object holding all public holidays in the state Thüringen func Thüringen(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{ Reformationstag} - return Region{"Thüringen", "TH", createFeiertagsList(y, ffun)} + return Region{"Thüringen", "TH", createFeiertagsList(y, "DE", ffun)} } // Deutschland returns a Region object holding all public holidays that are Common in Germany func Deutschland(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{} - return Region{"Deutschland", "DE", createFeiertagsList(y, ffun)} + return Region{"Deutschland", "DE", createFeiertagsList(y, "DE", ffun)} +} + +// Burgenland returns a Region object holding all public holidays in the state of Burgenland. +func Burgenland(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Martinstag} + return Region{"Burgenland", "Bgld", createFeiertagsList(y, "AT", ffun)} +} + +// Kärnten returns a Region object holding all public holidays in the state of Kärnten. +func Kärnten(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Josefitag, TagDerVolksabstimming} + return Region{"Kärnten", "Ktn", createFeiertagsList(y, "AT", ffun)} +} + +// Niederösterreich returns a Region object holding all public holidays in the state of Niederösterreich. +func Niederösterreich(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Leopolditag} + return Region{"Niederösterreich", "NÖ", createFeiertagsList(y, "AT", ffun)} +} + +// Oberösterreich returns a Region object holding all public holidays in the state of Oberösterreich. +func Oberösterreich(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Florianitag} + return Region{"Oberösterreich", "OÖ", createFeiertagsList(y, "AT", ffun)} +} + +// Salzburg returns a Region object holding all public holidays in the state of Salzburg. +func Salzburg(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Rupertitag} + return Region{"Salzburg", "Sbg", createFeiertagsList(y, "AT", ffun)} +} + +// Steiermark returns a Region object holding all public holidays in the state of Steiermark. +func Steiermark(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Josefitag} + return Region{"Steiermark", "Stmk", createFeiertagsList(y, "AT", ffun)} +} + +// Tirol returns a Region object holding all public holidays in the state of Tirol. +func Tirol(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Josefitag} + return Region{"Tirol", "T", createFeiertagsList(y, "AT", ffun)} +} + +// Vorarlberg returns a Region object holding all public holidays in the state of Vorarlberg. +func Vorarlberg(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Josefitag} + return Region{"Vorarlberg", "Vbg", createFeiertagsList(y, "AT", ffun)} +} + +// Wien returns a Region object holding all public holidays in the city and state of Vienna. +func Wien(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{Leopolditag} + return Region{"Wien", "W", createFeiertagsList(y, "AT", ffun)} +} + +// Österreich returns a Region object holding all public holidays that are common in Austria. +func Österreich(y int, inklSonntage ...bool) Region { + ffun := []func(int) Feiertag{} + return Region{"Österreich", "AT", createFeiertagsList(y, "AT", ffun)} } // All returns a Region object holding all public holidays/feast days known to this program. @@ -166,7 +235,7 @@ func All(y int, inklSonntage ...bool) Region { ffun := []func(int) Feiertag{Epiphanias, HeiligeDreiKönige, Valentinstag, Weiberfastnacht, Rosenmontag, Fastnacht, Aschermittwoch, Gründonnerstag, BeginnSommerzeit, Walpurgisnacht, TagDerBefreiung, Muttertag, Vatertag, Fronleichnam, - MariäHimmelfahrt, Reformationstag, Halloween, BeginnWinterzeit, + MariäHimmelfahrt, Reformationstag, Nationalfeiertag, Halloween, BeginnWinterzeit, Allerheiligen, Allerseelen, Martinstag, Karnevalsbeginn, BußUndBettag, Thanksgiving, Blackfriday, Volkstrauertag, Nikolaus, MariäUnbefleckteEmpfängnis, Heiligabend, Silvester} @@ -176,5 +245,5 @@ func All(y int, inklSonntage ...bool) Region { DritterAdvent, VierterAdvent) } - return Region{"Alle", "All", createFeiertagsList(y, ffun)} + return Region{"Alle", "All", createFeiertagsList(y, "DE", ffun)} } From 088230c80b75b4abdc762d57a328713e191f6f4c Mon Sep 17 00:00:00 2001 From: Mike Knell Date: Fri, 12 May 2017 16:25:45 +0200 Subject: [PATCH 2/7] Add tests for Austria --- region_test.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/region_test.go b/region_test.go index e65d292..f26b40f 100644 --- a/region_test.go +++ b/region_test.go @@ -39,8 +39,18 @@ func TestFeiertageZahl(t *testing.T) { checkAndFailRegionFeiertageZahl(t, SchleswigHolstein(2016), 9) checkAndFailRegionFeiertageZahl(t, Thüringen(2016), 10) checkAndFailRegionFeiertageZahl(t, Deutschland(2016), 9) - checkAndFailRegionFeiertageZahl(t, All(2016), 50) - checkAndFailRegionFeiertageZahl(t, All(2016, false), 39) + checkAndFailRegionFeiertageZahl(t, Burgenland(2016), 14) + checkAndFailRegionFeiertageZahl(t, Kärnten(2016), 15) + checkAndFailRegionFeiertageZahl(t, Niederösterreich(2016), 14) + checkAndFailRegionFeiertageZahl(t, Oberösterreich(2016), 14) + checkAndFailRegionFeiertageZahl(t, Salzburg(2016), 14) + checkAndFailRegionFeiertageZahl(t, Steiermark(2016), 14) + checkAndFailRegionFeiertageZahl(t, Tirol(2016), 14) + checkAndFailRegionFeiertageZahl(t, Vorarlberg(2016), 14) + checkAndFailRegionFeiertageZahl(t, Wien(2016), 14) + checkAndFailRegionFeiertageZahl(t, Österreich(2016), 13) + checkAndFailRegionFeiertageZahl(t, All(2016), 51) + checkAndFailRegionFeiertageZahl(t, All(2016, false), 40) //check Reformationstag 2017 checkAndFailRegionFeiertageZahl(t, BadenWürttemberg(2017), 13) checkAndFailRegionFeiertageZahl(t, Bayern(2017), 13) From 14ed4a7f1eccae7561d51aac57333b32678d01cf Mon Sep 17 00:00:00 2001 From: Mike Knell Date: Mon, 15 May 2017 09:28:50 +0200 Subject: [PATCH 3/7] Update tests and All(), update documentation --- README.md | 98 ++++++++++++++++++++++++++++++-------------------- region.go | 19 +++++----- region_test.go | 4 +-- 3 files changed, 72 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 234034d..52797f5 100644 --- a/README.md +++ b/README.md @@ -1,67 +1,78 @@ # Feiertage -Feiertage is a Go/Golang library for calculating german bank holidays. It includes the calculation of the date of Easter and, more important, offers ways to retrieve the public holiday for a state of Germany (=Bundesland). +Feiertage is a Go/Golang library for calculating german bank holidays. It includes the calculation of the date of Easter and, more important, offers ways to retrieve the public holiday for a state of Germany or +Austria (=Bundesland). -The library is probably useful only for people realizing use cases with special "german" requirements. This might be shift schedules or capacity calculation. +The library is probably useful only for people realizing use cases with special "germanic" requirements. This might be shift schedules or capacity calculation. ### Documentation See https://godoc.org/github.com/wlbr/feiertage ### Usage: -There are to types of functions: +There are to types of functions: - * `(year)` and + * `(year)` and * `(year optional:IncludingSundays:true)` `` returns an extended `time` object (type `feiertag`). It carrys the concrete date plus the name of the holiday. -`` may be any of +`` may be any of |||| |----|-----|----| -`Neujahr` | `Epiphanias` | `HeiligeDreiKönige` -`Valentinstag` | `Weiberfastnacht` | `Karnevalssonntag` -`Rosenmontag` | `Fastnacht` | `Aschermittwoch` -`Palmsonntag` | `Gründonnerstag` | `Karfreitag` -`Ostern` | `BeginnSommerzeit` | `Ostermontag` -`Walpurgisnacht` | `TagDerArbeit` | `TagDerBefreiung` -`Muttertag` | `ChristiHimmelfahrt` | `Vatertag` -`Pfingsten` | `PfingstMontag` | `Dreifaltigkeitssonntag` -`Fronleichnam` | `MariäHimmelfahrt` | `TagDerDeutschenEinheit` -`Erntedankfest` | `Reformationstag` | `Halloween` -`BeginnWinterzeit` | `Allerheiligen` | `Allerseelen` -`Martinstag` | `Karnevalsbeginn` | `BußUndBettag` -`Thanksgiving` | `Blackfriday` | `Volkstrauertag` -`Nikolaus` | `MariäUnbefleckteEmpfängnis` | `Totensonntag` -`ErsterAdvent` | `ZweiterAdvent` | `DritterAdvent` -`VierterAdvent` | `Heiligabend` | `Weihnachten` -`ZweiterWeihnachten` | `Silvester` |   +`Neujahr` | `Epiphanias` | `HeiligeDreiKönige` +`Valentinstag` | `Josefitag` | `Weiberfastnacht` +`Karnevalssonntag` | `Rosenmontag` | `Fastnacht` +`Aschermittwoch` | `Palmsonntag` | `Gründonnerstag` +`Karfreitag` | `Ostern` | `BeginnSommerzeit` +`Ostermontag` | `Walpurgisnacht` | `TagDerArbeit` +`TagDerBefreiung` | `Staatsfeiertag` | `Florianitag` +`Muttertag` | `ChristiHimmelfahrt` | `Vatertag` +`Pfingsten` | `PfingstMontag` | `Dreifaltigkeitssonntag` +`Fronleichnam` | `MariäHimmelfahrt` | `Rupertitag` +`TagDerDeutschenEinheit` | `TagDerVolksabstimming` | `Nationalfeiertag` +`Erntedankfest` | `Reformationstag` | `Halloween` +`BeginnWinterzeit` | `Allerheiligen` | `Allerseelen` +`Martinstag` | `Karnevalsbeginn` | `Leopolditag` +`BußUndBettag` | `Thanksgiving` | `Blackfriday` +`Volkstrauertag` | `Nikolaus` | `MariäUnbefleckteEmpfängnis` +`MariaEmpfängnis` | `Totensonntag` | `ErsterAdvent` +`ZweiterAdvent` | `DritterAdvent` | `VierterAdvent` +`Heiligabend` | `Weihnachten` | `Christtag` +`Stefanitag` | `ZweiterWeihnachten` | `Silvester` `` returns an object of type `region`. It offers a list of public holidays valid in the referred state` | `the name and the shortname of the state as attributes. -`` may be any of +`` may be any of |||| ----|-----|---- -`BadenWürttemberg` | `Bayern` | `Berlin` -`Brandenburg` | `Bremen` | `Hamburg` -`Hessen` | `MecklenburgVorpommern` | `Niedersachsen` -`NordrheinWestfalen` | `RheinlandPfalz` | `Saarland` -`Sachsen` | `SachsenAnhalt` | `SchleswigHolstein` -`Thüringen` | `Deutschland` | `All` +`BadenWürttemberg` | `Bayern` | `Berlin` +`Brandenburg` | `Bremen` | `Hamburg` +`Hessen` | `MecklenburgVorpommern` | `Niedersachsen` +`NordrheinWestfalen` | `RheinlandPfalz` | `Saarland` +`Sachsen` | `SachsenAnhalt` | `SchleswigHolstein` +`Thüringen` | `Deutschland` | `Burgenland` +`Kärnten` | `Niederösterreich` | `Oberösterreich` +`Salzburg` | `Steiermark` | `Tirol` +`Vorarlberg` | `Wien` | `Österreich` +`All` |   |   The optional region functions second argument `includingSundays` switches the behavior o the region function, so that "gesetzliche Feiertage" on Sundays are included or not. This is important in Brandenburg and refers to Easter and Pentecost sunday. If you are calculating shift costs you will need to know even the holidays "hidden by sundays". The region functions return the public holidays ("gesetzliche Feiertage"). The function `all` instead returns all the defined "special dates" as well. For example the Penance Day (Buß- und Bettag) or the begin/end of daylight saving time. - +The regional functions for Austrian Bundesländer include saints' days which are state-level holidays, meaning +schools etc. are generally closed but workers don't get the day off by default. If you don't want to +include these days in your planning, it's okay to reference `Österreich` instead as legal holidays are +(more or less) synchronised across Länder. ### Example: - + fmt.Println(Ostern(2016)) --> 27.03.2016 Ostern - + fmt.Println(BußUndBettag(2016)) --> 16.11.2016 Buß- und Bettag - + fmt.Println(Brandenburg(2016)) @@ -79,7 +90,7 @@ The region functions return the public holidays ("gesetzliche Feiertage"). The f 25.12.2016 Weihnachten 26.12.2016 Zweiter Weihnachtsfeiertag - + fmt.Println(Brandenburg(2016, false)) --> Brandenburg (BB) 01.01.2016 Neujahr @@ -92,11 +103,11 @@ The region functions return the public holidays ("gesetzliche Feiertage"). The f 31.10.2016 Reformationstag 25.12.2016 Weihnachten 26.12.2016 Zweiter Weihnachtsfeiertag - - + + ## Command line tool -A little command line tool is included as well. It can be compiled using `make buildcmd` or `go build cmd/feiertage/feiertage.go` This will create an executable `feiertage`. +A little command line tool is included as well. It can be compiled using `make buildcmd` or `go build cmd/feiertage/feiertage.go` This will create an executable `feiertage`. See https://github.com/wlbr/feiertage/releases/latest for downloads. @@ -105,7 +116,7 @@ See https://github.com/wlbr/feiertage/releases/latest for downloads. `feiertage: [options] year`
-asTaskjugglerCode (default false)
-
Print the result as valid source code (`leave x y`) for the Taskjuggler planning tool. +
Print the result as valid source code (`leave x y`) for the Taskjuggler planning tool.
-inklusiveSonntage (default false)
Should public holidays on a Sunday be included?
-region <regionstring> (default "All")
@@ -128,6 +139,16 @@ See https://github.com/wlbr/feiertage/releases/latest for downloads.  SchleswigHolstein
 Thüringen
 Deutschland
+ Burgenland
+ Kärnten
+ Niederösterreich
+ Oberösterreich
+ Salzburg
+ Steiermark
+ Tirol
+ Vorarlberg
+ Wien
+ Österreich
 All
@@ -138,4 +159,3 @@ See https://github.com/wlbr/feiertage/releases/latest for downloads. * Continous Integration: [![Travis Status](https://api.travis-ci.org/wlbr/feiertage.svg?branch=master)](https://travis-ci.org/wlbr/feiertage) * Test Coverage: [![Coverage Status](https://coveralls.io/repos/github/wlbr/feiertage/badge.svg?branch=master)](https://coveralls.io/github/wlbr/feiertage?branch=master) * Metrics: [![GoReportCard](https://goreportcard.com/badge/github.com/wlbr/feiertage)](https://goreportcard.com/report/github.com/wlbr/feiertage) - diff --git a/region.go b/region.go index 3d3dc9a..b6ecc48 100644 --- a/region.go +++ b/region.go @@ -232,17 +232,20 @@ func Österreich(y int, inklSonntage ...bool) Region { // All returns a Region object holding all public holidays/feast days known to this program. // Not all of htem are public holidays (basically 'free'). func All(y int, inklSonntage ...bool) Region { - ffun := []func(int) Feiertag{Epiphanias, HeiligeDreiKönige, Valentinstag, - Weiberfastnacht, Rosenmontag, Fastnacht, Aschermittwoch, Gründonnerstag, - BeginnSommerzeit, Walpurgisnacht, TagDerBefreiung, Muttertag, Vatertag, Fronleichnam, - MariäHimmelfahrt, Reformationstag, Nationalfeiertag, Halloween, BeginnWinterzeit, - Allerheiligen, Allerseelen, Martinstag, Karnevalsbeginn, BußUndBettag, Thanksgiving, - Blackfriday, Volkstrauertag, Nikolaus, MariäUnbefleckteEmpfängnis, Heiligabend, Silvester} + ffun := []func(int) Feiertag{Neujahr, Epiphanias, HeiligeDreiKönige, Valentinstag, + Josefitag, Weiberfastnacht, Rosenmontag, Fastnacht, Aschermittwoch, Gründonnerstag, + Karfreitag, BeginnSommerzeit, Ostermontag, Walpurgisnacht, TagDerArbeit, Staatsfeiertag, + Florianitag, TagDerBefreiung, Muttertag, ChristiHimmelfahrt, Vatertag, PfingstMontag, + Fronleichnam, MariäHimmelfahrt, Rupertitag, TagDerDeutschenEinheit, + TagDerVolksabstimming, Nationalfeiertag, Reformationstag, Halloween, BeginnWinterzeit, + Allerheiligen, Allerseelen, Martinstag, Karnevalsbeginn, Leopolditag, BußUndBettag, + Thanksgiving, Blackfriday, Nikolaus, MariäUnbefleckteEmpfängnis, MariäEmpfängnis, + Heiligabend, Weihnachten, Christtag, ZweiterWeihnachtsfeiertag, Stefanitag, Silvester} if len(inklSonntage) == 0 || inklSonntage[0] == true { ffun = append(ffun, Karnevalssonntag, Palmsonntag, Ostern, Pfingsten, - Dreifaltigkeitssonntag, Erntedankfest, Totensonntag, ErsterAdvent, ZweiterAdvent, - DritterAdvent, VierterAdvent) + Dreifaltigkeitssonntag, Erntedankfest, Volkstrauertag, Totensonntag, + ErsterAdvent, ZweiterAdvent,DritterAdvent, VierterAdvent) } return Region{"Alle", "All", createFeiertagsList(y, "DE", ffun)} diff --git a/region_test.go b/region_test.go index f26b40f..517eba0 100644 --- a/region_test.go +++ b/region_test.go @@ -49,8 +49,8 @@ func TestFeiertageZahl(t *testing.T) { checkAndFailRegionFeiertageZahl(t, Vorarlberg(2016), 14) checkAndFailRegionFeiertageZahl(t, Wien(2016), 14) checkAndFailRegionFeiertageZahl(t, Österreich(2016), 13) - checkAndFailRegionFeiertageZahl(t, All(2016), 51) - checkAndFailRegionFeiertageZahl(t, All(2016, false), 40) + checkAndFailRegionFeiertageZahl(t, All(2016), 69) + checkAndFailRegionFeiertageZahl(t, All(2016, false), 57) //check Reformationstag 2017 checkAndFailRegionFeiertageZahl(t, BadenWürttemberg(2017), 13) checkAndFailRegionFeiertageZahl(t, Bayern(2017), 13) From dd17b47142b65137025df2b07a1f458c38fae1f8 Mon Sep 17 00:00:00 2001 From: Mike Knell Date: Mon, 15 May 2017 09:33:13 +0200 Subject: [PATCH 4/7] Restore command line import to parent --- cmd/feiertage/feiertage.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/feiertage/feiertage.go b/cmd/feiertage/feiertage.go index dbd608d..4b56ba7 100644 --- a/cmd/feiertage/feiertage.go +++ b/cmd/feiertage/feiertage.go @@ -3,7 +3,7 @@ package main import ( "flag" "fmt" - "github.com/uffish/feiertage" + "github.com/wlbr/feiertage" "strconv" "strings" ) From 4143442081fd08a8d17ce8f08606da05be7c6814 Mon Sep 17 00:00:00 2001 From: Mike Knell Date: Mon, 15 May 2017 09:34:42 +0200 Subject: [PATCH 5/7] One-character typo fix.. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 52797f5..599514f 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ The library is probably useful only for people realizing use cases with special See https://godoc.org/github.com/wlbr/feiertage ### Usage: -There are to types of functions: +There are two types of functions: * `(year)` and * `(year optional:IncludingSundays:true)` From 4759039319a31143271622ed78be379e03953f1f Mon Sep 17 00:00:00 2001 From: Mike Knell Date: Mon, 15 May 2017 09:43:02 +0200 Subject: [PATCH 6/7] Tiny formatting fix and proofread/fix README. --- README.md | 16 ++++++++-------- region.go | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 599514f..83528a3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Feiertage -Feiertage is a Go/Golang library for calculating german bank holidays. It includes the calculation of the date of Easter and, more important, offers ways to retrieve the public holiday for a state of Germany or +Feiertage is a Go/Golang library for calculating German and Austrianbank holidays. It includes the calculation of the date of Easter and, more importantly, offers ways to retrieve public holidays for a state of Germany or Austria (=Bundesland). -The library is probably useful only for people realizing use cases with special "germanic" requirements. This might be shift schedules or capacity calculation. +The library is probably useful only for people realizing use cases with special "Germanic" requirements, such as shift schedules or capacity calculation. ### Documentation See https://godoc.org/github.com/wlbr/feiertage @@ -13,8 +13,8 @@ There are two types of functions: * `(year)` and * `(year optional:IncludingSundays:true)` -`` returns an extended `time` object (type `feiertag`). It carrys the concrete date plus the name of the holiday. -`` may be any of +`` returns an extended `time` object (type `feiertag`). It carries the date of the holiday +in the requested year plus the name of the holiday. `` may be any of the following: |||| |----|-----|----| @@ -39,8 +39,8 @@ There are two types of functions: `Heiligabend` | `Weihnachten` | `Christtag` `Stefanitag` | `ZweiterWeihnachten` | `Silvester` -`` returns an object of type `region`. It offers a list of public holidays valid in the referred state` | `the name and the shortname of the state as attributes. -`` may be any of +`` returns an object of type `region`. It offers a list of public holidays valid in the specified state` | `as well as the name and the shortname of the state as attributes. +`` may be any of: |||| ----|-----|---- @@ -55,9 +55,9 @@ There are two types of functions: `Vorarlberg` | `Wien` | `Österreich` `All` |   |   -The optional region functions second argument `includingSundays` switches the behavior o the region function, so that "gesetzliche Feiertage" on Sundays are included or not. This is important in Brandenburg and refers to Easter and Pentecost sunday. If you are calculating shift costs you will need to know even the holidays "hidden by sundays". +The optional region function argument `includingSundays` switches the behavior of the region function to include "gesetzliche Feiertage" that fall on Sundays in its output. This is important in Brandenburg, particularly for Easter and Pentecost Sunday. If you are calculating shift costs you will need to know even the holidays "hidden by Sunday". -The region functions return the public holidays ("gesetzliche Feiertage"). The function `all` instead returns all the defined "special dates" as well. For example the Penance Day (Buß- und Bettag) or the begin/end of daylight saving time. +The region functions return the public holidays ("gesetzliche Feiertage"). The function `all` returns all defined "special dates", such as Penance Day (Buß- und Bettag) or the begin/end of daylight saving time. The regional functions for Austrian Bundesländer include saints' days which are state-level holidays, meaning schools etc. are generally closed but workers don't get the day off by default. If you don't want to diff --git a/region.go b/region.go index b6ecc48..f7e10d8 100644 --- a/region.go +++ b/region.go @@ -25,7 +25,7 @@ func (r Region) String() string { } func createFeiertagsList(y int, l string, ffun []func(int) Feiertag) []Feiertag { -var feiern []func(int) Feiertag + var feiern []func(int) Feiertag if l == "AT" { feiern = []func(int) Feiertag{Neujahr, HeiligeDreiKönige, Ostermontag, Staatsfeiertag, ChristiHimmelfahrt, PfingstMontag, Fronleichnam, @@ -245,7 +245,7 @@ func All(y int, inklSonntage ...bool) Region { if len(inklSonntage) == 0 || inklSonntage[0] == true { ffun = append(ffun, Karnevalssonntag, Palmsonntag, Ostern, Pfingsten, Dreifaltigkeitssonntag, Erntedankfest, Volkstrauertag, Totensonntag, - ErsterAdvent, ZweiterAdvent,DritterAdvent, VierterAdvent) + ErsterAdvent, ZweiterAdvent, DritterAdvent, VierterAdvent) } return Region{"Alle", "All", createFeiertagsList(y, "DE", ffun)} From 856b93f1434d4be6afefb8f68e28e0a7e7c47d7a Mon Sep 17 00:00:00 2001 From: Mike Knell Date: Mon, 15 May 2017 10:46:30 +0200 Subject: [PATCH 7/7] Fix small but significant bug for December 26th. --- feiertage.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feiertage.go b/feiertage.go index cebf247..1502a43 100644 --- a/feiertage.go +++ b/feiertage.go @@ -438,7 +438,7 @@ func ZweiterWeihnachtsfeiertag(x int) Feiertag { // In Austria, December 26th is Stefanitag. func Stefanitag(x int) Feiertag { - e := Christtag(x) + e := ZweiterWeihnachtsfeiertag(x) e.Text = "Stefanitag" return e }