January 2016 (UTC)

There are only two ways to write months: long form, and short form.
Long form: Months мај, јун, јул, maj, jun, jul + јуни, јули, juni, juli (besides other 9+9 i.e. 18 ones) all belong in long_months. That’s resolved.
Short form: short_months must all have dot (they’re all the dotted short names) except famous 6 (or 10 if you count јуни, јули, juni, juli which are variants for јун, јул, jun, jul, respectively). We don’t use "мај.", "јун.", "јул.", "maj.", "jun.", "jul." because there are already existing long forms in that shape ("мај", "јун", "јул", "maj", "jun", "jul"), and if we abbreviate "јуни", "јули", "juni", "juli" as "јун.", "јул.", "jun.", "jul." we did it illegally because there are already "јун", "јул", "jun", "jul" as long forms that cannot be abbreviated (and are used in Serbian much much more often than јуни, јули, juni, juli).
So, yes: dot is ALWAYS required for short month names except for my famous 6 with extra 4 mentioned above (famous 10 in total).

What you’have presumed is almost 100% correct, and code above should be actually 100% correct. Taking into account my two definitions above for long form and short form it’s like this, I suppose:
 long names of varying lengths; not shortened versions
local long_months = {['јануар']=1, ['фебруар']=2, ['март']=3, ['април']=4, ['мај']=5, ['јун']=6, ['јуни']=6, ['јул']=7, ['јули']=7, ['август']=8, ['септембар']=9, ['октобар']=10, ['новембар']=11, ['децембар']=12, ['januar']=1, ['februar']=2, ['mart']=3, ['april']=4, ['maj']=5, ['jun']=6, ['juni']=6, ['jul']=7, ['juli']=7, ['avgust']=8, ['septembar']=9, ['oktobar']=10, ['novembar']=11, ['decembar']=12};

 short names all three characters; these do not use terminal period
local short_months = {['мај']=5, ['јун']=6, ['јул']=7, ['maj']=5, ['jun']=6, ['jul']=7};

 short names all three characters; these require terminal period
local dot_months = {['јан']=1, ['феб']=2, ['мар']=3, ['апр']=4, ['авг']=8, ['сеп']=9, ['окт']=10, ['нов']=11, ['дец']=12, ['jan']=1, ['feb']=2, ['mar']=3, ['apr']=4, ['avg']=8, ['sep']=9, ['okt']=10, ['nov']=11, ['dec']=12};

Only changes are extra , ['јун']=6 and , ['јул']=7 for local long_months, and is_valid_month_range_style() should do the job perfectly.

It can be equaled to December–June 2014 which might be December 2013 – June 2014 or December 2014 – June 2015. Winter–Spring 2014 is still ambiguos in my opinion, and dates for solstices and eqinoxes don’t change that by  values they have at the moment (which are going to change in the very far future because Earth does not travel along the same path every year; it changes for sure but for 10–I don’t know really meters). At that time, we won’t be on modules I hope.    04:54, 11