Git Product home page Git Product logo

edn-java-joda's Introduction

edn-java-guava

edn-java-joda provides instant (#inst) parsers that produce Joda Time instants and DateTimes.

Installation

This is a Maven project with the following coordinates:

<dependency>
  <groupId>us.bpsm</groupId>
  <artifactId>edn-java-joda</artifactId>
  <version>0.1.0-SNAPSHOT</version>
</dependency>

It depends on edn-java and joda-time

Usage

package us.bpsm.edn.joda;

import static org.junit.Assert.assertEquals;
import static us.bpsm.edn.parser.Parsers.newParser;
import static us.bpsm.edn.parser.Parsers.newParserConfigBuilder;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Instant;
import org.junit.Test;

import us.bpsm.edn.parser.Parseable;
import us.bpsm.edn.parser.Parser;
import us.bpsm.edn.parser.Parsers;
import us.bpsm.edn.printer.Printer;
import us.bpsm.edn.printer.Printers;
import us.bpsm.edn.protocols.Protocol;

public class RoundTripTest {

    @Test
    public void testDateTimes() {
        for (int i = 0; i < N_REPS; i++) {
            DateTime r1 = randomDateTime();
            String s1 = printEdn(r1);
            DateTime r2 = parseDateTime(s1);
            String s2 = printEdn(r2);
            DateTime r3 = parseDateTime(s2);
            assertEquals(r1, r2);
            assertEquals(s1, s2);
            assertEquals(r2, r3);
        }
    }

    @Test
    public void testInstants() {
        for (int i = 0; i < N_REPS; i++) {
            Instant r1 = randomInstant();
            String s1 = printEdn(r1);
            Instant r2 = parseInstant(s1);
            String s2 = printEdn(r2);
            Instant r3 = parseInstant(s2);
            assertEquals(r1, r2);
            assertEquals(s1, s2);
            assertEquals(r2, r3);
        }
    }

    private static int N_REPS = 1000;

    private static final Protocol<Printer.Fn<?>> PRINT_CFG =
            Printers.defaultProtocolBuilder()
            .put(Instant.class, new PrintJodaInstantFn())
            .put(DateTime.class, new PrintJodaDateTimeFn())
            .build();

    private static final Parser PARSE_INST_AS_DATE_TIME =
            newParser(newParserConfigBuilder()
            .putTagHandler(Parser.Config.EDN_INSTANT, new InstantToJodaDateTime())
            .build());

    private static final Parser PARSE_INST_AS_INSTANT =
            newParser(newParserConfigBuilder()
            .putTagHandler(Parser.Config.EDN_INSTANT, new InstantToJodaInstant())
            .build());

    private static DateTime parseDateTime(String edn) {
        Parseable r = Parsers.newParseable(edn);
        return (DateTime) PARSE_INST_AS_DATE_TIME.nextValue(r);
    }

    private static Instant parseInstant(String edn) {
        Parseable r = Parsers.newParseable(edn);
        return (Instant) PARSE_INST_AS_INSTANT.nextValue(r);
    }

    private static String printEdn(Object someInst) {
        StringBuilder sb = new StringBuilder();
        Printer printer = Printers.newPrinter(PRINT_CFG, sb);
        printer.printValue(someInst);
        printer.close();
        return sb.toString();
    }

    private static Instant randomInstant() {
        long offset = (long) (Math.random()*Integer.MAX_VALUE);
        return new Instant(offset);
    }

    private static DateTime randomDateTime() {
        long offset = (long) (Math.random()*Integer.MAX_VALUE);
        int h = ((int)(Math.random()*25)) - 12;
        return new DateTime(offset, DateTimeZone.forOffsetHours(h));
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.