On Thu, May 15, 2014 at 01:34:21AM +0200, Philippe Bruhat (BooK) wrote:
> On Tue, May 13, 2014 at 11:11:10PM +0100, Tim Bunce wrote:
> > 
> > Sorry for the delay BooK. Here's a more concrete proposal for a
> > Data::ShortNameProvider module.
> > 
> 
> Many thanks for the documentation and synopsis. I'll start working on it
> this week. https://github.com/book/Data-ShortNameProvider is already set up.

Great!

> > Create a name provider:
> > 
> >     $np = Data::ShortNameProvider->new(
> >         style => 'Basic', # eg a subclass to allow alternative providers
> >         prefix => 'dbit',
> >         timestamp_format => 'YYMMDD',
> >         max_name_length => 32, # croak if a longer name is generated
> >     );
> > 
> 
> So styles would be subclasses/plugin/etc.

I think either subclass or delegation (has-a) would be the best fit.
And between the two I think I'd prefer delegation as that makes it
easier to evolve the external API and internal API separately.

We should provide a base class for the delegated style class
which would also aid evolution and provide a range of services.
That way the actual style modules should be very small.

> 'prefix' and 'timestamp_format' are attributes of the style.

Yes. max_name_length can be enforced by Data::ShortNameProvider
by checking what the delegated generate_new_name has returned.

> Speaking of attributes and classes, is there
> a preferred OO framework for DBIT? Moo?

Yes, we decided Moo was ok as a dependency.

> I like the max_name_length restriction. I suppose the default would be
> 0, i.e. "no limit".

I'm inclined to make it mandatory parameter so people have to at least
think about it. We're calling it a _short_ name after all :)


> >         timestamp_format => 'YYMMDD',
> 
> For time formats, I am partial to strftime, but your example looks
> like CLDR. Is there a preference for the DBI project?

I'd like to keep the dependency count very low, so for the Basic style
we'd only support a few hard-coded formats, so zero dependencies.

Perhaps a good trick would be to support a few hard-coded CLDR formats
or even just one initially, and then, if given an unrecognized format,
require a CLDR module let that handle the formatting.


> > Generate a shortname:
> > 
> >     $name = $np->generate_new_name('foo'); # eg returns "dbit1_140513__foo"
> > 
> > The 'Basic' format would be: $prefix $version _ $timestamp __ $name.
> 
> Why the double underscore before $name?

It's part of the strategy to reduce the risk of clashes with existing names.


> > Parse a generated shortname:
> > 
> >     $hash = $np->parse_generated_name($name); # eg to get date etc
> > 
> > %$hash would contain something like
> > 
> >     {
> >         version => 1, # version of the Basic format
> >         timestamp_string => '140513',
> >         timestamp_epoch => 1400017536,
> >         name => 'foo'
> >     }
> 
> It should also return 'prefix', and actually all attributes needed to
> re-create the DSNP instance. So doing something like:
> 
>     $np2 = Data::ShortNameProvider->new( %$hash );
> 
> would ignore unexpected parameters (timestamp_* and name), and return
> a Data::ShortNameProvider object equivalent to the original one.

Interesting. Actually timestamp_epoch could be used to provide the
time value that should be formatted into the short name.

> Regarding timestamps, a timestamp generated with 'YYMMDD' (day
> granularity) does not contain enough information to produce an epoch
> timestamp (second granularity).

> The obvious default would be to pick 00:00:00 (assuming UTC, but who in
> their right minds would use anything else than UTC for timestamps?), but
> that might cause issues if the timestamp is used to weed out old stuff
> (as stuff would get old somewhat faster). Resolving this can be left as
> an exercise to the library user for the moment.

That's by design. Just needs to be documented.

Thanks BooK!

Tim.

Reply via email to