App-Koyomi

 view release on metacpan or  search on metacpan

META.json  view on Meta::CPAN

      "configure" : {
         "requires" : {
            "Module::Build" : "0.42",
            "Module::CPANfile" : "0.9010"
         }
      },
      "runtime" : {
         "requires" : {
            "Class::Accessor::Lite" : "0.08",
            "DBD::SQLite" : "1.46",
            "DateTime" : "1.18",
            "DateTime::Format::MySQL" : "0.05",
            "DateTime::TimeZone" : "1.88",
            "IO::Prompt::Tiny" : "0.003",
            "Log::Minimal" : "0.19",
            "Module::Load" : "0.32",
            "Perl6::Slurp" : "0.051005",
            "Proc::Wait3" : "0.04",
            "Smart::Args" : "0.12",
            "TOML" : "0.96",
            "Teng" : "0.28",
            "Text::ASCIITable" : "0.20",
            "Text::Diff" : "1.41",

META.yml  view on Meta::CPAN

    version: v0.6.1
  App::Koyomi::Semaphore:
    file: lib/App/Koyomi/Semaphore.pm
    version: v0.6.1
  App::Koyomi::Worker:
    file: lib/App/Koyomi/Worker.pm
    version: v0.6.1
requires:
  Class::Accessor::Lite: '0.08'
  DBD::SQLite: '1.46'
  DateTime: '1.18'
  DateTime::Format::MySQL: '0.05'
  DateTime::TimeZone: '1.88'
  IO::Prompt::Tiny: '0.003'
  Log::Minimal: '0.19'
  Module::Load: '0.32'
  Perl6::Slurp: '0.051005'
  Proc::Wait3: '0.04'
  Smart::Args: '0.12'
  TOML: '0.96'
  Teng: '0.28'
  Text::ASCIITable: '0.20'
  Text::Diff: '1.41'

cpanfile  view on Meta::CPAN

requires 'Class::Accessor::Lite', '0.08';
requires 'DateTime', '1.18';
requires 'DateTime::Format::MySQL', '0.05';
requires 'DateTime::TimeZone', '1.88';
requires 'DBD::SQLite', '1.46';
requires 'IO::Prompt::Tiny', '0.003';
requires 'Log::Minimal', '0.19';
requires 'Module::Load', '0.32';
requires 'Perl6::Slurp', '0.051005';
requires 'Proc::Wait3', '0.04';
requires 'Smart::Args', '0.12';
requires 'TOML', '0.96';
requires 'Text::ASCIITable', '0.20';
requires 'Text::Diff', '1.41';

cpanfile.snapshot  view on Meta::CPAN

      Test::More 0
  Data-Page-NoTotalEntries-0.02
    pathname: T/TO/TOKUHIROM/Data-Page-NoTotalEntries-0.02.tar.gz
    provides:
      Data::Page::NoTotalEntries 0.02
    requirements:
      Class::Accessor::Lite 0.05
      ExtUtils::MakeMaker 6.42
      Test::More 0.96
      perl 5.008001
  DateTime-1.18
    pathname: D/DR/DROLSKY/DateTime-1.18.tar.gz
    provides:
      DateTime 1.18
      DateTime::Duration 1.18
      DateTime::Helpers 1.18
      DateTime::Infinite 1.18
      DateTime::Infinite::Future 1.18
      DateTime::Infinite::Past 1.18
      DateTime::LeapSecond 1.18
    requirements:
      Carp 0
      DateTime::Locale 0.41
      DateTime::TimeZone 1.74
      ExtUtils::CBuilder 0
      Module::Build 0.28
      POSIX 0
      Params::Validate 0.76
      Scalar::Util 0
      Try::Tiny 0
      XSLoader 0
      base 0
      constant 0
      integer 0
      overload 0
      perl 5.008001
      strict 0
      vars 0
      warnings 0
      warnings::register 0
  DateTime-Format-Builder-0.81
    pathname: D/DR/DROLSKY/DateTime-Format-Builder-0.81.tar.gz
    provides:
      DateTime::Format::Builder 0.81
      DateTime::Format::Builder::Parser 0.81
      DateTime::Format::Builder::Parser::Dispatch 0.81
      DateTime::Format::Builder::Parser::Quick 0.81
      DateTime::Format::Builder::Parser::Regex 0.81
      DateTime::Format::Builder::Parser::Strptime 0.81
      DateTime::Format::Builder::Parser::generic 0.81
      DateTime::Format::Fall undef
      DateTime::Format::Simple undef
    requirements:
      Carp 0
      Class::Factory::Util 1.6
      DateTime 1.00
      DateTime::Format::Strptime 1.04
      ExtUtils::MakeMaker 6.30
      Params::Validate 0.72
      Scalar::Util 0
      base 0
      strict 0
      vars 0
      warnings 0
  DateTime-Format-MySQL-0.05
    pathname: X/XM/XMIKEW/DateTime-Format-MySQL-0.05.tar.gz
    provides:
      DateTime::Format::MySQL 0.05
    requirements:
      DateTime 0
      DateTime::Format::Builder 0.6
      Module::Build 0
  DateTime-Format-Strptime-1.56
    pathname: D/DR/DROLSKY/DateTime-Format-Strptime-1.56.tar.gz
    provides:
      DateTime::Format::Strptime 1.56
    requirements:
      Carp 0
      DateTime 1.00
      DateTime::Locale 0.45
      DateTime::TimeZone 0.79
      Exporter 0
      ExtUtils::MakeMaker 0
      Params::Validate 0.64
      strict 0
      vars 0
  DateTime-Locale-0.45
    pathname: D/DR/DROLSKY/DateTime-Locale-0.45.tar.gz
    provides:
      DateTime::Locale 0.45
      DateTime::Locale::Base undef
      DateTime::Locale::Catalog undef
      DateTime::Locale::aa undef
      DateTime::Locale::aa_DJ undef
      DateTime::Locale::aa_ER undef
      DateTime::Locale::aa_ER_SAAHO undef
      DateTime::Locale::aa_ET undef
      DateTime::Locale::af undef
      DateTime::Locale::af_NA undef
      DateTime::Locale::af_ZA undef
      DateTime::Locale::ak undef
      DateTime::Locale::ak_GH undef
      DateTime::Locale::am undef
      DateTime::Locale::am_ET undef
      DateTime::Locale::ar undef
      DateTime::Locale::ar_AE undef
      DateTime::Locale::ar_BH undef
      DateTime::Locale::ar_DZ undef
      DateTime::Locale::ar_EG undef
      DateTime::Locale::ar_IQ undef
      DateTime::Locale::ar_JO undef
      DateTime::Locale::ar_KW undef
      DateTime::Locale::ar_LB undef
      DateTime::Locale::ar_LY undef
      DateTime::Locale::ar_MA undef
      DateTime::Locale::ar_OM undef
      DateTime::Locale::ar_QA undef
      DateTime::Locale::ar_SA undef
      DateTime::Locale::ar_SD undef
      DateTime::Locale::ar_SY undef
      DateTime::Locale::ar_TN undef
      DateTime::Locale::ar_YE undef
      DateTime::Locale::as undef
      DateTime::Locale::as_IN undef
      DateTime::Locale::az undef
      DateTime::Locale::az_AZ undef
      DateTime::Locale::az_Cyrl undef
      DateTime::Locale::az_Cyrl_AZ undef
      DateTime::Locale::az_Latn undef
      DateTime::Locale::az_Latn_AZ undef
      DateTime::Locale::be undef
      DateTime::Locale::be_BY undef
      DateTime::Locale::bg undef
      DateTime::Locale::bg_BG undef
      DateTime::Locale::bn undef
      DateTime::Locale::bn_BD undef
      DateTime::Locale::bn_IN undef
      DateTime::Locale::bo undef
      DateTime::Locale::bo_CN undef
      DateTime::Locale::bo_IN undef
      DateTime::Locale::bs undef
      DateTime::Locale::bs_BA undef
      DateTime::Locale::byn undef
      DateTime::Locale::byn_ER undef
      DateTime::Locale::ca undef
      DateTime::Locale::ca_ES undef
      DateTime::Locale::cch undef
      DateTime::Locale::cch_NG undef
      DateTime::Locale::cop undef
      DateTime::Locale::cs undef
      DateTime::Locale::cs_CZ undef
      DateTime::Locale::cy undef
      DateTime::Locale::cy_GB undef
      DateTime::Locale::da undef
      DateTime::Locale::da_DK undef
      DateTime::Locale::de undef
      DateTime::Locale::de_AT undef
      DateTime::Locale::de_BE undef
      DateTime::Locale::de_CH undef
      DateTime::Locale::de_DE undef
      DateTime::Locale::de_LI undef
      DateTime::Locale::de_LU undef
      DateTime::Locale::dv undef
      DateTime::Locale::dv_MV undef
      DateTime::Locale::dz undef
      DateTime::Locale::dz_BT undef
      DateTime::Locale::ee undef
      DateTime::Locale::ee_GH undef
      DateTime::Locale::ee_TG undef
      DateTime::Locale::el undef
      DateTime::Locale::el_CY undef
      DateTime::Locale::el_GR undef
      DateTime::Locale::el_POLYTON undef
      DateTime::Locale::en undef
      DateTime::Locale::en_AS undef
      DateTime::Locale::en_AU undef
      DateTime::Locale::en_BE undef
      DateTime::Locale::en_BW undef
      DateTime::Locale::en_BZ undef
      DateTime::Locale::en_CA undef
      DateTime::Locale::en_Dsrt undef
      DateTime::Locale::en_Dsrt_US undef
      DateTime::Locale::en_GB undef
      DateTime::Locale::en_GU undef
      DateTime::Locale::en_HK undef
      DateTime::Locale::en_IE undef
      DateTime::Locale::en_IN undef
      DateTime::Locale::en_JM undef
      DateTime::Locale::en_MH undef
      DateTime::Locale::en_MP undef
      DateTime::Locale::en_MT undef
      DateTime::Locale::en_NA undef
      DateTime::Locale::en_NZ undef
      DateTime::Locale::en_PH undef
      DateTime::Locale::en_PK undef
      DateTime::Locale::en_SG undef
      DateTime::Locale::en_Shaw undef
      DateTime::Locale::en_TT undef
      DateTime::Locale::en_UM undef
      DateTime::Locale::en_US undef
      DateTime::Locale::en_US_POSIX undef
      DateTime::Locale::en_VI undef
      DateTime::Locale::en_ZA undef
      DateTime::Locale::en_ZW undef
      DateTime::Locale::eo undef
      DateTime::Locale::es undef
      DateTime::Locale::es_AR undef
      DateTime::Locale::es_BO undef
      DateTime::Locale::es_CL undef
      DateTime::Locale::es_CO undef
      DateTime::Locale::es_CR undef
      DateTime::Locale::es_DO undef
      DateTime::Locale::es_EC undef
      DateTime::Locale::es_ES undef
      DateTime::Locale::es_GT undef
      DateTime::Locale::es_HN undef
      DateTime::Locale::es_MX undef
      DateTime::Locale::es_NI undef
      DateTime::Locale::es_PA undef
      DateTime::Locale::es_PE undef
      DateTime::Locale::es_PR undef
      DateTime::Locale::es_PY undef
      DateTime::Locale::es_SV undef
      DateTime::Locale::es_US undef
      DateTime::Locale::es_UY undef
      DateTime::Locale::es_VE undef
      DateTime::Locale::et undef
      DateTime::Locale::et_EE undef
      DateTime::Locale::eu undef
      DateTime::Locale::eu_ES undef
      DateTime::Locale::fa undef
      DateTime::Locale::fa_AF undef
      DateTime::Locale::fa_IR undef
      DateTime::Locale::fi undef
      DateTime::Locale::fi_FI undef
      DateTime::Locale::fil undef
      DateTime::Locale::fil_PH undef
      DateTime::Locale::fo undef
      DateTime::Locale::fo_FO undef
      DateTime::Locale::fr undef
      DateTime::Locale::fr_BE undef
      DateTime::Locale::fr_CA undef
      DateTime::Locale::fr_CH undef
      DateTime::Locale::fr_FR undef
      DateTime::Locale::fr_LU undef
      DateTime::Locale::fr_MC undef
      DateTime::Locale::fr_SN undef
      DateTime::Locale::fur undef
      DateTime::Locale::fur_IT undef
      DateTime::Locale::ga undef
      DateTime::Locale::ga_IE undef
      DateTime::Locale::gaa undef
      DateTime::Locale::gaa_GH undef
      DateTime::Locale::gez undef
      DateTime::Locale::gez_ER undef
      DateTime::Locale::gez_ET undef
      DateTime::Locale::gl undef
      DateTime::Locale::gl_ES undef
      DateTime::Locale::gsw undef
      DateTime::Locale::gsw_CH undef
      DateTime::Locale::gu undef
      DateTime::Locale::gu_IN undef
      DateTime::Locale::gv undef
      DateTime::Locale::gv_GB undef
      DateTime::Locale::ha undef
      DateTime::Locale::ha_Arab undef
      DateTime::Locale::ha_Arab_NG undef
      DateTime::Locale::ha_Arab_SD undef
      DateTime::Locale::ha_GH undef
      DateTime::Locale::ha_Latn undef
      DateTime::Locale::ha_Latn_GH undef
      DateTime::Locale::ha_Latn_NE undef
      DateTime::Locale::ha_Latn_NG undef
      DateTime::Locale::ha_NE undef
      DateTime::Locale::ha_NG undef
      DateTime::Locale::ha_SD undef
      DateTime::Locale::haw undef
      DateTime::Locale::haw_US undef
      DateTime::Locale::he undef
      DateTime::Locale::he_IL undef
      DateTime::Locale::hi undef
      DateTime::Locale::hi_IN undef
      DateTime::Locale::hr undef
      DateTime::Locale::hr_HR undef
      DateTime::Locale::hu undef
      DateTime::Locale::hu_HU undef
      DateTime::Locale::hy undef
      DateTime::Locale::hy_AM undef
      DateTime::Locale::hy_AM_REVISED undef
      DateTime::Locale::ia undef
      DateTime::Locale::id undef
      DateTime::Locale::id_ID undef
      DateTime::Locale::ig undef
      DateTime::Locale::ig_NG undef
      DateTime::Locale::ii undef
      DateTime::Locale::ii_CN undef
      DateTime::Locale::is undef
      DateTime::Locale::is_IS undef
      DateTime::Locale::it undef
      DateTime::Locale::it_CH undef
      DateTime::Locale::it_IT undef
      DateTime::Locale::iu undef
      DateTime::Locale::ja undef
      DateTime::Locale::ja_JP undef
      DateTime::Locale::ka undef
      DateTime::Locale::ka_GE undef
      DateTime::Locale::kaj undef
      DateTime::Locale::kaj_NG undef
      DateTime::Locale::kam undef
      DateTime::Locale::kam_KE undef
      DateTime::Locale::kcg undef
      DateTime::Locale::kcg_NG undef
      DateTime::Locale::kfo undef
      DateTime::Locale::kfo_CI undef
      DateTime::Locale::kk undef
      DateTime::Locale::kk_Cyrl undef
      DateTime::Locale::kk_Cyrl_KZ undef
      DateTime::Locale::kk_KZ undef
      DateTime::Locale::kl undef
      DateTime::Locale::kl_GL undef
      DateTime::Locale::km undef
      DateTime::Locale::km_KH undef
      DateTime::Locale::kn undef
      DateTime::Locale::kn_IN undef
      DateTime::Locale::ko undef
      DateTime::Locale::ko_KR undef
      DateTime::Locale::kok undef
      DateTime::Locale::kok_IN undef
      DateTime::Locale::kpe undef
      DateTime::Locale::kpe_GN undef
      DateTime::Locale::kpe_LR undef
      DateTime::Locale::ku undef
      DateTime::Locale::ku_Arab undef
      DateTime::Locale::ku_Arab_IQ undef
      DateTime::Locale::ku_Arab_IR undef
      DateTime::Locale::ku_Arab_SY undef
      DateTime::Locale::ku_IQ undef
      DateTime::Locale::ku_IR undef
      DateTime::Locale::ku_Latn undef
      DateTime::Locale::ku_Latn_TR undef
      DateTime::Locale::ku_SY undef
      DateTime::Locale::ku_TR undef
      DateTime::Locale::kw undef
      DateTime::Locale::kw_GB undef
      DateTime::Locale::ky undef
      DateTime::Locale::ky_KG undef
      DateTime::Locale::ln undef
      DateTime::Locale::ln_CD undef
      DateTime::Locale::ln_CG undef
      DateTime::Locale::lo undef
      DateTime::Locale::lo_LA undef
      DateTime::Locale::lt undef
      DateTime::Locale::lt_LT undef
      DateTime::Locale::lv undef
      DateTime::Locale::lv_LV undef
      DateTime::Locale::mk undef
      DateTime::Locale::mk_MK undef
      DateTime::Locale::ml undef
      DateTime::Locale::ml_IN undef
      DateTime::Locale::mn undef
      DateTime::Locale::mn_CN undef
      DateTime::Locale::mn_Cyrl undef
      DateTime::Locale::mn_Cyrl_MN undef
      DateTime::Locale::mn_MN undef
      DateTime::Locale::mn_Mong undef
      DateTime::Locale::mn_Mong_CN undef
      DateTime::Locale::mo undef
      DateTime::Locale::mr undef
      DateTime::Locale::mr_IN undef
      DateTime::Locale::ms undef
      DateTime::Locale::ms_BN undef
      DateTime::Locale::ms_MY undef
      DateTime::Locale::mt undef
      DateTime::Locale::mt_MT undef
      DateTime::Locale::my undef
      DateTime::Locale::my_MM undef
      DateTime::Locale::nb undef
      DateTime::Locale::nb_NO undef
      DateTime::Locale::nds undef
      DateTime::Locale::nds_DE undef
      DateTime::Locale::ne undef
      DateTime::Locale::ne_IN undef
      DateTime::Locale::ne_NP undef
      DateTime::Locale::nl undef
      DateTime::Locale::nl_BE undef
      DateTime::Locale::nl_NL undef
      DateTime::Locale::nn undef
      DateTime::Locale::nn_NO undef
      DateTime::Locale::no undef
      DateTime::Locale::nr undef
      DateTime::Locale::nr_ZA undef
      DateTime::Locale::nso undef
      DateTime::Locale::nso_ZA undef
      DateTime::Locale::ny undef
      DateTime::Locale::ny_MW undef
      DateTime::Locale::oc undef
      DateTime::Locale::oc_FR undef
      DateTime::Locale::om undef
      DateTime::Locale::om_ET undef
      DateTime::Locale::om_KE undef
      DateTime::Locale::or undef
      DateTime::Locale::or_IN undef
      DateTime::Locale::pa undef
      DateTime::Locale::pa_Arab undef
      DateTime::Locale::pa_Arab_PK undef
      DateTime::Locale::pa_Guru undef
      DateTime::Locale::pa_Guru_IN undef
      DateTime::Locale::pa_IN undef
      DateTime::Locale::pa_PK undef
      DateTime::Locale::pl undef
      DateTime::Locale::pl_PL undef
      DateTime::Locale::ps undef
      DateTime::Locale::ps_AF undef
      DateTime::Locale::pt undef
      DateTime::Locale::pt_BR undef
      DateTime::Locale::pt_PT undef
      DateTime::Locale::ro undef
      DateTime::Locale::ro_MD undef
      DateTime::Locale::ro_RO undef
      DateTime::Locale::root undef
      DateTime::Locale::ru undef
      DateTime::Locale::ru_RU undef
      DateTime::Locale::ru_UA undef
      DateTime::Locale::rw undef
      DateTime::Locale::rw_RW undef
      DateTime::Locale::sa undef
      DateTime::Locale::sa_IN undef
      DateTime::Locale::se undef
      DateTime::Locale::se_FI undef
      DateTime::Locale::se_NO undef
      DateTime::Locale::sh undef
      DateTime::Locale::sh_BA undef
      DateTime::Locale::sh_CS undef
      DateTime::Locale::sh_YU undef
      DateTime::Locale::si undef
      DateTime::Locale::si_LK undef
      DateTime::Locale::sid undef
      DateTime::Locale::sid_ET undef
      DateTime::Locale::sk undef
      DateTime::Locale::sk_SK undef
      DateTime::Locale::sl undef
      DateTime::Locale::sl_SI undef
      DateTime::Locale::so undef
      DateTime::Locale::so_DJ undef
      DateTime::Locale::so_ET undef
      DateTime::Locale::so_KE undef
      DateTime::Locale::so_SO undef
      DateTime::Locale::sq undef
      DateTime::Locale::sq_AL undef
      DateTime::Locale::sr undef
      DateTime::Locale::sr_BA undef
      DateTime::Locale::sr_CS undef
      DateTime::Locale::sr_Cyrl undef
      DateTime::Locale::sr_Cyrl_BA undef
      DateTime::Locale::sr_Cyrl_CS undef
      DateTime::Locale::sr_Cyrl_ME undef
      DateTime::Locale::sr_Cyrl_RS undef
      DateTime::Locale::sr_Cyrl_YU undef
      DateTime::Locale::sr_Latn undef
      DateTime::Locale::sr_Latn_BA undef
      DateTime::Locale::sr_Latn_CS undef
      DateTime::Locale::sr_Latn_ME undef
      DateTime::Locale::sr_Latn_RS undef
      DateTime::Locale::sr_Latn_YU undef
      DateTime::Locale::sr_ME undef
      DateTime::Locale::sr_RS undef
      DateTime::Locale::sr_YU undef
      DateTime::Locale::ss undef
      DateTime::Locale::ss_SZ undef
      DateTime::Locale::ss_ZA undef
      DateTime::Locale::st undef
      DateTime::Locale::st_LS undef
      DateTime::Locale::st_ZA undef
      DateTime::Locale::sv undef
      DateTime::Locale::sv_FI undef
      DateTime::Locale::sv_SE undef
      DateTime::Locale::sw undef
      DateTime::Locale::sw_KE undef
      DateTime::Locale::sw_TZ undef
      DateTime::Locale::syr undef
      DateTime::Locale::syr_SY undef
      DateTime::Locale::ta undef
      DateTime::Locale::ta_IN undef
      DateTime::Locale::te undef
      DateTime::Locale::te_IN undef
      DateTime::Locale::tg undef
      DateTime::Locale::tg_Cyrl undef
      DateTime::Locale::tg_Cyrl_TJ undef
      DateTime::Locale::tg_TJ undef
      DateTime::Locale::th undef
      DateTime::Locale::th_TH undef
      DateTime::Locale::ti undef
      DateTime::Locale::ti_ER undef
      DateTime::Locale::ti_ET undef
      DateTime::Locale::tig undef
      DateTime::Locale::tig_ER undef
      DateTime::Locale::tl undef
      DateTime::Locale::tn undef
      DateTime::Locale::tn_ZA undef
      DateTime::Locale::to undef
      DateTime::Locale::to_TO undef
      DateTime::Locale::tr undef
      DateTime::Locale::tr_TR undef
      DateTime::Locale::trv undef
      DateTime::Locale::trv_TW undef
      DateTime::Locale::ts undef
      DateTime::Locale::ts_ZA undef
      DateTime::Locale::tt undef
      DateTime::Locale::tt_RU undef
      DateTime::Locale::ug undef
      DateTime::Locale::ug_Arab undef
      DateTime::Locale::ug_Arab_CN undef
      DateTime::Locale::ug_CN undef
      DateTime::Locale::uk undef
      DateTime::Locale::uk_UA undef
      DateTime::Locale::ur undef
      DateTime::Locale::ur_IN undef
      DateTime::Locale::ur_PK undef
      DateTime::Locale::uz undef
      DateTime::Locale::uz_AF undef
      DateTime::Locale::uz_Arab undef
      DateTime::Locale::uz_Arab_AF undef
      DateTime::Locale::uz_Cyrl undef
      DateTime::Locale::uz_Cyrl_UZ undef
      DateTime::Locale::uz_Latn undef
      DateTime::Locale::uz_Latn_UZ undef
      DateTime::Locale::uz_UZ undef
      DateTime::Locale::ve undef
      DateTime::Locale::ve_ZA undef
      DateTime::Locale::vi undef
      DateTime::Locale::vi_VN undef
      DateTime::Locale::wal undef
      DateTime::Locale::wal_ET undef
      DateTime::Locale::wo undef
      DateTime::Locale::wo_Latn undef
      DateTime::Locale::wo_Latn_SN undef
      DateTime::Locale::wo_SN undef
      DateTime::Locale::xh undef
      DateTime::Locale::xh_ZA undef
      DateTime::Locale::yo undef
      DateTime::Locale::yo_NG undef
      DateTime::Locale::zh undef
      DateTime::Locale::zh_CN undef
      DateTime::Locale::zh_HK undef
      DateTime::Locale::zh_Hans undef
      DateTime::Locale::zh_Hans_CN undef
      DateTime::Locale::zh_Hans_HK undef
      DateTime::Locale::zh_Hans_MO undef
      DateTime::Locale::zh_Hans_SG undef
      DateTime::Locale::zh_Hant undef
      DateTime::Locale::zh_Hant_HK undef
      DateTime::Locale::zh_Hant_MO undef
      DateTime::Locale::zh_Hant_TW undef
      DateTime::Locale::zh_MO undef
      DateTime::Locale::zh_SG undef
      DateTime::Locale::zh_TW undef
      DateTime::Locale::zu undef
      DateTime::Locale::zu_ZA undef
    requirements:
      List::MoreUtils 0
      Module::Build 0
      Params::Validate 0.91
      perl 5.006
  DateTime-TimeZone-1.88
    pathname: D/DR/DROLSKY/DateTime-TimeZone-1.88.tar.gz
    provides:
      DateTime::TimeZone 1.88
      DateTime::TimeZone::Africa::Abidjan 1.88
      DateTime::TimeZone::Africa::Accra 1.88
      DateTime::TimeZone::Africa::Algiers 1.88
      DateTime::TimeZone::Africa::Bissau 1.88
      DateTime::TimeZone::Africa::Cairo 1.88
      DateTime::TimeZone::Africa::Casablanca 1.88
      DateTime::TimeZone::Africa::Ceuta 1.88
      DateTime::TimeZone::Africa::El_Aaiun 1.88
      DateTime::TimeZone::Africa::Johannesburg 1.88
      DateTime::TimeZone::Africa::Khartoum 1.88
      DateTime::TimeZone::Africa::Lagos 1.88
      DateTime::TimeZone::Africa::Maputo 1.88
      DateTime::TimeZone::Africa::Monrovia 1.88
      DateTime::TimeZone::Africa::Nairobi 1.88
      DateTime::TimeZone::Africa::Ndjamena 1.88
      DateTime::TimeZone::Africa::Tripoli 1.88
      DateTime::TimeZone::Africa::Tunis 1.88
      DateTime::TimeZone::Africa::Windhoek 1.88
      DateTime::TimeZone::America::Adak 1.88
      DateTime::TimeZone::America::Anchorage 1.88
      DateTime::TimeZone::America::Araguaina 1.88
      DateTime::TimeZone::America::Argentina::Buenos_Aires 1.88
      DateTime::TimeZone::America::Argentina::Catamarca 1.88
      DateTime::TimeZone::America::Argentina::Cordoba 1.88
      DateTime::TimeZone::America::Argentina::Jujuy 1.88
      DateTime::TimeZone::America::Argentina::La_Rioja 1.88
      DateTime::TimeZone::America::Argentina::Mendoza 1.88
      DateTime::TimeZone::America::Argentina::Rio_Gallegos 1.88
      DateTime::TimeZone::America::Argentina::Salta 1.88
      DateTime::TimeZone::America::Argentina::San_Juan 1.88
      DateTime::TimeZone::America::Argentina::San_Luis 1.88
      DateTime::TimeZone::America::Argentina::Tucuman 1.88
      DateTime::TimeZone::America::Argentina::Ushuaia 1.88
      DateTime::TimeZone::America::Asuncion 1.88
      DateTime::TimeZone::America::Atikokan 1.88
      DateTime::TimeZone::America::Bahia 1.88
      DateTime::TimeZone::America::Bahia_Banderas 1.88
      DateTime::TimeZone::America::Barbados 1.88
      DateTime::TimeZone::America::Belem 1.88
      DateTime::TimeZone::America::Belize 1.88
      DateTime::TimeZone::America::Blanc_Sablon 1.88
      DateTime::TimeZone::America::Boa_Vista 1.88
      DateTime::TimeZone::America::Bogota 1.88
      DateTime::TimeZone::America::Boise 1.88
      DateTime::TimeZone::America::Cambridge_Bay 1.88
      DateTime::TimeZone::America::Campo_Grande 1.88
      DateTime::TimeZone::America::Cancun 1.88
      DateTime::TimeZone::America::Caracas 1.88
      DateTime::TimeZone::America::Cayenne 1.88
      DateTime::TimeZone::America::Chicago 1.88
      DateTime::TimeZone::America::Chihuahua 1.88
      DateTime::TimeZone::America::Costa_Rica 1.88
      DateTime::TimeZone::America::Creston 1.88
      DateTime::TimeZone::America::Cuiaba 1.88
      DateTime::TimeZone::America::Curacao 1.88
      DateTime::TimeZone::America::Danmarkshavn 1.88
      DateTime::TimeZone::America::Dawson 1.88
      DateTime::TimeZone::America::Dawson_Creek 1.88
      DateTime::TimeZone::America::Denver 1.88
      DateTime::TimeZone::America::Detroit 1.88
      DateTime::TimeZone::America::Edmonton 1.88
      DateTime::TimeZone::America::Eirunepe 1.88
      DateTime::TimeZone::America::El_Salvador 1.88
      DateTime::TimeZone::America::Fortaleza 1.88
      DateTime::TimeZone::America::Glace_Bay 1.88
      DateTime::TimeZone::America::Godthab 1.88
      DateTime::TimeZone::America::Goose_Bay 1.88
      DateTime::TimeZone::America::Grand_Turk 1.88
      DateTime::TimeZone::America::Guatemala 1.88
      DateTime::TimeZone::America::Guayaquil 1.88
      DateTime::TimeZone::America::Guyana 1.88
      DateTime::TimeZone::America::Halifax 1.88
      DateTime::TimeZone::America::Havana 1.88
      DateTime::TimeZone::America::Hermosillo 1.88
      DateTime::TimeZone::America::Indiana::Indianapolis 1.88
      DateTime::TimeZone::America::Indiana::Knox 1.88
      DateTime::TimeZone::America::Indiana::Marengo 1.88
      DateTime::TimeZone::America::Indiana::Petersburg 1.88
      DateTime::TimeZone::America::Indiana::Tell_City 1.88
      DateTime::TimeZone::America::Indiana::Vevay 1.88
      DateTime::TimeZone::America::Indiana::Vincennes 1.88
      DateTime::TimeZone::America::Indiana::Winamac 1.88
      DateTime::TimeZone::America::Inuvik 1.88
      DateTime::TimeZone::America::Iqaluit 1.88
      DateTime::TimeZone::America::Jamaica 1.88
      DateTime::TimeZone::America::Juneau 1.88
      DateTime::TimeZone::America::Kentucky::Louisville 1.88
      DateTime::TimeZone::America::Kentucky::Monticello 1.88
      DateTime::TimeZone::America::La_Paz 1.88
      DateTime::TimeZone::America::Lima 1.88
      DateTime::TimeZone::America::Los_Angeles 1.88
      DateTime::TimeZone::America::Maceio 1.88
      DateTime::TimeZone::America::Managua 1.88
      DateTime::TimeZone::America::Manaus 1.88
      DateTime::TimeZone::America::Martinique 1.88
      DateTime::TimeZone::America::Matamoros 1.88
      DateTime::TimeZone::America::Mazatlan 1.88
      DateTime::TimeZone::America::Menominee 1.88
      DateTime::TimeZone::America::Merida 1.88
      DateTime::TimeZone::America::Metlakatla 1.88
      DateTime::TimeZone::America::Mexico_City 1.88
      DateTime::TimeZone::America::Miquelon 1.88
      DateTime::TimeZone::America::Moncton 1.88
      DateTime::TimeZone::America::Monterrey 1.88
      DateTime::TimeZone::America::Montevideo 1.88
      DateTime::TimeZone::America::Nassau 1.88
      DateTime::TimeZone::America::New_York 1.88
      DateTime::TimeZone::America::Nipigon 1.88
      DateTime::TimeZone::America::Nome 1.88
      DateTime::TimeZone::America::Noronha 1.88
      DateTime::TimeZone::America::North_Dakota::Beulah 1.88
      DateTime::TimeZone::America::North_Dakota::Center 1.88
      DateTime::TimeZone::America::North_Dakota::New_Salem 1.88
      DateTime::TimeZone::America::Ojinaga 1.88
      DateTime::TimeZone::America::Panama 1.88
      DateTime::TimeZone::America::Pangnirtung 1.88
      DateTime::TimeZone::America::Paramaribo 1.88
      DateTime::TimeZone::America::Phoenix 1.88
      DateTime::TimeZone::America::Port_au_Prince 1.88
      DateTime::TimeZone::America::Port_of_Spain 1.88
      DateTime::TimeZone::America::Porto_Velho 1.88
      DateTime::TimeZone::America::Puerto_Rico 1.88
      DateTime::TimeZone::America::Rainy_River 1.88
      DateTime::TimeZone::America::Rankin_Inlet 1.88
      DateTime::TimeZone::America::Recife 1.88
      DateTime::TimeZone::America::Regina 1.88
      DateTime::TimeZone::America::Resolute 1.88
      DateTime::TimeZone::America::Rio_Branco 1.88
      DateTime::TimeZone::America::Santa_Isabel 1.88
      DateTime::TimeZone::America::Santarem 1.88
      DateTime::TimeZone::America::Santiago 1.88
      DateTime::TimeZone::America::Santo_Domingo 1.88
      DateTime::TimeZone::America::Sao_Paulo 1.88
      DateTime::TimeZone::America::Scoresbysund 1.88
      DateTime::TimeZone::America::Sitka 1.88
      DateTime::TimeZone::America::St_Johns 1.88
      DateTime::TimeZone::America::Swift_Current 1.88
      DateTime::TimeZone::America::Tegucigalpa 1.88
      DateTime::TimeZone::America::Thule 1.88
      DateTime::TimeZone::America::Thunder_Bay 1.88
      DateTime::TimeZone::America::Tijuana 1.88
      DateTime::TimeZone::America::Toronto 1.88
      DateTime::TimeZone::America::Vancouver 1.88
      DateTime::TimeZone::America::Whitehorse 1.88
      DateTime::TimeZone::America::Winnipeg 1.88
      DateTime::TimeZone::America::Yakutat 1.88
      DateTime::TimeZone::America::Yellowknife 1.88
      DateTime::TimeZone::Antarctica::Casey 1.88
      DateTime::TimeZone::Antarctica::Davis 1.88
      DateTime::TimeZone::Antarctica::DumontDUrville 1.88
      DateTime::TimeZone::Antarctica::Macquarie 1.88
      DateTime::TimeZone::Antarctica::Mawson 1.88
      DateTime::TimeZone::Antarctica::Palmer 1.88
      DateTime::TimeZone::Antarctica::Rothera 1.88
      DateTime::TimeZone::Antarctica::Syowa 1.88
      DateTime::TimeZone::Antarctica::Troll 1.88
      DateTime::TimeZone::Antarctica::Vostok 1.88
      DateTime::TimeZone::Asia::Almaty 1.88
      DateTime::TimeZone::Asia::Amman 1.88
      DateTime::TimeZone::Asia::Anadyr 1.88
      DateTime::TimeZone::Asia::Aqtau 1.88
      DateTime::TimeZone::Asia::Aqtobe 1.88
      DateTime::TimeZone::Asia::Ashgabat 1.88
      DateTime::TimeZone::Asia::Baghdad 1.88
      DateTime::TimeZone::Asia::Baku 1.88
      DateTime::TimeZone::Asia::Bangkok 1.88
      DateTime::TimeZone::Asia::Beirut 1.88
      DateTime::TimeZone::Asia::Bishkek 1.88
      DateTime::TimeZone::Asia::Brunei 1.88
      DateTime::TimeZone::Asia::Chita 1.88
      DateTime::TimeZone::Asia::Choibalsan 1.88
      DateTime::TimeZone::Asia::Colombo 1.88
      DateTime::TimeZone::Asia::Damascus 1.88
      DateTime::TimeZone::Asia::Dhaka 1.88
      DateTime::TimeZone::Asia::Dili 1.88
      DateTime::TimeZone::Asia::Dubai 1.88
      DateTime::TimeZone::Asia::Dushanbe 1.88
      DateTime::TimeZone::Asia::Gaza 1.88
      DateTime::TimeZone::Asia::Hebron 1.88
      DateTime::TimeZone::Asia::Ho_Chi_Minh 1.88
      DateTime::TimeZone::Asia::Hong_Kong 1.88
      DateTime::TimeZone::Asia::Hovd 1.88
      DateTime::TimeZone::Asia::Irkutsk 1.88
      DateTime::TimeZone::Asia::Jakarta 1.88
      DateTime::TimeZone::Asia::Jayapura 1.88
      DateTime::TimeZone::Asia::Jerusalem 1.88
      DateTime::TimeZone::Asia::Kabul 1.88
      DateTime::TimeZone::Asia::Kamchatka 1.88
      DateTime::TimeZone::Asia::Karachi 1.88
      DateTime::TimeZone::Asia::Kathmandu 1.88
      DateTime::TimeZone::Asia::Khandyga 1.88
      DateTime::TimeZone::Asia::Kolkata 1.88
      DateTime::TimeZone::Asia::Krasnoyarsk 1.88
      DateTime::TimeZone::Asia::Kuala_Lumpur 1.88
      DateTime::TimeZone::Asia::Kuching 1.88
      DateTime::TimeZone::Asia::Macau 1.88
      DateTime::TimeZone::Asia::Magadan 1.88
      DateTime::TimeZone::Asia::Makassar 1.88
      DateTime::TimeZone::Asia::Manila 1.88
      DateTime::TimeZone::Asia::Nicosia 1.88
      DateTime::TimeZone::Asia::Novokuznetsk 1.88
      DateTime::TimeZone::Asia::Novosibirsk 1.88
      DateTime::TimeZone::Asia::Omsk 1.88
      DateTime::TimeZone::Asia::Oral 1.88
      DateTime::TimeZone::Asia::Pontianak 1.88
      DateTime::TimeZone::Asia::Pyongyang 1.88
      DateTime::TimeZone::Asia::Qatar 1.88
      DateTime::TimeZone::Asia::Qyzylorda 1.88
      DateTime::TimeZone::Asia::Rangoon 1.88
      DateTime::TimeZone::Asia::Riyadh 1.88
      DateTime::TimeZone::Asia::Sakhalin 1.88
      DateTime::TimeZone::Asia::Samarkand 1.88
      DateTime::TimeZone::Asia::Seoul 1.88
      DateTime::TimeZone::Asia::Shanghai 1.88
      DateTime::TimeZone::Asia::Singapore 1.88
      DateTime::TimeZone::Asia::Srednekolymsk 1.88
      DateTime::TimeZone::Asia::Taipei 1.88
      DateTime::TimeZone::Asia::Tashkent 1.88
      DateTime::TimeZone::Asia::Tbilisi 1.88
      DateTime::TimeZone::Asia::Tehran 1.88
      DateTime::TimeZone::Asia::Thimphu 1.88
      DateTime::TimeZone::Asia::Tokyo 1.88
      DateTime::TimeZone::Asia::Ulaanbaatar 1.88
      DateTime::TimeZone::Asia::Urumqi 1.88
      DateTime::TimeZone::Asia::Ust_Nera 1.88
      DateTime::TimeZone::Asia::Vladivostok 1.88
      DateTime::TimeZone::Asia::Yakutsk 1.88
      DateTime::TimeZone::Asia::Yekaterinburg 1.88
      DateTime::TimeZone::Asia::Yerevan 1.88
      DateTime::TimeZone::Atlantic::Azores 1.88
      DateTime::TimeZone::Atlantic::Bermuda 1.88
      DateTime::TimeZone::Atlantic::Canary 1.88
      DateTime::TimeZone::Atlantic::Cape_Verde 1.88
      DateTime::TimeZone::Atlantic::Faroe 1.88
      DateTime::TimeZone::Atlantic::Madeira 1.88
      DateTime::TimeZone::Atlantic::Reykjavik 1.88
      DateTime::TimeZone::Atlantic::South_Georgia 1.88
      DateTime::TimeZone::Atlantic::Stanley 1.88
      DateTime::TimeZone::Australia::Adelaide 1.88
      DateTime::TimeZone::Australia::Brisbane 1.88
      DateTime::TimeZone::Australia::Broken_Hill 1.88
      DateTime::TimeZone::Australia::Currie 1.88
      DateTime::TimeZone::Australia::Darwin 1.88
      DateTime::TimeZone::Australia::Eucla 1.88
      DateTime::TimeZone::Australia::Hobart 1.88
      DateTime::TimeZone::Australia::Lindeman 1.88
      DateTime::TimeZone::Australia::Lord_Howe 1.88
      DateTime::TimeZone::Australia::Melbourne 1.88
      DateTime::TimeZone::Australia::Perth 1.88
      DateTime::TimeZone::Australia::Sydney 1.88
      DateTime::TimeZone::CET 1.88
      DateTime::TimeZone::CST6CDT 1.88
      DateTime::TimeZone::Catalog 1.88
      DateTime::TimeZone::EET 1.88
      DateTime::TimeZone::EST 1.88
      DateTime::TimeZone::EST5EDT 1.88
      DateTime::TimeZone::Europe::Amsterdam 1.88
      DateTime::TimeZone::Europe::Andorra 1.88
      DateTime::TimeZone::Europe::Athens 1.88
      DateTime::TimeZone::Europe::Belgrade 1.88
      DateTime::TimeZone::Europe::Berlin 1.88
      DateTime::TimeZone::Europe::Brussels 1.88
      DateTime::TimeZone::Europe::Bucharest 1.88
      DateTime::TimeZone::Europe::Budapest 1.88
      DateTime::TimeZone::Europe::Chisinau 1.88
      DateTime::TimeZone::Europe::Copenhagen 1.88
      DateTime::TimeZone::Europe::Dublin 1.88
      DateTime::TimeZone::Europe::Gibraltar 1.88
      DateTime::TimeZone::Europe::Helsinki 1.88
      DateTime::TimeZone::Europe::Istanbul 1.88
      DateTime::TimeZone::Europe::Kaliningrad 1.88
      DateTime::TimeZone::Europe::Kiev 1.88
      DateTime::TimeZone::Europe::Lisbon 1.88
      DateTime::TimeZone::Europe::London 1.88
      DateTime::TimeZone::Europe::Luxembourg 1.88
      DateTime::TimeZone::Europe::Madrid 1.88
      DateTime::TimeZone::Europe::Malta 1.88
      DateTime::TimeZone::Europe::Minsk 1.88
      DateTime::TimeZone::Europe::Monaco 1.88
      DateTime::TimeZone::Europe::Moscow 1.88
      DateTime::TimeZone::Europe::Oslo 1.88
      DateTime::TimeZone::Europe::Paris 1.88
      DateTime::TimeZone::Europe::Prague 1.88
      DateTime::TimeZone::Europe::Riga 1.88
      DateTime::TimeZone::Europe::Rome 1.88
      DateTime::TimeZone::Europe::Samara 1.88
      DateTime::TimeZone::Europe::Simferopol 1.88
      DateTime::TimeZone::Europe::Sofia 1.88
      DateTime::TimeZone::Europe::Stockholm 1.88
      DateTime::TimeZone::Europe::Tallinn 1.88
      DateTime::TimeZone::Europe::Tirane 1.88
      DateTime::TimeZone::Europe::Uzhgorod 1.88
      DateTime::TimeZone::Europe::Vienna 1.88
      DateTime::TimeZone::Europe::Vilnius 1.88
      DateTime::TimeZone::Europe::Volgograd 1.88
      DateTime::TimeZone::Europe::Warsaw 1.88
      DateTime::TimeZone::Europe::Zaporozhye 1.88
      DateTime::TimeZone::Europe::Zurich 1.88
      DateTime::TimeZone::Floating 1.88
      DateTime::TimeZone::HST 1.88
      DateTime::TimeZone::Indian::Chagos 1.88
      DateTime::TimeZone::Indian::Christmas 1.88
      DateTime::TimeZone::Indian::Cocos 1.88
      DateTime::TimeZone::Indian::Kerguelen 1.88
      DateTime::TimeZone::Indian::Mahe 1.88
      DateTime::TimeZone::Indian::Maldives 1.88
      DateTime::TimeZone::Indian::Mauritius 1.88
      DateTime::TimeZone::Indian::Reunion 1.88
      DateTime::TimeZone::Local 1.88
      DateTime::TimeZone::Local::Android 1.88
      DateTime::TimeZone::Local::Unix 1.88
      DateTime::TimeZone::Local::VMS 1.88
      DateTime::TimeZone::MET 1.88
      DateTime::TimeZone::MST 1.88
      DateTime::TimeZone::MST7MDT 1.88
      DateTime::TimeZone::OffsetOnly 1.88
      DateTime::TimeZone::OlsonDB 1.88
      DateTime::TimeZone::OlsonDB::Change 1.88
      DateTime::TimeZone::OlsonDB::Observance 1.88
      DateTime::TimeZone::OlsonDB::Rule 1.88
      DateTime::TimeZone::OlsonDB::Zone 1.88
      DateTime::TimeZone::PST8PDT 1.88
      DateTime::TimeZone::Pacific::Apia 1.88
      DateTime::TimeZone::Pacific::Auckland 1.88
      DateTime::TimeZone::Pacific::Bougainville 1.88
      DateTime::TimeZone::Pacific::Chatham 1.88
      DateTime::TimeZone::Pacific::Chuuk 1.88
      DateTime::TimeZone::Pacific::Easter 1.88
      DateTime::TimeZone::Pacific::Efate 1.88
      DateTime::TimeZone::Pacific::Enderbury 1.88
      DateTime::TimeZone::Pacific::Fakaofo 1.88
      DateTime::TimeZone::Pacific::Fiji 1.88
      DateTime::TimeZone::Pacific::Funafuti 1.88
      DateTime::TimeZone::Pacific::Galapagos 1.88
      DateTime::TimeZone::Pacific::Gambier 1.88
      DateTime::TimeZone::Pacific::Guadalcanal 1.88
      DateTime::TimeZone::Pacific::Guam 1.88
      DateTime::TimeZone::Pacific::Honolulu 1.88
      DateTime::TimeZone::Pacific::Kiritimati 1.88
      DateTime::TimeZone::Pacific::Kosrae 1.88
      DateTime::TimeZone::Pacific::Kwajalein 1.88
      DateTime::TimeZone::Pacific::Majuro 1.88
      DateTime::TimeZone::Pacific::Marquesas 1.88
      DateTime::TimeZone::Pacific::Nauru 1.88
      DateTime::TimeZone::Pacific::Niue 1.88
      DateTime::TimeZone::Pacific::Norfolk 1.88
      DateTime::TimeZone::Pacific::Noumea 1.88
      DateTime::TimeZone::Pacific::Pago_Pago 1.88
      DateTime::TimeZone::Pacific::Palau 1.88
      DateTime::TimeZone::Pacific::Pitcairn 1.88
      DateTime::TimeZone::Pacific::Pohnpei 1.88
      DateTime::TimeZone::Pacific::Port_Moresby 1.88
      DateTime::TimeZone::Pacific::Rarotonga 1.88
      DateTime::TimeZone::Pacific::Tahiti 1.88
      DateTime::TimeZone::Pacific::Tarawa 1.88
      DateTime::TimeZone::Pacific::Tongatapu 1.88
      DateTime::TimeZone::Pacific::Wake 1.88
      DateTime::TimeZone::Pacific::Wallis 1.88
      DateTime::TimeZone::UTC 1.88
      DateTime::TimeZone::WET 1.88
    requirements:
      Class::Singleton 1.03
      Cwd 3
      ExtUtils::MakeMaker 0
      File::Basename 0
      File::Compare 0
      File::Find 0
      File::Spec 0
      List::AllUtils 0
      List::Util 0

cpanfile.snapshot  view on Meta::CPAN

      Module::Load 0
      SQL::QueryMaker 0
      Scalar::Util 0
      parent 0
      perl 5.008001
  SQL-QueryMaker-0.03
    pathname: K/KA/KAZUHO/SQL-QueryMaker-0.03.tar.gz
    provides:
      SQL::QueryMaker 0.03
    requirements:
      DateTime 0
      ExtUtils::MakeMaker 6.42
      Scalar::Util 0
      Test::More 0.98
      Test::Requires 0
      Tie::IxHash 0
      perl 5.008001
  Scalar-List-Utils-1.42
    pathname: P/PE/PEVANS/Scalar-List-Utils-1.42.tar.gz
    provides:
      List::Util 1.42

lib/App/Koyomi/Config.pm  view on Meta::CPAN

package App::Koyomi::Config;

use strict;
use warnings;
use 5.010_001;
use DateTime::TimeZone;
use File::Spec;
use Log::Minimal env_debug => 'KOYOMI_LOG_DEBUG';
use Perl6::Slurp;
use TOML qw(from_toml);

use App::Koyomi::Logger;

use version; our $VERSION = 'v0.6.1';

my $CONFIG;

lib/App/Koyomi/Config.pm  view on Meta::CPAN

        App::Koyomi::Logger->bootstrap(config => $self);
        debugf(ddf($data));

        return $self;
    }->();
    return $CONFIG;
}

