remind-rb 6.2.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +328 -0
- data/README.md +141 -0
- data/ext/remind/shim.c +379 -0
- data/lib/remind/builder.rb +252 -0
- data/lib/remind/library.rb +141 -0
- data/lib/remind/native.rb +257 -0
- data/lib/remind/reminder.rb +527 -0
- data/lib/remind/runtime.rb +130 -0
- data/lib/remind/session.rb +246 -0
- data/lib/remind/source.rb +160 -0
- data/lib/remind/value.rb +170 -0
- data/lib/remind/version.rb +13 -0
- data/lib/remind.rb +147 -0
- data/remind-v06.02.10/COPYRIGHT +300 -0
- data/remind-v06.02.10/configure +5684 -0
- data/remind-v06.02.10/configure.ac +131 -0
- data/remind-v06.02.10/docs/WHATSNEW +3858 -0
- data/remind-v06.02.10/include/ansitext.rem +35 -0
- data/remind-v06.02.10/include/holidays/ad/02.rem +15 -0
- data/remind-v06.02.10/include/holidays/ad/03.rem +14 -0
- data/remind-v06.02.10/include/holidays/ad/04.rem +14 -0
- data/remind-v06.02.10/include/holidays/ad/05.rem +14 -0
- data/remind-v06.02.10/include/holidays/ad/06.rem +16 -0
- data/remind-v06.02.10/include/holidays/ad/07.rem +15 -0
- data/remind-v06.02.10/include/holidays/ad/08.rem +14 -0
- data/remind-v06.02.10/include/holidays/ad.rem +28 -0
- data/remind-v06.02.10/include/holidays/ae.rem +10 -0
- data/remind-v06.02.10/include/holidays/al.rem +33 -0
- data/remind-v06.02.10/include/holidays/am.rem +19 -0
- data/remind-v06.02.10/include/holidays/ao.rem +41 -0
- data/remind-v06.02.10/include/holidays/ar.rem +38 -0
- data/remind-v06.02.10/include/holidays/as.rem +40 -0
- data/remind-v06.02.10/include/holidays/at/1.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/2.rem +16 -0
- data/remind-v06.02.10/include/holidays/at/3.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/4.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/5.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/6.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/7.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/8.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/9.rem +15 -0
- data/remind-v06.02.10/include/holidays/at.rem +32 -0
- data/remind-v06.02.10/include/holidays/au/act.rem +27 -0
- data/remind-v06.02.10/include/holidays/au/nsw.rem +25 -0
- data/remind-v06.02.10/include/holidays/au/nt.rem +28 -0
- data/remind-v06.02.10/include/holidays/au/qld.rem +23 -0
- data/remind-v06.02.10/include/holidays/au/sa.rem +29 -0
- data/remind-v06.02.10/include/holidays/au/tas.rem +16 -0
- data/remind-v06.02.10/include/holidays/au/vic.rem +24 -0
- data/remind-v06.02.10/include/holidays/au/wa.rem +24 -0
- data/remind-v06.02.10/include/holidays/au.rem +21 -0
- data/remind-v06.02.10/include/holidays/aw.rem +19 -0
- data/remind-v06.02.10/include/holidays/az.rem +44 -0
- data/remind-v06.02.10/include/holidays/ba/bih.rem +23 -0
- data/remind-v06.02.10/include/holidays/ba/brc.rem +20 -0
- data/remind-v06.02.10/include/holidays/ba/srp.rem +23 -0
- data/remind-v06.02.10/include/holidays/ba.rem +22 -0
- data/remind-v06.02.10/include/holidays/bb.rem +28 -0
- data/remind-v06.02.10/include/holidays/bd.rem +14 -0
- data/remind-v06.02.10/include/holidays/be.rem +24 -0
- data/remind-v06.02.10/include/holidays/bf.rem +29 -0
- data/remind-v06.02.10/include/holidays/bg.rem +34 -0
- data/remind-v06.02.10/include/holidays/bh.rem +11 -0
- data/remind-v06.02.10/include/holidays/bi.rem +30 -0
- data/remind-v06.02.10/include/holidays/bn.rem +22 -0
- data/remind-v06.02.10/include/holidays/bo/b.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/c.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/h.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/l.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/n.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/o.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/p.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/s.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/t.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo.rem +32 -0
- data/remind-v06.02.10/include/holidays/br/ac.rem +21 -0
- data/remind-v06.02.10/include/holidays/br/al.rem +16 -0
- data/remind-v06.02.10/include/holidays/br/am.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/ap.rem +15 -0
- data/remind-v06.02.10/include/holidays/br/ba.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/ce.rem +15 -0
- data/remind-v06.02.10/include/holidays/br/df.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/es.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/go.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/ma.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/mg.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/ms.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pa.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pb.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pe.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pi.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pr.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/rj.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/rn.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/ro.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/rr.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/rs.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/sc.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/se.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/sp.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/to.rem +15 -0
- data/remind-v06.02.10/include/holidays/br.rem +33 -0
- data/remind-v06.02.10/include/holidays/bs.rem +26 -0
- data/remind-v06.02.10/include/holidays/bw.rem +31 -0
- data/remind-v06.02.10/include/holidays/by.rem +17 -0
- data/remind-v06.02.10/include/holidays/bz.rem +43 -0
- data/remind-v06.02.10/include/holidays/ca/ab.rem +17 -0
- data/remind-v06.02.10/include/holidays/ca/bc.rem +14 -0
- data/remind-v06.02.10/include/holidays/ca/mb.rem +16 -0
- data/remind-v06.02.10/include/holidays/ca/nb.rem +14 -0
- data/remind-v06.02.10/include/holidays/ca/nl.rem +19 -0
- data/remind-v06.02.10/include/holidays/ca/ns.rem +16 -0
- data/remind-v06.02.10/include/holidays/ca/nt.rem +14 -0
- data/remind-v06.02.10/include/holidays/ca/nu.rem +16 -0
- data/remind-v06.02.10/include/holidays/ca/on.rem +16 -0
- data/remind-v06.02.10/include/holidays/ca/pe.rem +13 -0
- data/remind-v06.02.10/include/holidays/ca/qc.rem +18 -0
- data/remind-v06.02.10/include/holidays/ca/sk.rem +14 -0
- data/remind-v06.02.10/include/holidays/ca/yt.rem +17 -0
- data/remind-v06.02.10/include/holidays/ca.rem +37 -0
- data/remind-v06.02.10/include/holidays/cg.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/ag.rem +22 -0
- data/remind-v06.02.10/include/holidays/ch/ai.rem +20 -0
- data/remind-v06.02.10/include/holidays/ch/ar.rem +16 -0
- data/remind-v06.02.10/include/holidays/ch/be.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/bl.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/bs.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/fr.rem +19 -0
- data/remind-v06.02.10/include/holidays/ch/ge.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/gl.rem +22 -0
- data/remind-v06.02.10/include/holidays/ch/gr.rem +18 -0
- data/remind-v06.02.10/include/holidays/ch/ju.rem +21 -0
- data/remind-v06.02.10/include/holidays/ch/lu.rem +21 -0
- data/remind-v06.02.10/include/holidays/ch/ne.rem +18 -0
- data/remind-v06.02.10/include/holidays/ch/nw.rem +24 -0
- data/remind-v06.02.10/include/holidays/ch/ow.rem +24 -0
- data/remind-v06.02.10/include/holidays/ch/sg.rem +20 -0
- data/remind-v06.02.10/include/holidays/ch/sh.rem +20 -0
- data/remind-v06.02.10/include/holidays/ch/so.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/sz.rem +22 -0
- data/remind-v06.02.10/include/holidays/ch/tg.rem +18 -0
- data/remind-v06.02.10/include/holidays/ch/ti.rem +23 -0
- data/remind-v06.02.10/include/holidays/ch/ur.rem +22 -0
- data/remind-v06.02.10/include/holidays/ch/vd.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/vs.rem +23 -0
- data/remind-v06.02.10/include/holidays/ch/zg.rem +23 -0
- data/remind-v06.02.10/include/holidays/ch/zh.rem +18 -0
- data/remind-v06.02.10/include/holidays/ch.rem +18 -0
- data/remind-v06.02.10/include/holidays/chinese-new-year.rem +86 -0
- data/remind-v06.02.10/include/holidays/cl/ap.rem +13 -0
- data/remind-v06.02.10/include/holidays/cl/nb.rem +13 -0
- data/remind-v06.02.10/include/holidays/cl.rem +46 -0
- data/remind-v06.02.10/include/holidays/cm.rem +21 -0
- data/remind-v06.02.10/include/holidays/co.rem +85 -0
- data/remind-v06.02.10/include/holidays/cr.rem +39 -0
- data/remind-v06.02.10/include/holidays/cu.rem +19 -0
- data/remind-v06.02.10/include/holidays/cw.rem +24 -0
- data/remind-v06.02.10/include/holidays/cy.rem +27 -0
- data/remind-v06.02.10/include/holidays/cz.rem +20 -0
- data/remind-v06.02.10/include/holidays/de/bb.rem +15 -0
- data/remind-v06.02.10/include/holidays/de/be.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/bw.rem +15 -0
- data/remind-v06.02.10/include/holidays/de/by.rem +18 -0
- data/remind-v06.02.10/include/holidays/de/hb.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/he.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/hh.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/mv.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/ni.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/nw.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/rp.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/sh.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/sl.rem +15 -0
- data/remind-v06.02.10/include/holidays/de/sn.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/st.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/th.rem +14 -0
- data/remind-v06.02.10/include/holidays/de.rem +23 -0
- data/remind-v06.02.10/include/holidays/discordian.rem +25 -0
- data/remind-v06.02.10/include/holidays/dj.rem +12 -0
- data/remind-v06.02.10/include/holidays/dk.rem +23 -0
- data/remind-v06.02.10/include/holidays/dm.rem +24 -0
- data/remind-v06.02.10/include/holidays/do.rem +36 -0
- data/remind-v06.02.10/include/holidays/dz.rem +12 -0
- data/remind-v06.02.10/include/holidays/ec.rem +48 -0
- data/remind-v06.02.10/include/holidays/ee.rem +19 -0
- data/remind-v06.02.10/include/holidays/eg.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/an.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/ar.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/as.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/cb.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/ce.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/cl.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/cm.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/cn.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/ct.rem +16 -0
- data/remind-v06.02.10/include/holidays/es/ex.rem +16 -0
- data/remind-v06.02.10/include/holidays/es/ga.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/ib.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/mc.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/md.rem +16 -0
- data/remind-v06.02.10/include/holidays/es/ml.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/nc.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/pv.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/ri.rem +16 -0
- data/remind-v06.02.10/include/holidays/es/vc.rem +16 -0
- data/remind-v06.02.10/include/holidays/es.rem +23 -0
- data/remind-v06.02.10/include/holidays/et.rem +20 -0
- data/remind-v06.02.10/include/holidays/fi.rem +43 -0
- data/remind-v06.02.10/include/holidays/fr/bl.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/ges.rem +14 -0
- data/remind-v06.02.10/include/holidays/fr/gp.rem +16 -0
- data/remind-v06.02.10/include/holidays/fr/gy.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/mf.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/mq.rem +15 -0
- data/remind-v06.02.10/include/holidays/fr/nc.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/pf.rem +15 -0
- data/remind-v06.02.10/include/holidays/fr/re.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/wf.rem +14 -0
- data/remind-v06.02.10/include/holidays/fr/yt.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr.rem +18 -0
- data/remind-v06.02.10/include/holidays/ga.rem +18 -0
- data/remind-v06.02.10/include/holidays/gb/eng.rem +14 -0
- data/remind-v06.02.10/include/holidays/gb/nir.rem +20 -0
- data/remind-v06.02.10/include/holidays/gb/sct.rem +20 -0
- data/remind-v06.02.10/include/holidays/gb/wls.rem +14 -0
- data/remind-v06.02.10/include/holidays/gb.rem +27 -0
- data/remind-v06.02.10/include/holidays/ge.rem +24 -0
- data/remind-v06.02.10/include/holidays/gh.rem +34 -0
- data/remind-v06.02.10/include/holidays/gl.rem +25 -0
- data/remind-v06.02.10/include/holidays/gr.rem +37 -0
- data/remind-v06.02.10/include/holidays/gt.rem +24 -0
- data/remind-v06.02.10/include/holidays/gu.rem +37 -0
- data/remind-v06.02.10/include/holidays/hk.rem +25 -0
- data/remind-v06.02.10/include/holidays/hn.rem +18 -0
- data/remind-v06.02.10/include/holidays/hr.rem +21 -0
- data/remind-v06.02.10/include/holidays/ht.rem +34 -0
- data/remind-v06.02.10/include/holidays/hu.rem +20 -0
- data/remind-v06.02.10/include/holidays/id.rem +15 -0
- data/remind-v06.02.10/include/holidays/ie.rem +41 -0
- data/remind-v06.02.10/include/holidays/im.rem +26 -0
- data/remind-v06.02.10/include/holidays/in/ap.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/as.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/br.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/cg.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/gj.rem +15 -0
- data/remind-v06.02.10/include/holidays/in/hr.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/ka.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/kl.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/mh.rem +15 -0
- data/remind-v06.02.10/include/holidays/in/mp.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/od.rem +15 -0
- data/remind-v06.02.10/include/holidays/in/rj.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/sk.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/tn.rem +15 -0
- data/remind-v06.02.10/include/holidays/in/ts.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/uk.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/up.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/wb.rem +16 -0
- data/remind-v06.02.10/include/holidays/in.rem +24 -0
- data/remind-v06.02.10/include/holidays/is.rem +23 -0
- data/remind-v06.02.10/include/holidays/it/ag.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/al.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/an.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/andria.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ao.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ap.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/aq.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ar.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/at.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/av.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ba.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/barletta.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bg.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bl.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bo.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/br.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bs.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bt.rem +15 -0
- data/remind-v06.02.10/include/holidays/it/bz.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/ca.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cb.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ce.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cesena.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ch.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cl.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/co.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cs.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ct.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cz.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/en.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fc.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/fe.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fg.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fi.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fm.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/forli.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ge.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/go.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/gr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/im.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/is.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/kr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/lc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/le.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/li.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/lo.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/lt.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/lu.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mb.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/me.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mi.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mo.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ms.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mt.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/na.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/no.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/nu.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/or.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pa.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pd.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pe.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pesaro.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pg.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/pi.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pn.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/pr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pt.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pu.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/pv.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pz.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ra.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/rc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/re.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/rg.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/ri.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/rm.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/rn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ro.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/sa.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/si.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/so.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/sp.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/sr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ss.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/su.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/sv.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ta.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/te.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/tn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/to.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/tp.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/tr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/trani.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ts.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/tv.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ud.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/urbino.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/va.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vb.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ve.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/vi.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vt.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vv.rem +13 -0
- data/remind-v06.02.10/include/holidays/it.rem +26 -0
- data/remind-v06.02.10/include/holidays/je.rem +19 -0
- data/remind-v06.02.10/include/holidays/jewish.rem +135 -0
- data/remind-v06.02.10/include/holidays/jm.rem +24 -0
- data/remind-v06.02.10/include/holidays/jo.rem +11 -0
- data/remind-v06.02.10/include/holidays/jp.rem +27 -0
- data/remind-v06.02.10/include/holidays/ke.rem +25 -0
- data/remind-v06.02.10/include/holidays/kg.rem +20 -0
- data/remind-v06.02.10/include/holidays/kh.rem +22 -0
- data/remind-v06.02.10/include/holidays/kn.rem +28 -0
- data/remind-v06.02.10/include/holidays/kr.rem +19 -0
- data/remind-v06.02.10/include/holidays/kw.rem +10 -0
- data/remind-v06.02.10/include/holidays/kz.rem +34 -0
- data/remind-v06.02.10/include/holidays/la.rem +47 -0
- data/remind-v06.02.10/include/holidays/lgbtq/au.rem +8 -0
- data/remind-v06.02.10/include/holidays/lgbtq/br.rem +10 -0
- data/remind-v06.02.10/include/holidays/lgbtq/ca.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/cl.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/ie.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/in.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/nl.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/ua.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/uk.rem +8 -0
- data/remind-v06.02.10/include/holidays/lgbtq/us.rem +16 -0
- data/remind-v06.02.10/include/holidays/lgbtq.rem +34 -0
- data/remind-v06.02.10/include/holidays/li.rem +31 -0
- data/remind-v06.02.10/include/holidays/ls.rem +18 -0
- data/remind-v06.02.10/include/holidays/lt.rem +23 -0
- data/remind-v06.02.10/include/holidays/lu.rem +18 -0
- data/remind-v06.02.10/include/holidays/lv.rem +25 -0
- data/remind-v06.02.10/include/holidays/ma.rem +17 -0
- data/remind-v06.02.10/include/holidays/mc.rem +26 -0
- data/remind-v06.02.10/include/holidays/md.rem +21 -0
- data/remind-v06.02.10/include/holidays/me.rem +28 -0
- data/remind-v06.02.10/include/holidays/mg.rem +24 -0
- data/remind-v06.02.10/include/holidays/mh.rem +22 -0
- data/remind-v06.02.10/include/holidays/misc.rem +9 -0
- data/remind-v06.02.10/include/holidays/mk.rem +17 -0
- data/remind-v06.02.10/include/holidays/mp.rem +44 -0
- data/remind-v06.02.10/include/holidays/mr.rem +11 -0
- data/remind-v06.02.10/include/holidays/mt.rem +21 -0
- data/remind-v06.02.10/include/holidays/mv.rem +12 -0
- data/remind-v06.02.10/include/holidays/mw.rem +36 -0
- data/remind-v06.02.10/include/holidays/mx.rem +15 -0
- data/remind-v06.02.10/include/holidays/my/01.rem +13 -0
- data/remind-v06.02.10/include/holidays/my/02.rem +13 -0
- data/remind-v06.02.10/include/holidays/my/03.rem +14 -0
- data/remind-v06.02.10/include/holidays/my/04.rem +18 -0
- data/remind-v06.02.10/include/holidays/my/05.rem +16 -0
- data/remind-v06.02.10/include/holidays/my/06.rem +17 -0
- data/remind-v06.02.10/include/holidays/my/07.rem +17 -0
- data/remind-v06.02.10/include/holidays/my/08.rem +15 -0
- data/remind-v06.02.10/include/holidays/my/09.rem +14 -0
- data/remind-v06.02.10/include/holidays/my/10.rem +16 -0
- data/remind-v06.02.10/include/holidays/my/11.rem +16 -0
- data/remind-v06.02.10/include/holidays/my/12.rem +19 -0
- data/remind-v06.02.10/include/holidays/my/13.rem +22 -0
- data/remind-v06.02.10/include/holidays/my/14.rem +16 -0
- data/remind-v06.02.10/include/holidays/my/15.rem +18 -0
- data/remind-v06.02.10/include/holidays/my/16.rem +16 -0
- data/remind-v06.02.10/include/holidays/my.rem +23 -0
- data/remind-v06.02.10/include/holidays/mz.rem +25 -0
- data/remind-v06.02.10/include/holidays/na.rem +27 -0
- data/remind-v06.02.10/include/holidays/ng.rem +21 -0
- data/remind-v06.02.10/include/holidays/ni/mn.rem +14 -0
- data/remind-v06.02.10/include/holidays/ni.rem +24 -0
- data/remind-v06.02.10/include/holidays/nl.rem +26 -0
- data/remind-v06.02.10/include/holidays/no.rem +19 -0
- data/remind-v06.02.10/include/holidays/nz/auk.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/can.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/cit.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/hkb.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/mbh.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/nsn.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/ntl.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/ota.rem +14 -0
- data/remind-v06.02.10/include/holidays/nz/south_canterbury.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/stl.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/tki.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/wgn.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/wtc.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz.rem +69 -0
- data/remind-v06.02.10/include/holidays/pa.rem +27 -0
- data/remind-v06.02.10/include/holidays/pagan.rem +65 -0
- data/remind-v06.02.10/include/holidays/pe.rem +22 -0
- data/remind-v06.02.10/include/holidays/pg.rem +24 -0
- data/remind-v06.02.10/include/holidays/ph.rem +26 -0
- data/remind-v06.02.10/include/holidays/pk.rem +13 -0
- data/remind-v06.02.10/include/holidays/pl.rem +20 -0
- data/remind-v06.02.10/include/holidays/pr.rem +40 -0
- data/remind-v06.02.10/include/holidays/pt/01.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/02.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/03.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/04.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/05.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/06.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/07.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/08.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/09.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/10.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/12.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/13.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/14.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/15.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/16.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/18.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/20.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/30.rem +14 -0
- data/remind-v06.02.10/include/holidays/pt.rem +17 -0
- data/remind-v06.02.10/include/holidays/pw.rem +34 -0
- data/remind-v06.02.10/include/holidays/py.rem +20 -0
- data/remind-v06.02.10/include/holidays/ro.rem +24 -0
- data/remind-v06.02.10/include/holidays/rs.rem +26 -0
- data/remind-v06.02.10/include/holidays/ru.rem +21 -0
- data/remind-v06.02.10/include/holidays/sa.rem +13 -0
- data/remind-v06.02.10/include/holidays/sc.rem +28 -0
- data/remind-v06.02.10/include/holidays/se.rem +23 -0
- data/remind-v06.02.10/include/holidays/sg.rem +16 -0
- data/remind-v06.02.10/include/holidays/si.rem +20 -0
- data/remind-v06.02.10/include/holidays/sk.rem +25 -0
- data/remind-v06.02.10/include/holidays/sm.rem +25 -0
- data/remind-v06.02.10/include/holidays/sv/ss.rem +14 -0
- data/remind-v06.02.10/include/holidays/sv.rem +25 -0
- data/remind-v06.02.10/include/holidays/sz.rem +26 -0
- data/remind-v06.02.10/include/holidays/td.rem +22 -0
- data/remind-v06.02.10/include/holidays/th.rem +72 -0
- data/remind-v06.02.10/include/holidays/tl.rem +31 -0
- data/remind-v06.02.10/include/holidays/tn.rem +15 -0
- data/remind-v06.02.10/include/holidays/to.rem +38 -0
- data/remind-v06.02.10/include/holidays/tr.rem +17 -0
- data/remind-v06.02.10/include/holidays/tw.rem +26 -0
- data/remind-v06.02.10/include/holidays/tz.rem +23 -0
- data/remind-v06.02.10/include/holidays/ua.rem +20 -0
- data/remind-v06.02.10/include/holidays/uk.rem +27 -0
- data/remind-v06.02.10/include/holidays/um.rem +32 -0
- data/remind-v06.02.10/include/holidays/us/ak.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/al.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/ar.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/as.rem +20 -0
- data/remind-v06.02.10/include/holidays/us/az.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/ca.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/co.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/ct.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/dc.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/de.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/fl.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/ga.rem +18 -0
- data/remind-v06.02.10/include/holidays/us/gu.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/hi.rem +19 -0
- data/remind-v06.02.10/include/holidays/us/ia.rem +15 -0
- data/remind-v06.02.10/include/holidays/us/id.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/il.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/in.rem +19 -0
- data/remind-v06.02.10/include/holidays/us/ks.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/ky.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/la.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/ma.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/md-extra.rem +19 -0
- data/remind-v06.02.10/include/holidays/us/md.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/me.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/mi.rem +19 -0
- data/remind-v06.02.10/include/holidays/us/mo.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/mp.rem +23 -0
- data/remind-v06.02.10/include/holidays/us/ms.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/mt.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/nc.rem +22 -0
- data/remind-v06.02.10/include/holidays/us/ne.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/nh.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/nj.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/nm.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/nv.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/ny.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/oh.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/ok.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/pa.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/pr.rem +21 -0
- data/remind-v06.02.10/include/holidays/us/ri.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/sc.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/sd.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/tn.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/tx.rem +25 -0
- data/remind-v06.02.10/include/holidays/us/ut.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/va.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/vi.rem +22 -0
- data/remind-v06.02.10/include/holidays/us/vt.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/wi.rem +20 -0
- data/remind-v06.02.10/include/holidays/us/wv.rem +17 -0
- data/remind-v06.02.10/include/holidays/us.rem +41 -0
- data/remind-v06.02.10/include/holidays/uy.rem +39 -0
- data/remind-v06.02.10/include/holidays/uz.rem +21 -0
- data/remind-v06.02.10/include/holidays/va.rem +23 -0
- data/remind-v06.02.10/include/holidays/ve.rem +21 -0
- data/remind-v06.02.10/include/holidays/vi.rem +41 -0
- data/remind-v06.02.10/include/holidays/vn.rem +17 -0
- data/remind-v06.02.10/include/holidays/vu.rem +32 -0
- data/remind-v06.02.10/include/holidays/ws.rem +18 -0
- data/remind-v06.02.10/include/holidays/za.rem +28 -0
- data/remind-v06.02.10/include/holidays/zm.rem +31 -0
- data/remind-v06.02.10/include/lang/auto.rem +32 -0
- data/remind-v06.02.10/include/lang/ca.rem +60 -0
- data/remind-v06.02.10/include/lang/da.rem +77 -0
- data/remind-v06.02.10/include/lang/de.rem +80 -0
- data/remind-v06.02.10/include/lang/en.rem +4 -0
- data/remind-v06.02.10/include/lang/es.rem +55 -0
- data/remind-v06.02.10/include/lang/fi.rem +202 -0
- data/remind-v06.02.10/include/lang/fr.rem +172 -0
- data/remind-v06.02.10/include/lang/gr.rem +74 -0
- data/remind-v06.02.10/include/lang/is.rem +58 -0
- data/remind-v06.02.10/include/lang/it.rem +76 -0
- data/remind-v06.02.10/include/lang/nl.rem +71 -0
- data/remind-v06.02.10/include/lang/no.rem +66 -0
- data/remind-v06.02.10/include/lang/pl.rem +177 -0
- data/remind-v06.02.10/include/lang/pt.rem +176 -0
- data/remind-v06.02.10/include/lang/ro.rem +74 -0
- data/remind-v06.02.10/include/lunar-eclipses.rem +149 -0
- data/remind-v06.02.10/include/moonphases.rem +19 -0
- data/remind-v06.02.10/include/seasons.rem +21 -0
- data/remind-v06.02.10/include/solar-eclipses.rem +238 -0
- data/remind-v06.02.10/include/sun.rem +12 -0
- data/remind-v06.02.10/include/translations/de/holidays/chinese-new-year.rem +13 -0
- data/remind-v06.02.10/include/translations/de/moonphases.rem +4 -0
- data/remind-v06.02.10/include/translations/de/seasons.rem +4 -0
- data/remind-v06.02.10/include/translations/de/sun.rem +2 -0
- data/remind-v06.02.10/include/translations/nl/holidays/chinese-new-year.rem +13 -0
- data/remind-v06.02.10/include/translations/nl/moonphases.rem +4 -0
- data/remind-v06.02.10/include/translations/nl/seasons.rem +4 -0
- data/remind-v06.02.10/include/translations/nl/sun.rem +2 -0
- data/remind-v06.02.10/include/utils/add-html-anchors.rem +5 -0
- data/remind-v06.02.10/install-sh +238 -0
- data/remind-v06.02.10/man/rem.1.in +21 -0
- data/remind-v06.02.10/man/rem2ps.1.in +816 -0
- data/remind-v06.02.10/man/remind.1.in +7658 -0
- data/remind-v06.02.10/man/tkremind.1.in +612 -0
- data/remind-v06.02.10/rem2html/Makefile.in +30 -0
- data/remind-v06.02.10/rem2html/rem2html.in +1299 -0
- data/remind-v06.02.10/rem2pdf/Makefile.PL.in +25 -0
- data/remind-v06.02.10/rem2pdf/Makefile.top.in +50 -0
- data/remind-v06.02.10/rem2pdf/bin/rem2pdf.in +761 -0
- data/remind-v06.02.10/scripts/tkremind.in +5794 -0
- data/remind-v06.02.10/src/Makefile.in +133 -0
- data/remind-v06.02.10/src/calendar.c +3069 -0
- data/remind-v06.02.10/src/config.h +117 -0
- data/remind-v06.02.10/src/config.h.in +116 -0
- data/remind-v06.02.10/src/custom.h +167 -0
- data/remind-v06.02.10/src/custom.h.in +167 -0
- data/remind-v06.02.10/src/dedupe.c +179 -0
- data/remind-v06.02.10/src/dorem.c +2389 -0
- data/remind-v06.02.10/src/dosubst.c +910 -0
- data/remind-v06.02.10/src/dynbuf.c +198 -0
- data/remind-v06.02.10/src/dynbuf.h +41 -0
- data/remind-v06.02.10/src/err.h +294 -0
- data/remind-v06.02.10/src/expr.c +3408 -0
- data/remind-v06.02.10/src/files.c +1437 -0
- data/remind-v06.02.10/src/funcs.c +5230 -0
- data/remind-v06.02.10/src/globals.c +23 -0
- data/remind-v06.02.10/src/globals.h +277 -0
- data/remind-v06.02.10/src/hashtab.c +428 -0
- data/remind-v06.02.10/src/hashtab.h +88 -0
- data/remind-v06.02.10/src/hashtab_stats.c +101 -0
- data/remind-v06.02.10/src/hbcal.c +579 -0
- data/remind-v06.02.10/src/ifelse.c +236 -0
- data/remind-v06.02.10/src/init.c +1494 -0
- data/remind-v06.02.10/src/json.c +1048 -0
- data/remind-v06.02.10/src/json.h +276 -0
- data/remind-v06.02.10/src/main.c +2310 -0
- data/remind-v06.02.10/src/md5.c +250 -0
- data/remind-v06.02.10/src/md5.h +33 -0
- data/remind-v06.02.10/src/moon.c +957 -0
- data/remind-v06.02.10/src/omit.c +560 -0
- data/remind-v06.02.10/src/protos.h +284 -0
- data/remind-v06.02.10/src/queue.c +1118 -0
- data/remind-v06.02.10/src/rem2ps.c +1383 -0
- data/remind-v06.02.10/src/rem2ps.h +229 -0
- data/remind-v06.02.10/src/sort.c +257 -0
- data/remind-v06.02.10/src/token.c +494 -0
- data/remind-v06.02.10/src/trans.c +544 -0
- data/remind-v06.02.10/src/trigger.c +871 -0
- data/remind-v06.02.10/src/types.h +341 -0
- data/remind-v06.02.10/src/userfns.c +810 -0
- data/remind-v06.02.10/src/utils.c +374 -0
- data/remind-v06.02.10/src/var.c +1762 -0
- data/remind-v06.02.10/src/version.h +1 -0
- data/remind-v06.02.10/src/version.h.in +1 -0
- data/remind-v06.02.10/src/xlat.c +100 -0
- data/remind-v06.02.10/www/Makefile.in +91 -0
- metadata +764 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "date"
|
|
4
|
+
require "fiddle"
|
|
5
|
+
|
|
6
|
+
require_relative "library"
|
|
7
|
+
require_relative "native"
|
|
8
|
+
require_relative "runtime"
|
|
9
|
+
require_relative "value"
|
|
10
|
+
|
|
11
|
+
module Remind
|
|
12
|
+
# Remind evaluated something and objected. The message is Remind's own, out
|
|
13
|
+
# of `GetErr`.
|
|
14
|
+
class EvaluationError < Error
|
|
15
|
+
attr_reader :code, :subject
|
|
16
|
+
|
|
17
|
+
def initialize(code, message, subject)
|
|
18
|
+
@code = code
|
|
19
|
+
@subject = subject
|
|
20
|
+
|
|
21
|
+
super("#{message} in #{subject.inspect}")
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# A live Remind interpreter.
|
|
26
|
+
#
|
|
27
|
+
# Remind is a program, not a library, and it shows in the shape of the C:
|
|
28
|
+
# today's date is a global, the current time is a global, and everything is
|
|
29
|
+
# computed against whatever those say. That has two consequences.
|
|
30
|
+
#
|
|
31
|
+
# The first is a gift: "now" is settable, so a calculation against a fixed
|
|
32
|
+
# date is reproducible rather than a reading off the clock. Converting a
|
|
33
|
+
# reminder file to a calendar depends on it -- `REM Mon` means a different
|
|
34
|
+
# first date tomorrow than it does today.
|
|
35
|
+
#
|
|
36
|
+
# The second is that the state is per-process, not per-object. Two Sessions
|
|
37
|
+
# are two views of the same globals, so the lock is on the class and calls
|
|
38
|
+
# into the library are serialised whether they came from one Session or
|
|
39
|
+
# several.
|
|
40
|
+
class Session
|
|
41
|
+
LOCK = Mutex.new
|
|
42
|
+
|
|
43
|
+
NO_TIME = -1
|
|
44
|
+
|
|
45
|
+
SECONDS_PER_MINUTE = 60
|
|
46
|
+
|
|
47
|
+
attr_reader :native
|
|
48
|
+
|
|
49
|
+
def initialize(native: Native.new, diagnostics: false)
|
|
50
|
+
@native = native
|
|
51
|
+
|
|
52
|
+
Runtime.boot(native, diagnostics: diagnostics)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Evaluates a Remind expression: an Integer for a number, a String for a
|
|
56
|
+
# string, a Date for a date, a Time for a datetime, minutes since midnight
|
|
57
|
+
# for a time.
|
|
58
|
+
#
|
|
59
|
+
# session.evaluate("moonphase(today())") # => 46
|
|
60
|
+
# session.evaluate("version()") # => "06.02.10"
|
|
61
|
+
def evaluate(expression)
|
|
62
|
+
LOCK.synchronize do
|
|
63
|
+
evaluate_unlocked(expression)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# The date every relative calculation is relative to.
|
|
68
|
+
def today
|
|
69
|
+
date(native.read_global("DSEToday"))
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Pins it, the way `remind --date=` does.
|
|
73
|
+
def today=(date)
|
|
74
|
+
LOCK.synchronize do
|
|
75
|
+
pin_date(date)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Pins the date and the time of day together, for reminders that depend on
|
|
80
|
+
# the clock as well as the calendar.
|
|
81
|
+
def now=(time)
|
|
82
|
+
LOCK.synchronize do
|
|
83
|
+
pin_date(time.to_date)
|
|
84
|
+
pin_time((time.hour * 60) + time.min)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def unpin_time
|
|
89
|
+
LOCK.synchronize do
|
|
90
|
+
pin_time(nil)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Remind's day count for a date, and back again.
|
|
95
|
+
def dse(date)
|
|
96
|
+
native.dse(date.year, date.month - 1, date.day)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def date(dse)
|
|
100
|
+
Value.to_date(dse, native)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Whether Remind prints its own diagnostics -- the offending line with a
|
|
104
|
+
# caret under it -- as well as this raising.
|
|
105
|
+
def diagnostics=(wanted)
|
|
106
|
+
LOCK.synchronize do
|
|
107
|
+
Runtime.point_errors(native, wanted)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# The Remind release the library was built from, out of the library's own
|
|
112
|
+
# `version()` rather than out of this gem's idea of it.
|
|
113
|
+
def version
|
|
114
|
+
evaluate("version()")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def error_message(code)
|
|
118
|
+
native.error_message(code).to_s
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
private
|
|
122
|
+
|
|
123
|
+
def evaluate_unlocked(expression)
|
|
124
|
+
terminated = "#{expression}\0"
|
|
125
|
+
cursor = pointer_to(terminated)
|
|
126
|
+
result = Value.allocate
|
|
127
|
+
|
|
128
|
+
code = native.evaluate(cursor, result, nil)
|
|
129
|
+
|
|
130
|
+
if code.zero?
|
|
131
|
+
Value.read(result, native)
|
|
132
|
+
else
|
|
133
|
+
raise EvaluationError.new(code, error_message(code), expression)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# EvalExpr takes a `char **`: it advances the caller's pointer past what
|
|
138
|
+
# it consumed, so it is given a slot holding the address of the text
|
|
139
|
+
# rather than the text itself.
|
|
140
|
+
def pointer_to(text)
|
|
141
|
+
buffer = Fiddle::Pointer[text]
|
|
142
|
+
slot = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP, Fiddle::RUBY_FREE)
|
|
143
|
+
slot[0, Fiddle::SIZEOF_VOIDP] = [buffer.to_i].pack("J")
|
|
144
|
+
|
|
145
|
+
# The slot keeps an address, which the garbage collector cannot see,
|
|
146
|
+
# so the string it points into has to outlive the call.
|
|
147
|
+
@evaluating = text
|
|
148
|
+
|
|
149
|
+
slot
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# RealToday is deliberately left alone: it is what the system clock said
|
|
153
|
+
# when the library came up, and Remind uses it to tell today from a date
|
|
154
|
+
# it was told to pretend about.
|
|
155
|
+
def pin_date(date)
|
|
156
|
+
counted = dse(date)
|
|
157
|
+
|
|
158
|
+
native.write_global("DSEToday", counted)
|
|
159
|
+
native.write_global("LocalDSEToday", counted)
|
|
160
|
+
native.write_global("CurYear", date.year)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def pin_time(minutes)
|
|
164
|
+
if minutes.nil?
|
|
165
|
+
native.write_global("SysTime", NO_TIME)
|
|
166
|
+
native.write_global("LocalSysTime", NO_TIME)
|
|
167
|
+
else
|
|
168
|
+
native.write_global("SysTime", minutes * SECONDS_PER_MINUTE)
|
|
169
|
+
native.write_global("LocalSysTime", minutes * SECONDS_PER_MINUTE)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
__END__
|
|
176
|
+
|
|
177
|
+
describe "Remind::Session" do
|
|
178
|
+
session = Remind::Session.new
|
|
179
|
+
|
|
180
|
+
before do
|
|
181
|
+
session.today = Date.new(2027, 1, 15)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
describe "evaluate" do
|
|
185
|
+
it "answers an integer" do
|
|
186
|
+
session.evaluate("1 + 2").should == 3
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it "answers a string" do
|
|
190
|
+
session.evaluate('"a" + "b"').should == "ab"
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "answers a date" do
|
|
194
|
+
session.evaluate("today()").should == Date.new(2027, 1, 15)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it "answers a time as minutes since midnight" do
|
|
198
|
+
session.evaluate("12:30").should == 750
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
it "runs Remind's own functions" do
|
|
202
|
+
session.evaluate("wkdaynum(today())").should == 5
|
|
203
|
+
session.evaluate("trigger(date(2027, 1, 15))").should == "15 January 2027"
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
it "reads the version out of the library it loaded" do
|
|
207
|
+
session.version.should == Remind::REMIND_VERSION
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
it "raises with Remind's own message when the expression is wrong" do
|
|
211
|
+
error = lambda { session.evaluate("1 +") }.should.raise Remind::EvaluationError
|
|
212
|
+
|
|
213
|
+
error.message.should.include "1 +"
|
|
214
|
+
error.code.should.not == 0
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
describe "pinning the clock" do
|
|
219
|
+
it "makes today whatever it is told" do
|
|
220
|
+
session.today = Date.new(2030, 6, 1)
|
|
221
|
+
|
|
222
|
+
session.today.should == Date.new(2030, 6, 1)
|
|
223
|
+
session.evaluate("today()").should == Date.new(2030, 6, 1)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "makes a date calculation reproducible" do
|
|
227
|
+
session.evaluate("today() + 30").should == Date.new(2027, 2, 14)
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
it "pins the time of day as well" do
|
|
231
|
+
session.now = Time.local(2027, 1, 15, 9, 30)
|
|
232
|
+
|
|
233
|
+
session.evaluate("now()").should == 570
|
|
234
|
+
ensure
|
|
235
|
+
session.unpin_time
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
describe "dates" do
|
|
240
|
+
it "converts to Remind's day count and back" do
|
|
241
|
+
session.dse(Date.new(1990, 1, 1)).should == 0
|
|
242
|
+
session.date(0).should == Date.new(1990, 1, 1)
|
|
243
|
+
session.dse(Date.new(2027, 1, 15)).should == 13528
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fiddle"
|
|
4
|
+
|
|
5
|
+
require_relative "native"
|
|
6
|
+
require_relative "reminder"
|
|
7
|
+
require_relative "session"
|
|
8
|
+
|
|
9
|
+
module Remind
|
|
10
|
+
# A file of reminders, read by Remind.
|
|
11
|
+
#
|
|
12
|
+
# Named Source rather than File because it lives inside `Remind`, where a
|
|
13
|
+
# class called File would shadow the one in the standard library for every
|
|
14
|
+
# other file in the gem.
|
|
15
|
+
#
|
|
16
|
+
# A reminder file is not a list of lines. A backslash joins two of them into
|
|
17
|
+
# one; `INCLUDE` splices another file into the middle; `INCLUDEsys` reaches
|
|
18
|
+
# into the system directory for the holiday files that ship with Remind. Any
|
|
19
|
+
# reader that treats the file as text gets all three wrong, so this one does
|
|
20
|
+
# not read text: `IncludeFile` opens the file and `ReadLine` hands back one
|
|
21
|
+
# logical line at a time, out of whichever file is currently on Remind's
|
|
22
|
+
# stack, exactly as `remind` itself sees them.
|
|
23
|
+
#
|
|
24
|
+
# What comes out is the lines Remind can turn into events. Everything else
|
|
25
|
+
# -- SET, IF, OMIT, comments, RUN reminders -- is skipped, because it is a
|
|
26
|
+
# command rather than an appointment.
|
|
27
|
+
class Source
|
|
28
|
+
# Remind reads standard input under this name, the same as the program.
|
|
29
|
+
STDIN = "-"
|
|
30
|
+
|
|
31
|
+
attr_reader :path, :session
|
|
32
|
+
|
|
33
|
+
def initialize(path, session: Session.new)
|
|
34
|
+
@path = path
|
|
35
|
+
@session = session
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Every reminder in the file, in the order the file gives them. Lazy: a
|
|
39
|
+
# file can INCLUDE another, and a caller that only wants the first few
|
|
40
|
+
# should not pay for the rest.
|
|
41
|
+
def reminders
|
|
42
|
+
Enumerator.new do |found|
|
|
43
|
+
lines.each do |line|
|
|
44
|
+
reminder = Reminder.parse(line, session: session)
|
|
45
|
+
|
|
46
|
+
if reminder
|
|
47
|
+
found << reminder
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# The logical lines, continuations joined and includes spliced.
|
|
54
|
+
def lines
|
|
55
|
+
Enumerator.new do |line|
|
|
56
|
+
open
|
|
57
|
+
|
|
58
|
+
while (text = read)
|
|
59
|
+
line << text
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
def native
|
|
67
|
+
session.native
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def open
|
|
71
|
+
code = native.open_file(Fiddle::Pointer["#{path}\0"])
|
|
72
|
+
|
|
73
|
+
if code.nonzero?
|
|
74
|
+
raise EvaluationError.new(code, session.error_message(code), path)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# nil at the end of the last file, which is how the enumerator stops.
|
|
79
|
+
def read
|
|
80
|
+
slot = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP, Fiddle::RUBY_FREE)
|
|
81
|
+
code = native.read_line(slot)
|
|
82
|
+
|
|
83
|
+
if code.zero?
|
|
84
|
+
text_at(slot)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def text_at(slot)
|
|
89
|
+
address = slot[0, Fiddle::SIZEOF_VOIDP].unpack1("J")
|
|
90
|
+
|
|
91
|
+
if address.zero?
|
|
92
|
+
""
|
|
93
|
+
else
|
|
94
|
+
Fiddle::Pointer.new(address).to_s.force_encoding(Encoding::UTF_8)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
__END__
|
|
101
|
+
|
|
102
|
+
require "tempfile"
|
|
103
|
+
|
|
104
|
+
describe "Remind::Source" do
|
|
105
|
+
session = Remind::Session.new
|
|
106
|
+
session.today = Date.new(2026, 8, 19)
|
|
107
|
+
|
|
108
|
+
written = proc do |text|
|
|
109
|
+
file = Tempfile.new(["reminders", ".rem"])
|
|
110
|
+
file.write(text)
|
|
111
|
+
file.close
|
|
112
|
+
Remind::Source.new(file.path, session: session)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it "reads the reminders in a file" do
|
|
116
|
+
file = written.(<<~REM)
|
|
117
|
+
# A comment
|
|
118
|
+
REM 15 Jan MSG dentist
|
|
119
|
+
REM Mon MSG gym
|
|
120
|
+
REM
|
|
121
|
+
|
|
122
|
+
file.reminders.map(&:summary).should == ["dentist", "gym"]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "joins a continued line, the way Remind does" do
|
|
126
|
+
file = written.(<<~REM)
|
|
127
|
+
REM 15 Jan \\
|
|
128
|
+
MSG dentist
|
|
129
|
+
REM
|
|
130
|
+
|
|
131
|
+
file.reminders.map(&:summary).should == ["dentist"]
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it "skips the commands that are not reminders" do
|
|
135
|
+
file = written.(<<~REM)
|
|
136
|
+
SET a 1
|
|
137
|
+
OMIT 25 Dec
|
|
138
|
+
IF a > 0
|
|
139
|
+
REM 1 Jan MSG new year
|
|
140
|
+
ENDIF
|
|
141
|
+
REM
|
|
142
|
+
|
|
143
|
+
file.reminders.map(&:summary).should == ["new year"]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "splices in an included file" do
|
|
147
|
+
included = Tempfile.new(["included", ".rem"])
|
|
148
|
+
included.write("REM 4 Jul MSG fireworks\n")
|
|
149
|
+
included.close
|
|
150
|
+
|
|
151
|
+
file = written.("REM 1 Jan MSG new year\nINCLUDE #{included.path}\n")
|
|
152
|
+
|
|
153
|
+
file.reminders.map(&:summary).should == ["new year", "fireworks"]
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it "raises when the file is not there" do
|
|
157
|
+
lambda { Remind::Source.new("/nonexistent.rem", session: session).lines.to_a }
|
|
158
|
+
.should.raise Remind::EvaluationError
|
|
159
|
+
end
|
|
160
|
+
end
|
data/lib/remind/value.rb
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "date"
|
|
4
|
+
require "fiddle"
|
|
5
|
+
|
|
6
|
+
module Remind
|
|
7
|
+
# Remind's `Value` -- a type tag and a union of `char *` and `int` -- read
|
|
8
|
+
# back into Ruby.
|
|
9
|
+
#
|
|
10
|
+
# typedef struct {
|
|
11
|
+
# char type;
|
|
12
|
+
# union { char *str; int val; } v;
|
|
13
|
+
# } Value;
|
|
14
|
+
#
|
|
15
|
+
# This one struct is read directly rather than through the shim: it is two
|
|
16
|
+
# fields, the union sits at the pointer's alignment on every platform
|
|
17
|
+
# Fiddle runs on, and an expression's result is the only place it appears.
|
|
18
|
+
#
|
|
19
|
+
# Every type but one maps onto something already in the standard library.
|
|
20
|
+
# The exception is TIME, which Remind stores as minutes since midnight with
|
|
21
|
+
# no date attached; it stays an Integer, because inventing a date for it
|
|
22
|
+
# would be inventing information.
|
|
23
|
+
module Value
|
|
24
|
+
ERR = 0x0
|
|
25
|
+
|
|
26
|
+
INT = 0x1
|
|
27
|
+
|
|
28
|
+
TIME = 0x2
|
|
29
|
+
|
|
30
|
+
DATE = 0x4
|
|
31
|
+
|
|
32
|
+
DATETIME = TIME | DATE
|
|
33
|
+
|
|
34
|
+
STR = 0x8
|
|
35
|
+
|
|
36
|
+
MINUTES_PER_DAY = 1440
|
|
37
|
+
|
|
38
|
+
MINUTES_PER_HOUR = 60
|
|
39
|
+
|
|
40
|
+
UNION_OFFSET = Fiddle::SIZEOF_VOIDP
|
|
41
|
+
|
|
42
|
+
SIZE = Fiddle::SIZEOF_VOIDP * 2
|
|
43
|
+
|
|
44
|
+
module_function
|
|
45
|
+
|
|
46
|
+
def allocate
|
|
47
|
+
Fiddle::Pointer.malloc(SIZE, Fiddle::RUBY_FREE)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def type(pointer)
|
|
51
|
+
pointer[0, 1].unpack1("c")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# `native` is what turns a day count back into a date: Remind's own
|
|
55
|
+
# FromDSE, so the epoch is Remind's rather than one repeated here.
|
|
56
|
+
def read(pointer, native)
|
|
57
|
+
case type(pointer)
|
|
58
|
+
when INT then integer(pointer)
|
|
59
|
+
when STR then string(pointer)
|
|
60
|
+
when DATE then to_date(integer(pointer), native)
|
|
61
|
+
when TIME then integer(pointer)
|
|
62
|
+
when DATETIME then to_time(integer(pointer), native)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def integer(pointer)
|
|
67
|
+
pointer[UNION_OFFSET, Fiddle::SIZEOF_INT].unpack1("i!")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# The string was malloc'd by Remind and is ours to free once copied.
|
|
71
|
+
def string(pointer)
|
|
72
|
+
address = pointer[UNION_OFFSET, Fiddle::SIZEOF_VOIDP].unpack1("J")
|
|
73
|
+
|
|
74
|
+
if address.zero?
|
|
75
|
+
""
|
|
76
|
+
else
|
|
77
|
+
copied(address)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def copied(address)
|
|
82
|
+
Fiddle::Pointer.new(address).to_s.force_encoding(Encoding::UTF_8).tap do
|
|
83
|
+
Fiddle.free(address)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def to_date(dse, native)
|
|
88
|
+
year = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT, Fiddle::RUBY_FREE)
|
|
89
|
+
month = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT, Fiddle::RUBY_FREE)
|
|
90
|
+
day = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT, Fiddle::RUBY_FREE)
|
|
91
|
+
|
|
92
|
+
native.from_dse(
|
|
93
|
+
dse,
|
|
94
|
+
year,
|
|
95
|
+
month,
|
|
96
|
+
day,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
# Remind numbers months from zero, everywhere. That stops here.
|
|
100
|
+
Date.new(
|
|
101
|
+
unpack(year),
|
|
102
|
+
unpack(month) + 1,
|
|
103
|
+
unpack(day),
|
|
104
|
+
)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# A datetime is one number: the day count times the minutes in a day, plus
|
|
108
|
+
# the minutes into that day. It is wall-clock time in the local zone,
|
|
109
|
+
# which is what Time.local means.
|
|
110
|
+
def to_time(packed, native)
|
|
111
|
+
day = to_date(packed / MINUTES_PER_DAY, native)
|
|
112
|
+
minutes = packed % MINUTES_PER_DAY
|
|
113
|
+
|
|
114
|
+
Time.local(
|
|
115
|
+
day.year,
|
|
116
|
+
day.month,
|
|
117
|
+
day.day,
|
|
118
|
+
minutes / MINUTES_PER_HOUR,
|
|
119
|
+
minutes % MINUTES_PER_HOUR,
|
|
120
|
+
)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def unpack(pointer)
|
|
124
|
+
pointer[0, Fiddle::SIZEOF_INT].unpack1("i!")
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
__END__
|
|
130
|
+
|
|
131
|
+
require_relative "native"
|
|
132
|
+
|
|
133
|
+
describe "Remind::Value" do
|
|
134
|
+
native = Remind::Native.new
|
|
135
|
+
|
|
136
|
+
# Building a Value by hand is the only way to read one without evaluating an
|
|
137
|
+
# expression, and it pins the layout this file assumes.
|
|
138
|
+
build = proc do |type, number|
|
|
139
|
+
Remind::Value.allocate.tap do |pointer|
|
|
140
|
+
pointer[0, 1] = [type].pack("c")
|
|
141
|
+
pointer[Remind::Value::UNION_OFFSET, Fiddle::SIZEOF_INT] = [number].pack("i!")
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
read = proc { |type, number| Remind::Value.read(build.(type, number), native) }
|
|
146
|
+
|
|
147
|
+
it "reads an integer" do
|
|
148
|
+
read.(Remind::Value::INT, 42).should == 42
|
|
149
|
+
read.(Remind::Value::INT, -17).should == -17
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it "reads a date through Remind's own epoch" do
|
|
153
|
+
read.(Remind::Value::DATE, 0).should == Date.new(1990, 1, 1)
|
|
154
|
+
read.(Remind::Value::DATE, 13528).should == Date.new(2027, 1, 15)
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it "reads a time as minutes since midnight" do
|
|
158
|
+
read.(Remind::Value::TIME, 570).should == 570
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
it "reads a datetime as local wall-clock time" do
|
|
162
|
+
packed = (13528 * Remind::Value::MINUTES_PER_DAY) + 570
|
|
163
|
+
|
|
164
|
+
read.(Remind::Value::DATETIME, packed).should == Time.local(2027, 1, 15, 9, 30)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
it "reads an error value as nothing at all" do
|
|
168
|
+
read.(Remind::Value::ERR, 0).should.be.nil
|
|
169
|
+
end
|
|
170
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Remind
|
|
4
|
+
# <Remind release>.<our release>. The first three segments say which version
|
|
5
|
+
# of Remind this gem vendors and binds; the fourth is ours, bumped for
|
|
6
|
+
# changes on the Ruby side against that same release. Managed by
|
|
7
|
+
# bin/increment-version -- edit that, not this.
|
|
8
|
+
VERSION = "6.2.10.1"
|
|
9
|
+
|
|
10
|
+
# The vendored source directory is named for the release, in Remind's own
|
|
11
|
+
# zero-padded spelling.
|
|
12
|
+
REMIND_VERSION = "06.02.10"
|
|
13
|
+
end
|