view release on metacpan or search on metacpan
"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",
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'
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');
}