remind-rb 6.2.10.1-arm-linux
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/libremind.so +0 -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/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
- metadata +709 -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
|