sub time_zone {
    my $self = shift;
    $self->{time_zone} // DateTime::TimeZone->new(name => 'local');
}

sub log_path {
    my $self = shift;
    $self->{log}{file_path} // $ENV{KOYOMI_LOG_PATH} // File::Spec->catfile('log', 'koyomi.log');
}

sub _config_path {
    my $path;
    if ($ENV{KOYOMI_CONFIG_PATH}) {

lib/App/Koyomi/Context.pm  view on Meta::CPAN

package App::Koyomi::Context;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/config/],
);
use DateTime;
use Module::Load;

use App::Koyomi::Config;

use version; our $VERSION = 'v0.6.1';

my $CONTEXT;

sub instance {
    my $class = shift;

lib/App/Koyomi/Context.pm  view on Meta::CPAN

sub datasource_semaphore {
    my $self = shift // __PACKAGE__->instance;
    my $ds_module
        = sprintf 'App::Koyomi::DataSource::Semaphore::%s', $self->config->{datasource}{module}{semaphore};
    load $ds_module;
    $ds_module->instance(ctx => $self);
}

sub now {
    my $self = shift;
    DateTime->now(time_zone => $self->config->time_zone);
}

sub is_debug {
    my $self = shift;
    return 1 if $ENV{KOYOMI_DEBUG};
    my $debug_mode = $self->config->{debug_mode} // q{};
    return 1 if ($debug_mode eq 'true');
}

1;

lib/App/Koyomi/DataSource/Job/Teng.pm  view on Meta::CPAN

package App::Koyomi::DataSource::Job::Teng;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/teng/],
);
use DateTime::Format::MySQL;
use Log::Minimal env_debug => 'KOYOMI_LOG_DEBUG';
use Smart::Args;

use App::Koyomi::DataSource::Job::Teng::Data;
use App::Koyomi::DataSource::Job::Teng::Object;
use App::Koyomi::DataSource::Job::Teng::Schema;

use parent qw(App::Koyomi::DataSource::Job);

use version; our $VERSION = 'v0.6.1';

lib/App/Koyomi/DataSource/Job/Teng.pm  view on Meta::CPAN

        job   => $job,
        times => \@times,
    );
}

sub create {
    args(
        my $self,
        my $data => 'HashRef',
        my $ctx  => 'App::Koyomi::Context',
        my $now  => +{ isa => 'DateTime', optional => 1 },
    );
    $now ||= $ctx->now;
    my $teng = $self->teng;

    # Transaction
    my $txn = $teng->txn_scope;

    my $now_db = DateTime::Format::MySQL->format_datetime($now);
    eval {
        # create jobs
        my %job = map { $_ => $data->{$_} } qw/user command memo/;
        $job{created_on} = $job{updated_at} = $now_db;
        my $new_job = $teng->insert('jobs', \%job);
        unless ($new_job) {
            croakf(q/Insert jobs Failed! data=%s/, ddf(\%job));
        }

        # create job_times

lib/App/Koyomi/DataSource/Job/Teng.pm  view on Meta::CPAN

    $txn->commit;
    return 1;
}

sub update_by_id {
    args(
        my $self,
        my $id   => 'Int',
        my $data => 'HashRef',
        my $ctx  => 'App::Koyomi::Context',
        my $now  => +{ isa => 'DateTime', optional => 1 },
    );
    $now ||= $ctx->now;
    my $teng = $self->teng;

    # Transaction
    my $txn = $teng->txn_scope;

    my $now_db = DateTime::Format::MySQL->format_datetime($now);
    eval {
        # update jobs
        my %job = map { $_ => $data->{$_} } qw/user command memo/;
        $job{updated_at} = $now_db;
        unless ($teng->update('jobs', \%job, +{ id => $id })) {
            croakf(q/Update jobs Failed! id=%d, data=%s/, $id, ddf(\%job));
        }

        # replace job_times
        unless ($teng->delete('job_times', +{ job_id => $id })) {

lib/App/Koyomi/DataSource/Job/Teng/Data.pm  view on Meta::CPAN


# Accessor for jobs.columns
{
    no strict 'refs';
    for my $column (qw/id user command memo/) {
        *{ __PACKAGE__ . '::' . $column } = sub {
            my $self = shift;
            $self->{_job}->$column;
        };
    }
    # DATETIME => DateTime
    for my $column (qw/created_on updated_at/) {
        *{ __PACKAGE__ . '::' . $column } = sub {
            my $self = shift;
            DateTime::Format::MySQL->parse_datetime($self->{_job}->$column)
                ->set_time_zone($self->ctx->config->time_zone);
        };
    }
}

sub new {
    args(
        my $class,
        my $ctx   => 'App::Koyomi::Context',
        my $job   => 'Teng::Row',

lib/App/Koyomi/DataSource/Semaphore/Teng.pm  view on Meta::CPAN

package App::Koyomi::DataSource::Semaphore::Teng;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/teng/],
);
use DateTime::Format::MySQL;
use Log::Minimal env_debug => 'KOYOMI_LOG_DEBUG';
use Smart::Args;

use App::Koyomi::DataSource::Semaphore::Teng::Data;
use App::Koyomi::DataSource::Semaphore::Teng::Object;
use App::Koyomi::DataSource::Semaphore::Teng::Schema;

use parent qw(App::Koyomi::DataSource::Semaphore);

use version; our $VERSION = 'v0.6.1';

lib/App/Koyomi/DataSource/Semaphore/Teng.pm  view on Meta::CPAN

        row => $row,
        ctx => $ctx,
    );
}

sub create {
    args(
        my $self,
        my $job_id => 'Int',
        my $ctx    => 'App::Koyomi::Context',
        my $now    => +{ isa => 'DateTime', optional => 1 },
    );
    $now ||= $ctx->now;
    my $teng = $self->teng;

    # Transaction
    my $txn = $teng->txn_scope;

    my $now_db = DateTime::Format::MySQL->format_datetime($now);
    eval {
        my %semaphore = ( job_id => $job_id );
        $semaphore{created_on} = $semaphore{updated_at} = $now_db;
        unless ($teng->insert($TABLE, \%semaphore)) {
            croakf(q/Insert %s Failed! data=%s/, $TABLE, ddf(\%semaphore));
        }
    };
    if ($@) {
        $txn->rollback;
        die $@;

lib/App/Koyomi/DataSource/Semaphore/Teng/Data.pm  view on Meta::CPAN

package App::Koyomi::DataSource::Semaphore::Teng::Data;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/row ctx/],
);
use DateTime::Format::MySQL;
use Smart::Args;

use version; our $VERSION = 'v0.6.1';

{
    no strict 'refs';
    for my $column (qw/job_id number run_host run_pid/) {
        *{ __PACKAGE__ . '::' . $column } = sub {
            my $self = shift;
            $self->row->$column;
        };
    }
    # DATETIME => DateTime
    for my $column (qw/created_on run_date updated_at/) {
        *{ __PACKAGE__ . '::' . $column } = sub {
            my $self = shift;
            DateTime::Format::MySQL->parse_datetime($self->row->$column)
                ->set_time_zone($self->ctx->config->time_zone);
        };
    }
}

sub new {
    args(
        my $class,
        my $row => 'Teng::Row',
        my $ctx => 'App::Koyomi::Context',

lib/App/Koyomi/DataSource/Semaphore/Teng/Data.pm  view on Meta::CPAN

        ctx => $ctx,
    }, $class;
}

sub update_with_condition {
    args(
        my $self,
        my $data  => 'HashRef',
        my $where => 'HashRef',
        my $ctx   => 'App::Koyomi::Context',
        my $now   => +{ isa => 'DateTime', optional => 1 },
    );
    $now ||= $ctx->now;
    my $teng = $self->row->handle;

    my %stash = %$data;
    my %cond  = %$where;
    for my $col (qw/created_on run_date updated_at/) {
        if ($where->{$col}) {
            $cond{$col} = DateTime::Format::MySQL->format_datetime($where->{$col});
        }
        if ($col eq 'updated_at') {
            $stash{$col} = DateTime::Format::MySQL->format_datetime($now);
            next;
        }
        if ($data->{$col}) {
            $stash{$col} = DateTime::Format::MySQL->format_datetime($data->{$col});
        }
    }

    my $txn = $teng->txn_scope;
    my $updated = $self->row->update(\%stash, \%cond);
    if ($updated) {
        $txn->commit;
        return 1;
    } else {
        $txn->rollback;

lib/App/Koyomi/Job.pm  view on Meta::CPAN

package App::Koyomi::Job;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/ctx times/],
);
use DateTime;
use IPC::Cmd;
use Log::Minimal env_debug => 'KOYOMI_LOG_DEBUG';
use Smart::Args;

use App::Koyomi::Semaphore;

use version; our $VERSION = 'v0.6.1';

our @JOB_FIELDS  = qw/id user command memo created_on updated_at/;
our @TIME_FIELDS = qw/id job_id year month day hour minute weekday created_on updated_at/;

lib/App/Koyomi/Job.pm  view on Meta::CPAN

sub _proc_user {
    my $self = shift;
    return
        $ENV{USER} || $ENV{LOGNAME} || getlogin() || getpwuid($<)
            || croakf(q/Can't get user of process! id=%d/, $self->id);
}

sub _get_lock {
    args(
        my $self,
        my $now => +{ isa => 'DateTime', optional => 1 },
    );
    $now ||= $self->ctx->now;

    return App::Koyomi::Semaphore->consume(
        job_id => $self->id,
        now    => $now,
        ctx    => $self->ctx,
    );
}

lib/App/Koyomi/Schedule.pm  view on Meta::CPAN

package App::Koyomi::Schedule;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/ctx config jobs/],
    rw => [qw/last_updated_at/],
);
use DateTime;
use Log::Minimal env_debug => 'KOYOMI_LOG_DEBUG';
use Smart::Args;

use App::Koyomi::Job;

use version; our $VERSION = 'v0.6.1';

my $SCHEDULE;

sub instance {

lib/App/Koyomi/Schedule.pm  view on Meta::CPAN

=over 4

=item B<instance>

Fetch schedule singleton.

=item B<update>

Update schedule if needed.

=item B<get_jobs> (DateTime)

Fetch jobs to execute at that time.

=back

=head1 SEE ALSO

L<App::Koyomi::Worker>

=head1 AUTHORS

lib/App/Koyomi/Semaphore.pm  view on Meta::CPAN

package App::Koyomi::Semaphore;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/ctx data/],
);
use DateTime;
use DateTime::Format::MySQL;
use Log::Minimal env_debug => 'KOYOMI_LOG_DEBUG';
use Smart::Args;
use Sys::Hostname;

use version; our $VERSION = 'v0.6.1';

sub consume {
    args(
        my $class,
        my $job_id => 'Int',
        my $now    => +{ isa => 'DateTime', optional => 1 },
        my $ctx    => 'App::Koyomi::Context',
    );
    my $ds = $ctx->datasource_semaphore;
    if ($ds->isa('App::Koyomi::DataSource::Semaphore::None')) {
        return 1;
    }

    $now ||= $ctx->now;
    my $header = sprintf('%d %d', $$, $job_id);

lib/App/Koyomi/Worker.pm  view on Meta::CPAN

package App::Koyomi::Worker;

use strict;
use warnings;
use 5.010_001;
use Class::Accessor::Lite (
    ro => [qw/ctx config schedule/],
);
use DateTime;
use Getopt::Long qw(:config posix_default no_ignore_case no_ignore_case_always);
use Log::Minimal env_debug => 'KOYOMI_LOG_DEBUG';
use Proc::Wait3;
use Smart::Args;
use Time::Piece;

use App::Koyomi::Context;
use App::Koyomi::Schedule;

use version; our $VERSION = 'v0.6.1';

lib/App/Koyomi/Worker.pm  view on Meta::CPAN


sub _now {
    my $self = shift;

    my $debug_datestr = sub {
        return unless $self->ctx->is_debug;
        return $self->config->{debug}{now} // undef;
    }->();
    if ($debug_datestr) {
        my $t = Time::Piece->strptime($debug_datestr, '%Y-%m-%dT%H:%M');
        return DateTime->from_epoch(epoch => $t->epoch);
    }
    return $self->ctx->now;
}

1;

__END__

=encoding utf8

t/App/Koyomi/Schedule/_filter_job_times.t  view on Meta::CPAN

use strict;
use warnings;
use Test::Base;
use DateTime;
use Time::Piece;

use App::Koyomi::Schedule;
use Test::Koyomi::JobTime;

plan tests => 1 * blocks;

filters {
    job_date    => [qw/chomp/],
    executed_on => [qw/chomp/],
    match       => [qw/eval/],
};

run {
    my $block = shift;

    my @job_date = split(/ /, $block->job_date);
    my $job = Test::Koyomi::JobTime->mock(@job_date);

    my $now_t = Time::Piece->strptime($block->executed_on, '%Y-%m-%dT%H:%M');
    my $now = DateTime->from_epoch(epoch => $now_t->epoch);

    my @jobs = App::Koyomi::Schedule::_filter_job_times([$job], $now);

    diag sprintf q{Job: '%s/%s/%s %s:%s (%s)', Now: '%s'}, @job_date, $block->executed_on;

    if ($block->match) {
        ok(scalar(@jobs), 'match');
    } else {
        ok(!scalar(@jobs), 'not match');
    }



( run in 0.322 second using v1.01-cache-2.11-cpan-2b0bae70ee8 )