diff --git a/.gitignore b/.gitignore index 4bfa312..66ca220 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ *.swp lutim.conf lutim.db +*.db-shm +*.db-wal script/hypnotoad.pid local/* files/* diff --git a/cpanfile b/cpanfile index 4b930b9..7f71d89 100644 --- a/cpanfile +++ b/cpanfile @@ -1,4 +1,4 @@ -requires 'Mojolicious'; +requires 'Mojolicious', '>= 7.31'; requires 'EV'; requires 'IO::Socket::SSL'; requires 'Data::Validate::URI'; diff --git a/cpanfile.snapshot b/cpanfile.snapshot index 7ee27fe..901f302 100644 --- a/cpanfile.snapshot +++ b/cpanfile.snapshot @@ -1,20 +1,20 @@ # carton snapshot format: version 1.0 DISTRIBUTIONS - Archive-Zip-1.57 - pathname: P/PH/PHRED/Archive-Zip-1.57.tar.gz + Archive-Zip-1.59 + pathname: P/PH/PHRED/Archive-Zip-1.59.tar.gz provides: - Archive::Zip 1.57 - Archive::Zip::Archive 1.57 - Archive::Zip::BufferedFileHandle 1.57 - Archive::Zip::DirectoryMember 1.57 - Archive::Zip::FileMember 1.57 - Archive::Zip::Member 1.57 - Archive::Zip::MemberRead 1.57 - Archive::Zip::MockFileHandle 1.57 - Archive::Zip::NewFileMember 1.57 - Archive::Zip::StringMember 1.57 - Archive::Zip::Tree 1.57 - Archive::Zip::ZipFileMember 1.57 + Archive::Zip 1.59 + Archive::Zip::Archive 1.59 + Archive::Zip::BufferedFileHandle 1.59 + Archive::Zip::DirectoryMember 1.59 + Archive::Zip::FileMember 1.59 + Archive::Zip::Member 1.59 + Archive::Zip::MemberRead 1.59 + Archive::Zip::MockFileHandle 1.59 + Archive::Zip::NewFileMember 1.59 + Archive::Zip::StringMember 1.59 + Archive::Zip::Tree 1.59 + Archive::Zip::ZipFileMember 1.59 requirements: Compress::Raw::Zlib 2.017 ExtUtils::MakeMaker 0 @@ -27,10 +27,23 @@ DISTRIBUTIONS IO::File 0 IO::Handle 0 IO::Seekable 0 - Test::MockModule 0 - Test::More 0.88 Time::Local 0 perl 5.006 + B-Hooks-EndOfScope-0.21 + pathname: E/ET/ETHER/B-Hooks-EndOfScope-0.21.tar.gz + provides: + B::Hooks::EndOfScope 0.21 + B::Hooks::EndOfScope::PP 0.21 + B::Hooks::EndOfScope::XS 0.21 + requirements: + ExtUtils::MakeMaker 0 + Module::Implementation 0.05 + Sub::Exporter::Progressive 0.001006 + Text::ParseWords 0 + Variable::Magic 0.48 + perl 5.008001 + strict 0 + warnings 0 CSS-Minifier-XS-0.09 pathname: G/GT/GTERMARS/CSS-Minifier-XS-0.09.tar.gz provides: @@ -44,6 +57,21 @@ DISTRIBUTIONS Canary::Stability 2006 requirements: ExtUtils::MakeMaker 0 + Class-Data-Inheritable-0.08 + pathname: T/TM/TMTM/Class-Data-Inheritable-0.08.tar.gz + provides: + Class::Data::Inheritable 0.08 + requirements: + ExtUtils::MakeMaker 0 + Class-Inspector-1.31 + pathname: P/PL/PLICEASE/Class-Inspector-1.31.tar.gz + provides: + Class::Inspector 1.31 + Class::Inspector::Functions 1.31 + requirements: + ExtUtils::MakeMaker 0 + File::Spec 0.80 + perl 5.006 Class-Singleton-1.4 pathname: A/AB/ABW/Class-Singleton-1.4.tar.gz provides: @@ -250,878 +278,442 @@ DISTRIBUTIONS Data::Validate::Domain 0 Data::Validate::IP 0 ExtUtils::MakeMaker 0 - DateTime-1.28 - pathname: D/DR/DROLSKY/DateTime-1.28.tar.gz + DateTime-1.42 + pathname: D/DR/DROLSKY/DateTime-1.42.tar.gz provides: - DateTime 1.28 - DateTime::Duration 1.28 - DateTime::Helpers 1.28 - DateTime::Infinite 1.28 - DateTime::Infinite::Future 1.28 - DateTime::Infinite::Past 1.28 - DateTime::LeapSecond 1.28 - DateTime::PP 1.28 - DateTime::PPExtra 1.28 + DateTime 1.42 + DateTime::Duration 1.42 + DateTime::Helpers 1.42 + DateTime::Infinite 1.42 + DateTime::Infinite::Future 1.42 + DateTime::Infinite::Past 1.42 + DateTime::LeapSecond 1.42 + DateTime::PP 1.42 + DateTime::PPExtra 1.42 + DateTime::Types 1.42 requirements: Carp 0 - DateTime::Locale 0.41 - DateTime::TimeZone 1.74 + DateTime::Locale 1.06 + DateTime::TimeZone 2.02 + Dist::CheckConflicts 0.02 ExtUtils::MakeMaker 0 POSIX 0 - Params::Validate 1.03 + Params::ValidationCompiler 0.13 Scalar::Util 0 + Specio 0.18 + Specio::Declare 0 + Specio::Exporter 0 + Specio::Library::Builtins 0 + Specio::Library::Numeric 0 + Specio::Library::String 0 Try::Tiny 0 XSLoader 0 base 0 - constant 0 integer 0 + namespace::autoclean 0.19 overload 0 - perl 5.008001 + parent 0 + perl 5.008004 strict 0 - vars 0 warnings 0 warnings::register 0 - DateTime-Locale-0.45 - pathname: D/DR/DROLSKY/DateTime-Locale-0.45.tar.gz + DateTime-Locale-1.16 + pathname: D/DR/DROLSKY/DateTime-Locale-1.16.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 + DateTime::Locale 1.16 + DateTime::Locale::Base 1.16 + DateTime::Locale::Catalog 1.16 + DateTime::Locale::Data 1.16 + DateTime::Locale::FromData 1.16 + DateTime::Locale::Util 1.16 requirements: - List::MoreUtils 0 - Module::Build 0 - Params::Validate 0.91 - perl 5.006 - DateTime-TimeZone-1.90 - pathname: D/DR/DROLSKY/DateTime-TimeZone-1.90.tar.gz + Carp 0 + Dist::CheckConflicts 0.02 + Exporter 0 + ExtUtils::MakeMaker 0 + File::ShareDir 0 + File::ShareDir::Install 0.06 + List::Util 1.45 + Params::ValidationCompiler 0.13 + Specio::Declare 0 + Specio::Library::String 0 + namespace::autoclean 0.19 + perl 5.008004 + strict 0 + warnings 0 + DateTime-TimeZone-2.11 + pathname: D/DR/DROLSKY/DateTime-TimeZone-2.11.tar.gz provides: - DateTime::TimeZone 1.90 - DateTime::TimeZone::Africa::Abidjan 1.90 - DateTime::TimeZone::Africa::Accra 1.90 - DateTime::TimeZone::Africa::Algiers 1.90 - DateTime::TimeZone::Africa::Bissau 1.90 - DateTime::TimeZone::Africa::Cairo 1.90 - DateTime::TimeZone::Africa::Casablanca 1.90 - DateTime::TimeZone::Africa::Ceuta 1.90 - DateTime::TimeZone::Africa::El_Aaiun 1.90 - DateTime::TimeZone::Africa::Johannesburg 1.90 - DateTime::TimeZone::Africa::Khartoum 1.90 - DateTime::TimeZone::Africa::Lagos 1.90 - DateTime::TimeZone::Africa::Maputo 1.90 - DateTime::TimeZone::Africa::Monrovia 1.90 - DateTime::TimeZone::Africa::Nairobi 1.90 - DateTime::TimeZone::Africa::Ndjamena 1.90 - DateTime::TimeZone::Africa::Tripoli 1.90 - DateTime::TimeZone::Africa::Tunis 1.90 - DateTime::TimeZone::Africa::Windhoek 1.90 - DateTime::TimeZone::America::Adak 1.90 - DateTime::TimeZone::America::Anchorage 1.90 - DateTime::TimeZone::America::Araguaina 1.90 - DateTime::TimeZone::America::Argentina::Buenos_Aires 1.90 - DateTime::TimeZone::America::Argentina::Catamarca 1.90 - DateTime::TimeZone::America::Argentina::Cordoba 1.90 - DateTime::TimeZone::America::Argentina::Jujuy 1.90 - DateTime::TimeZone::America::Argentina::La_Rioja 1.90 - DateTime::TimeZone::America::Argentina::Mendoza 1.90 - DateTime::TimeZone::America::Argentina::Rio_Gallegos 1.90 - DateTime::TimeZone::America::Argentina::Salta 1.90 - DateTime::TimeZone::America::Argentina::San_Juan 1.90 - DateTime::TimeZone::America::Argentina::San_Luis 1.90 - DateTime::TimeZone::America::Argentina::Tucuman 1.90 - DateTime::TimeZone::America::Argentina::Ushuaia 1.90 - DateTime::TimeZone::America::Asuncion 1.90 - DateTime::TimeZone::America::Atikokan 1.90 - DateTime::TimeZone::America::Bahia 1.90 - DateTime::TimeZone::America::Bahia_Banderas 1.90 - DateTime::TimeZone::America::Barbados 1.90 - DateTime::TimeZone::America::Belem 1.90 - DateTime::TimeZone::America::Belize 1.90 - DateTime::TimeZone::America::Blanc_Sablon 1.90 - DateTime::TimeZone::America::Boa_Vista 1.90 - DateTime::TimeZone::America::Bogota 1.90 - DateTime::TimeZone::America::Boise 1.90 - DateTime::TimeZone::America::Cambridge_Bay 1.90 - DateTime::TimeZone::America::Campo_Grande 1.90 - DateTime::TimeZone::America::Cancun 1.90 - DateTime::TimeZone::America::Caracas 1.90 - DateTime::TimeZone::America::Cayenne 1.90 - DateTime::TimeZone::America::Chicago 1.90 - DateTime::TimeZone::America::Chihuahua 1.90 - DateTime::TimeZone::America::Costa_Rica 1.90 - DateTime::TimeZone::America::Creston 1.90 - DateTime::TimeZone::America::Cuiaba 1.90 - DateTime::TimeZone::America::Curacao 1.90 - DateTime::TimeZone::America::Danmarkshavn 1.90 - DateTime::TimeZone::America::Dawson 1.90 - DateTime::TimeZone::America::Dawson_Creek 1.90 - DateTime::TimeZone::America::Denver 1.90 - DateTime::TimeZone::America::Detroit 1.90 - DateTime::TimeZone::America::Edmonton 1.90 - DateTime::TimeZone::America::Eirunepe 1.90 - DateTime::TimeZone::America::El_Salvador 1.90 - DateTime::TimeZone::America::Fortaleza 1.90 - DateTime::TimeZone::America::Glace_Bay 1.90 - DateTime::TimeZone::America::Godthab 1.90 - DateTime::TimeZone::America::Goose_Bay 1.90 - DateTime::TimeZone::America::Grand_Turk 1.90 - DateTime::TimeZone::America::Guatemala 1.90 - DateTime::TimeZone::America::Guayaquil 1.90 - DateTime::TimeZone::America::Guyana 1.90 - DateTime::TimeZone::America::Halifax 1.90 - DateTime::TimeZone::America::Havana 1.90 - DateTime::TimeZone::America::Hermosillo 1.90 - DateTime::TimeZone::America::Indiana::Indianapolis 1.90 - DateTime::TimeZone::America::Indiana::Knox 1.90 - DateTime::TimeZone::America::Indiana::Marengo 1.90 - DateTime::TimeZone::America::Indiana::Petersburg 1.90 - DateTime::TimeZone::America::Indiana::Tell_City 1.90 - DateTime::TimeZone::America::Indiana::Vevay 1.90 - DateTime::TimeZone::America::Indiana::Vincennes 1.90 - DateTime::TimeZone::America::Indiana::Winamac 1.90 - DateTime::TimeZone::America::Inuvik 1.90 - DateTime::TimeZone::America::Iqaluit 1.90 - DateTime::TimeZone::America::Jamaica 1.90 - DateTime::TimeZone::America::Juneau 1.90 - DateTime::TimeZone::America::Kentucky::Louisville 1.90 - DateTime::TimeZone::America::Kentucky::Monticello 1.90 - DateTime::TimeZone::America::La_Paz 1.90 - DateTime::TimeZone::America::Lima 1.90 - DateTime::TimeZone::America::Los_Angeles 1.90 - DateTime::TimeZone::America::Maceio 1.90 - DateTime::TimeZone::America::Managua 1.90 - DateTime::TimeZone::America::Manaus 1.90 - DateTime::TimeZone::America::Martinique 1.90 - DateTime::TimeZone::America::Matamoros 1.90 - DateTime::TimeZone::America::Mazatlan 1.90 - DateTime::TimeZone::America::Menominee 1.90 - DateTime::TimeZone::America::Merida 1.90 - DateTime::TimeZone::America::Metlakatla 1.90 - DateTime::TimeZone::America::Mexico_City 1.90 - DateTime::TimeZone::America::Miquelon 1.90 - DateTime::TimeZone::America::Moncton 1.90 - DateTime::TimeZone::America::Monterrey 1.90 - DateTime::TimeZone::America::Montevideo 1.90 - DateTime::TimeZone::America::Nassau 1.90 - DateTime::TimeZone::America::New_York 1.90 - DateTime::TimeZone::America::Nipigon 1.90 - DateTime::TimeZone::America::Nome 1.90 - DateTime::TimeZone::America::Noronha 1.90 - DateTime::TimeZone::America::North_Dakota::Beulah 1.90 - DateTime::TimeZone::America::North_Dakota::Center 1.90 - DateTime::TimeZone::America::North_Dakota::New_Salem 1.90 - DateTime::TimeZone::America::Ojinaga 1.90 - DateTime::TimeZone::America::Panama 1.90 - DateTime::TimeZone::America::Pangnirtung 1.90 - DateTime::TimeZone::America::Paramaribo 1.90 - DateTime::TimeZone::America::Phoenix 1.90 - DateTime::TimeZone::America::Port_au_Prince 1.90 - DateTime::TimeZone::America::Port_of_Spain 1.90 - DateTime::TimeZone::America::Porto_Velho 1.90 - DateTime::TimeZone::America::Puerto_Rico 1.90 - DateTime::TimeZone::America::Rainy_River 1.90 - DateTime::TimeZone::America::Rankin_Inlet 1.90 - DateTime::TimeZone::America::Recife 1.90 - DateTime::TimeZone::America::Regina 1.90 - DateTime::TimeZone::America::Resolute 1.90 - DateTime::TimeZone::America::Rio_Branco 1.90 - DateTime::TimeZone::America::Santa_Isabel 1.90 - DateTime::TimeZone::America::Santarem 1.90 - DateTime::TimeZone::America::Santiago 1.90 - DateTime::TimeZone::America::Santo_Domingo 1.90 - DateTime::TimeZone::America::Sao_Paulo 1.90 - DateTime::TimeZone::America::Scoresbysund 1.90 - DateTime::TimeZone::America::Sitka 1.90 - DateTime::TimeZone::America::St_Johns 1.90 - DateTime::TimeZone::America::Swift_Current 1.90 - DateTime::TimeZone::America::Tegucigalpa 1.90 - DateTime::TimeZone::America::Thule 1.90 - DateTime::TimeZone::America::Thunder_Bay 1.90 - DateTime::TimeZone::America::Tijuana 1.90 - DateTime::TimeZone::America::Toronto 1.90 - DateTime::TimeZone::America::Vancouver 1.90 - DateTime::TimeZone::America::Whitehorse 1.90 - DateTime::TimeZone::America::Winnipeg 1.90 - DateTime::TimeZone::America::Yakutat 1.90 - DateTime::TimeZone::America::Yellowknife 1.90 - DateTime::TimeZone::Antarctica::Casey 1.90 - DateTime::TimeZone::Antarctica::Davis 1.90 - DateTime::TimeZone::Antarctica::DumontDUrville 1.90 - DateTime::TimeZone::Antarctica::Macquarie 1.90 - DateTime::TimeZone::Antarctica::Mawson 1.90 - DateTime::TimeZone::Antarctica::Palmer 1.90 - DateTime::TimeZone::Antarctica::Rothera 1.90 - DateTime::TimeZone::Antarctica::Syowa 1.90 - DateTime::TimeZone::Antarctica::Troll 1.90 - DateTime::TimeZone::Antarctica::Vostok 1.90 - DateTime::TimeZone::Asia::Almaty 1.90 - DateTime::TimeZone::Asia::Amman 1.90 - DateTime::TimeZone::Asia::Anadyr 1.90 - DateTime::TimeZone::Asia::Aqtau 1.90 - DateTime::TimeZone::Asia::Aqtobe 1.90 - DateTime::TimeZone::Asia::Ashgabat 1.90 - DateTime::TimeZone::Asia::Baghdad 1.90 - DateTime::TimeZone::Asia::Baku 1.90 - DateTime::TimeZone::Asia::Bangkok 1.90 - DateTime::TimeZone::Asia::Beirut 1.90 - DateTime::TimeZone::Asia::Bishkek 1.90 - DateTime::TimeZone::Asia::Brunei 1.90 - DateTime::TimeZone::Asia::Chita 1.90 - DateTime::TimeZone::Asia::Choibalsan 1.90 - DateTime::TimeZone::Asia::Colombo 1.90 - DateTime::TimeZone::Asia::Damascus 1.90 - DateTime::TimeZone::Asia::Dhaka 1.90 - DateTime::TimeZone::Asia::Dili 1.90 - DateTime::TimeZone::Asia::Dubai 1.90 - DateTime::TimeZone::Asia::Dushanbe 1.90 - DateTime::TimeZone::Asia::Gaza 1.90 - DateTime::TimeZone::Asia::Hebron 1.90 - DateTime::TimeZone::Asia::Ho_Chi_Minh 1.90 - DateTime::TimeZone::Asia::Hong_Kong 1.90 - DateTime::TimeZone::Asia::Hovd 1.90 - DateTime::TimeZone::Asia::Irkutsk 1.90 - DateTime::TimeZone::Asia::Jakarta 1.90 - DateTime::TimeZone::Asia::Jayapura 1.90 - DateTime::TimeZone::Asia::Jerusalem 1.90 - DateTime::TimeZone::Asia::Kabul 1.90 - DateTime::TimeZone::Asia::Kamchatka 1.90 - DateTime::TimeZone::Asia::Karachi 1.90 - DateTime::TimeZone::Asia::Kathmandu 1.90 - DateTime::TimeZone::Asia::Khandyga 1.90 - DateTime::TimeZone::Asia::Kolkata 1.90 - DateTime::TimeZone::Asia::Krasnoyarsk 1.90 - DateTime::TimeZone::Asia::Kuala_Lumpur 1.90 - DateTime::TimeZone::Asia::Kuching 1.90 - DateTime::TimeZone::Asia::Macau 1.90 - DateTime::TimeZone::Asia::Magadan 1.90 - DateTime::TimeZone::Asia::Makassar 1.90 - DateTime::TimeZone::Asia::Manila 1.90 - DateTime::TimeZone::Asia::Nicosia 1.90 - DateTime::TimeZone::Asia::Novokuznetsk 1.90 - DateTime::TimeZone::Asia::Novosibirsk 1.90 - DateTime::TimeZone::Asia::Omsk 1.90 - DateTime::TimeZone::Asia::Oral 1.90 - DateTime::TimeZone::Asia::Pontianak 1.90 - DateTime::TimeZone::Asia::Pyongyang 1.90 - DateTime::TimeZone::Asia::Qatar 1.90 - DateTime::TimeZone::Asia::Qyzylorda 1.90 - DateTime::TimeZone::Asia::Rangoon 1.90 - DateTime::TimeZone::Asia::Riyadh 1.90 - DateTime::TimeZone::Asia::Sakhalin 1.90 - DateTime::TimeZone::Asia::Samarkand 1.90 - DateTime::TimeZone::Asia::Seoul 1.90 - DateTime::TimeZone::Asia::Shanghai 1.90 - DateTime::TimeZone::Asia::Singapore 1.90 - DateTime::TimeZone::Asia::Srednekolymsk 1.90 - DateTime::TimeZone::Asia::Taipei 1.90 - DateTime::TimeZone::Asia::Tashkent 1.90 - DateTime::TimeZone::Asia::Tbilisi 1.90 - DateTime::TimeZone::Asia::Tehran 1.90 - DateTime::TimeZone::Asia::Thimphu 1.90 - DateTime::TimeZone::Asia::Tokyo 1.90 - DateTime::TimeZone::Asia::Ulaanbaatar 1.90 - DateTime::TimeZone::Asia::Urumqi 1.90 - DateTime::TimeZone::Asia::Ust_Nera 1.90 - DateTime::TimeZone::Asia::Vladivostok 1.90 - DateTime::TimeZone::Asia::Yakutsk 1.90 - DateTime::TimeZone::Asia::Yekaterinburg 1.90 - DateTime::TimeZone::Asia::Yerevan 1.90 - DateTime::TimeZone::Atlantic::Azores 1.90 - DateTime::TimeZone::Atlantic::Bermuda 1.90 - DateTime::TimeZone::Atlantic::Canary 1.90 - DateTime::TimeZone::Atlantic::Cape_Verde 1.90 - DateTime::TimeZone::Atlantic::Faroe 1.90 - DateTime::TimeZone::Atlantic::Madeira 1.90 - DateTime::TimeZone::Atlantic::Reykjavik 1.90 - DateTime::TimeZone::Atlantic::South_Georgia 1.90 - DateTime::TimeZone::Atlantic::Stanley 1.90 - DateTime::TimeZone::Australia::Adelaide 1.90 - DateTime::TimeZone::Australia::Brisbane 1.90 - DateTime::TimeZone::Australia::Broken_Hill 1.90 - DateTime::TimeZone::Australia::Currie 1.90 - DateTime::TimeZone::Australia::Darwin 1.90 - DateTime::TimeZone::Australia::Eucla 1.90 - DateTime::TimeZone::Australia::Hobart 1.90 - DateTime::TimeZone::Australia::Lindeman 1.90 - DateTime::TimeZone::Australia::Lord_Howe 1.90 - DateTime::TimeZone::Australia::Melbourne 1.90 - DateTime::TimeZone::Australia::Perth 1.90 - DateTime::TimeZone::Australia::Sydney 1.90 - DateTime::TimeZone::CET 1.90 - DateTime::TimeZone::CST6CDT 1.90 - DateTime::TimeZone::Catalog 1.90 - DateTime::TimeZone::EET 1.90 - DateTime::TimeZone::EST 1.90 - DateTime::TimeZone::EST5EDT 1.90 - DateTime::TimeZone::Europe::Amsterdam 1.90 - DateTime::TimeZone::Europe::Andorra 1.90 - DateTime::TimeZone::Europe::Athens 1.90 - DateTime::TimeZone::Europe::Belgrade 1.90 - DateTime::TimeZone::Europe::Berlin 1.90 - DateTime::TimeZone::Europe::Brussels 1.90 - DateTime::TimeZone::Europe::Bucharest 1.90 - DateTime::TimeZone::Europe::Budapest 1.90 - DateTime::TimeZone::Europe::Chisinau 1.90 - DateTime::TimeZone::Europe::Copenhagen 1.90 - DateTime::TimeZone::Europe::Dublin 1.90 - DateTime::TimeZone::Europe::Gibraltar 1.90 - DateTime::TimeZone::Europe::Helsinki 1.90 - DateTime::TimeZone::Europe::Istanbul 1.90 - DateTime::TimeZone::Europe::Kaliningrad 1.90 - DateTime::TimeZone::Europe::Kiev 1.90 - DateTime::TimeZone::Europe::Lisbon 1.90 - DateTime::TimeZone::Europe::London 1.90 - DateTime::TimeZone::Europe::Luxembourg 1.90 - DateTime::TimeZone::Europe::Madrid 1.90 - DateTime::TimeZone::Europe::Malta 1.90 - DateTime::TimeZone::Europe::Minsk 1.90 - DateTime::TimeZone::Europe::Monaco 1.90 - DateTime::TimeZone::Europe::Moscow 1.90 - DateTime::TimeZone::Europe::Oslo 1.90 - DateTime::TimeZone::Europe::Paris 1.90 - DateTime::TimeZone::Europe::Prague 1.90 - DateTime::TimeZone::Europe::Riga 1.90 - DateTime::TimeZone::Europe::Rome 1.90 - DateTime::TimeZone::Europe::Samara 1.90 - DateTime::TimeZone::Europe::Simferopol 1.90 - DateTime::TimeZone::Europe::Sofia 1.90 - DateTime::TimeZone::Europe::Stockholm 1.90 - DateTime::TimeZone::Europe::Tallinn 1.90 - DateTime::TimeZone::Europe::Tirane 1.90 - DateTime::TimeZone::Europe::Uzhgorod 1.90 - DateTime::TimeZone::Europe::Vienna 1.90 - DateTime::TimeZone::Europe::Vilnius 1.90 - DateTime::TimeZone::Europe::Volgograd 1.90 - DateTime::TimeZone::Europe::Warsaw 1.90 - DateTime::TimeZone::Europe::Zaporozhye 1.90 - DateTime::TimeZone::Europe::Zurich 1.90 - DateTime::TimeZone::Floating 1.90 - DateTime::TimeZone::HST 1.90 - DateTime::TimeZone::Indian::Chagos 1.90 - DateTime::TimeZone::Indian::Christmas 1.90 - DateTime::TimeZone::Indian::Cocos 1.90 - DateTime::TimeZone::Indian::Kerguelen 1.90 - DateTime::TimeZone::Indian::Mahe 1.90 - DateTime::TimeZone::Indian::Maldives 1.90 - DateTime::TimeZone::Indian::Mauritius 1.90 - DateTime::TimeZone::Indian::Reunion 1.90 - DateTime::TimeZone::Local 1.90 - DateTime::TimeZone::Local::Android 1.90 - DateTime::TimeZone::Local::Unix 1.90 - DateTime::TimeZone::Local::VMS 1.90 - DateTime::TimeZone::MET 1.90 - DateTime::TimeZone::MST 1.90 - DateTime::TimeZone::MST7MDT 1.90 - DateTime::TimeZone::OffsetOnly 1.90 - DateTime::TimeZone::OlsonDB 1.90 - DateTime::TimeZone::OlsonDB::Change 1.90 - DateTime::TimeZone::OlsonDB::Observance 1.90 - DateTime::TimeZone::OlsonDB::Rule 1.90 - DateTime::TimeZone::OlsonDB::Zone 1.90 - DateTime::TimeZone::PST8PDT 1.90 - DateTime::TimeZone::Pacific::Apia 1.90 - DateTime::TimeZone::Pacific::Auckland 1.90 - DateTime::TimeZone::Pacific::Bougainville 1.90 - DateTime::TimeZone::Pacific::Chatham 1.90 - DateTime::TimeZone::Pacific::Chuuk 1.90 - DateTime::TimeZone::Pacific::Easter 1.90 - DateTime::TimeZone::Pacific::Efate 1.90 - DateTime::TimeZone::Pacific::Enderbury 1.90 - DateTime::TimeZone::Pacific::Fakaofo 1.90 - DateTime::TimeZone::Pacific::Fiji 1.90 - DateTime::TimeZone::Pacific::Funafuti 1.90 - DateTime::TimeZone::Pacific::Galapagos 1.90 - DateTime::TimeZone::Pacific::Gambier 1.90 - DateTime::TimeZone::Pacific::Guadalcanal 1.90 - DateTime::TimeZone::Pacific::Guam 1.90 - DateTime::TimeZone::Pacific::Honolulu 1.90 - DateTime::TimeZone::Pacific::Kiritimati 1.90 - DateTime::TimeZone::Pacific::Kosrae 1.90 - DateTime::TimeZone::Pacific::Kwajalein 1.90 - DateTime::TimeZone::Pacific::Majuro 1.90 - DateTime::TimeZone::Pacific::Marquesas 1.90 - DateTime::TimeZone::Pacific::Nauru 1.90 - DateTime::TimeZone::Pacific::Niue 1.90 - DateTime::TimeZone::Pacific::Norfolk 1.90 - DateTime::TimeZone::Pacific::Noumea 1.90 - DateTime::TimeZone::Pacific::Pago_Pago 1.90 - DateTime::TimeZone::Pacific::Palau 1.90 - DateTime::TimeZone::Pacific::Pitcairn 1.90 - DateTime::TimeZone::Pacific::Pohnpei 1.90 - DateTime::TimeZone::Pacific::Port_Moresby 1.90 - DateTime::TimeZone::Pacific::Rarotonga 1.90 - DateTime::TimeZone::Pacific::Tahiti 1.90 - DateTime::TimeZone::Pacific::Tarawa 1.90 - DateTime::TimeZone::Pacific::Tongatapu 1.90 - DateTime::TimeZone::Pacific::Wake 1.90 - DateTime::TimeZone::Pacific::Wallis 1.90 - DateTime::TimeZone::UTC 1.90 - DateTime::TimeZone::WET 1.90 + DateTime::TimeZone 2.11 + DateTime::TimeZone::Africa::Abidjan 2.11 + DateTime::TimeZone::Africa::Accra 2.11 + DateTime::TimeZone::Africa::Algiers 2.11 + DateTime::TimeZone::Africa::Bissau 2.11 + DateTime::TimeZone::Africa::Cairo 2.11 + DateTime::TimeZone::Africa::Casablanca 2.11 + DateTime::TimeZone::Africa::Ceuta 2.11 + DateTime::TimeZone::Africa::El_Aaiun 2.11 + DateTime::TimeZone::Africa::Johannesburg 2.11 + DateTime::TimeZone::Africa::Khartoum 2.11 + DateTime::TimeZone::Africa::Lagos 2.11 + DateTime::TimeZone::Africa::Maputo 2.11 + DateTime::TimeZone::Africa::Monrovia 2.11 + DateTime::TimeZone::Africa::Nairobi 2.11 + DateTime::TimeZone::Africa::Ndjamena 2.11 + DateTime::TimeZone::Africa::Tripoli 2.11 + DateTime::TimeZone::Africa::Tunis 2.11 + DateTime::TimeZone::Africa::Windhoek 2.11 + DateTime::TimeZone::America::Adak 2.11 + DateTime::TimeZone::America::Anchorage 2.11 + DateTime::TimeZone::America::Araguaina 2.11 + DateTime::TimeZone::America::Argentina::Buenos_Aires 2.11 + DateTime::TimeZone::America::Argentina::Catamarca 2.11 + DateTime::TimeZone::America::Argentina::Cordoba 2.11 + DateTime::TimeZone::America::Argentina::Jujuy 2.11 + DateTime::TimeZone::America::Argentina::La_Rioja 2.11 + DateTime::TimeZone::America::Argentina::Mendoza 2.11 + DateTime::TimeZone::America::Argentina::Rio_Gallegos 2.11 + DateTime::TimeZone::America::Argentina::Salta 2.11 + DateTime::TimeZone::America::Argentina::San_Juan 2.11 + DateTime::TimeZone::America::Argentina::San_Luis 2.11 + DateTime::TimeZone::America::Argentina::Tucuman 2.11 + DateTime::TimeZone::America::Argentina::Ushuaia 2.11 + DateTime::TimeZone::America::Asuncion 2.11 + DateTime::TimeZone::America::Atikokan 2.11 + DateTime::TimeZone::America::Bahia 2.11 + DateTime::TimeZone::America::Bahia_Banderas 2.11 + DateTime::TimeZone::America::Barbados 2.11 + DateTime::TimeZone::America::Belem 2.11 + DateTime::TimeZone::America::Belize 2.11 + DateTime::TimeZone::America::Blanc_Sablon 2.11 + DateTime::TimeZone::America::Boa_Vista 2.11 + DateTime::TimeZone::America::Bogota 2.11 + DateTime::TimeZone::America::Boise 2.11 + DateTime::TimeZone::America::Cambridge_Bay 2.11 + DateTime::TimeZone::America::Campo_Grande 2.11 + DateTime::TimeZone::America::Cancun 2.11 + DateTime::TimeZone::America::Caracas 2.11 + DateTime::TimeZone::America::Cayenne 2.11 + DateTime::TimeZone::America::Chicago 2.11 + DateTime::TimeZone::America::Chihuahua 2.11 + DateTime::TimeZone::America::Costa_Rica 2.11 + DateTime::TimeZone::America::Creston 2.11 + DateTime::TimeZone::America::Cuiaba 2.11 + DateTime::TimeZone::America::Curacao 2.11 + DateTime::TimeZone::America::Danmarkshavn 2.11 + DateTime::TimeZone::America::Dawson 2.11 + DateTime::TimeZone::America::Dawson_Creek 2.11 + DateTime::TimeZone::America::Denver 2.11 + DateTime::TimeZone::America::Detroit 2.11 + DateTime::TimeZone::America::Edmonton 2.11 + DateTime::TimeZone::America::Eirunepe 2.11 + DateTime::TimeZone::America::El_Salvador 2.11 + DateTime::TimeZone::America::Fort_Nelson 2.11 + DateTime::TimeZone::America::Fortaleza 2.11 + DateTime::TimeZone::America::Glace_Bay 2.11 + DateTime::TimeZone::America::Godthab 2.11 + DateTime::TimeZone::America::Goose_Bay 2.11 + DateTime::TimeZone::America::Grand_Turk 2.11 + DateTime::TimeZone::America::Guatemala 2.11 + DateTime::TimeZone::America::Guayaquil 2.11 + DateTime::TimeZone::America::Guyana 2.11 + DateTime::TimeZone::America::Halifax 2.11 + DateTime::TimeZone::America::Havana 2.11 + DateTime::TimeZone::America::Hermosillo 2.11 + DateTime::TimeZone::America::Indiana::Indianapolis 2.11 + DateTime::TimeZone::America::Indiana::Knox 2.11 + DateTime::TimeZone::America::Indiana::Marengo 2.11 + DateTime::TimeZone::America::Indiana::Petersburg 2.11 + DateTime::TimeZone::America::Indiana::Tell_City 2.11 + DateTime::TimeZone::America::Indiana::Vevay 2.11 + DateTime::TimeZone::America::Indiana::Vincennes 2.11 + DateTime::TimeZone::America::Indiana::Winamac 2.11 + DateTime::TimeZone::America::Inuvik 2.11 + DateTime::TimeZone::America::Iqaluit 2.11 + DateTime::TimeZone::America::Jamaica 2.11 + DateTime::TimeZone::America::Juneau 2.11 + DateTime::TimeZone::America::Kentucky::Louisville 2.11 + DateTime::TimeZone::America::Kentucky::Monticello 2.11 + DateTime::TimeZone::America::La_Paz 2.11 + DateTime::TimeZone::America::Lima 2.11 + DateTime::TimeZone::America::Los_Angeles 2.11 + DateTime::TimeZone::America::Maceio 2.11 + DateTime::TimeZone::America::Managua 2.11 + DateTime::TimeZone::America::Manaus 2.11 + DateTime::TimeZone::America::Martinique 2.11 + DateTime::TimeZone::America::Matamoros 2.11 + DateTime::TimeZone::America::Mazatlan 2.11 + DateTime::TimeZone::America::Menominee 2.11 + DateTime::TimeZone::America::Merida 2.11 + DateTime::TimeZone::America::Metlakatla 2.11 + DateTime::TimeZone::America::Mexico_City 2.11 + DateTime::TimeZone::America::Miquelon 2.11 + DateTime::TimeZone::America::Moncton 2.11 + DateTime::TimeZone::America::Monterrey 2.11 + DateTime::TimeZone::America::Montevideo 2.11 + DateTime::TimeZone::America::Nassau 2.11 + DateTime::TimeZone::America::New_York 2.11 + DateTime::TimeZone::America::Nipigon 2.11 + DateTime::TimeZone::America::Nome 2.11 + DateTime::TimeZone::America::Noronha 2.11 + DateTime::TimeZone::America::North_Dakota::Beulah 2.11 + DateTime::TimeZone::America::North_Dakota::Center 2.11 + DateTime::TimeZone::America::North_Dakota::New_Salem 2.11 + DateTime::TimeZone::America::Ojinaga 2.11 + DateTime::TimeZone::America::Panama 2.11 + DateTime::TimeZone::America::Pangnirtung 2.11 + DateTime::TimeZone::America::Paramaribo 2.11 + DateTime::TimeZone::America::Phoenix 2.11 + DateTime::TimeZone::America::Port_au_Prince 2.11 + DateTime::TimeZone::America::Port_of_Spain 2.11 + DateTime::TimeZone::America::Porto_Velho 2.11 + DateTime::TimeZone::America::Puerto_Rico 2.11 + DateTime::TimeZone::America::Punta_Arenas 2.11 + DateTime::TimeZone::America::Rainy_River 2.11 + DateTime::TimeZone::America::Rankin_Inlet 2.11 + DateTime::TimeZone::America::Recife 2.11 + DateTime::TimeZone::America::Regina 2.11 + DateTime::TimeZone::America::Resolute 2.11 + DateTime::TimeZone::America::Rio_Branco 2.11 + DateTime::TimeZone::America::Santarem 2.11 + DateTime::TimeZone::America::Santiago 2.11 + DateTime::TimeZone::America::Santo_Domingo 2.11 + DateTime::TimeZone::America::Sao_Paulo 2.11 + DateTime::TimeZone::America::Scoresbysund 2.11 + DateTime::TimeZone::America::Sitka 2.11 + DateTime::TimeZone::America::St_Johns 2.11 + DateTime::TimeZone::America::Swift_Current 2.11 + DateTime::TimeZone::America::Tegucigalpa 2.11 + DateTime::TimeZone::America::Thule 2.11 + DateTime::TimeZone::America::Thunder_Bay 2.11 + DateTime::TimeZone::America::Tijuana 2.11 + DateTime::TimeZone::America::Toronto 2.11 + DateTime::TimeZone::America::Vancouver 2.11 + DateTime::TimeZone::America::Whitehorse 2.11 + DateTime::TimeZone::America::Winnipeg 2.11 + DateTime::TimeZone::America::Yakutat 2.11 + DateTime::TimeZone::America::Yellowknife 2.11 + DateTime::TimeZone::Antarctica::Casey 2.11 + DateTime::TimeZone::Antarctica::Davis 2.11 + DateTime::TimeZone::Antarctica::DumontDUrville 2.11 + DateTime::TimeZone::Antarctica::Macquarie 2.11 + DateTime::TimeZone::Antarctica::Mawson 2.11 + DateTime::TimeZone::Antarctica::Palmer 2.11 + DateTime::TimeZone::Antarctica::Rothera 2.11 + DateTime::TimeZone::Antarctica::Syowa 2.11 + DateTime::TimeZone::Antarctica::Troll 2.11 + DateTime::TimeZone::Antarctica::Vostok 2.11 + DateTime::TimeZone::Asia::Almaty 2.11 + DateTime::TimeZone::Asia::Amman 2.11 + DateTime::TimeZone::Asia::Anadyr 2.11 + DateTime::TimeZone::Asia::Aqtau 2.11 + DateTime::TimeZone::Asia::Aqtobe 2.11 + DateTime::TimeZone::Asia::Ashgabat 2.11 + DateTime::TimeZone::Asia::Atyrau 2.11 + DateTime::TimeZone::Asia::Baghdad 2.11 + DateTime::TimeZone::Asia::Baku 2.11 + DateTime::TimeZone::Asia::Bangkok 2.11 + DateTime::TimeZone::Asia::Barnaul 2.11 + DateTime::TimeZone::Asia::Beirut 2.11 + DateTime::TimeZone::Asia::Bishkek 2.11 + DateTime::TimeZone::Asia::Brunei 2.11 + DateTime::TimeZone::Asia::Chita 2.11 + DateTime::TimeZone::Asia::Choibalsan 2.11 + DateTime::TimeZone::Asia::Colombo 2.11 + DateTime::TimeZone::Asia::Damascus 2.11 + DateTime::TimeZone::Asia::Dhaka 2.11 + DateTime::TimeZone::Asia::Dili 2.11 + DateTime::TimeZone::Asia::Dubai 2.11 + DateTime::TimeZone::Asia::Dushanbe 2.11 + DateTime::TimeZone::Asia::Famagusta 2.11 + DateTime::TimeZone::Asia::Gaza 2.11 + DateTime::TimeZone::Asia::Hebron 2.11 + DateTime::TimeZone::Asia::Ho_Chi_Minh 2.11 + DateTime::TimeZone::Asia::Hong_Kong 2.11 + DateTime::TimeZone::Asia::Hovd 2.11 + DateTime::TimeZone::Asia::Irkutsk 2.11 + DateTime::TimeZone::Asia::Jakarta 2.11 + DateTime::TimeZone::Asia::Jayapura 2.11 + DateTime::TimeZone::Asia::Jerusalem 2.11 + DateTime::TimeZone::Asia::Kabul 2.11 + DateTime::TimeZone::Asia::Kamchatka 2.11 + DateTime::TimeZone::Asia::Karachi 2.11 + DateTime::TimeZone::Asia::Kathmandu 2.11 + DateTime::TimeZone::Asia::Khandyga 2.11 + DateTime::TimeZone::Asia::Kolkata 2.11 + DateTime::TimeZone::Asia::Krasnoyarsk 2.11 + DateTime::TimeZone::Asia::Kuala_Lumpur 2.11 + DateTime::TimeZone::Asia::Kuching 2.11 + DateTime::TimeZone::Asia::Macau 2.11 + DateTime::TimeZone::Asia::Magadan 2.11 + DateTime::TimeZone::Asia::Makassar 2.11 + DateTime::TimeZone::Asia::Manila 2.11 + DateTime::TimeZone::Asia::Nicosia 2.11 + DateTime::TimeZone::Asia::Novokuznetsk 2.11 + DateTime::TimeZone::Asia::Novosibirsk 2.11 + DateTime::TimeZone::Asia::Omsk 2.11 + DateTime::TimeZone::Asia::Oral 2.11 + DateTime::TimeZone::Asia::Pontianak 2.11 + DateTime::TimeZone::Asia::Pyongyang 2.11 + DateTime::TimeZone::Asia::Qatar 2.11 + DateTime::TimeZone::Asia::Qyzylorda 2.11 + DateTime::TimeZone::Asia::Riyadh 2.11 + DateTime::TimeZone::Asia::Sakhalin 2.11 + DateTime::TimeZone::Asia::Samarkand 2.11 + DateTime::TimeZone::Asia::Seoul 2.11 + DateTime::TimeZone::Asia::Shanghai 2.11 + DateTime::TimeZone::Asia::Singapore 2.11 + DateTime::TimeZone::Asia::Srednekolymsk 2.11 + DateTime::TimeZone::Asia::Taipei 2.11 + DateTime::TimeZone::Asia::Tashkent 2.11 + DateTime::TimeZone::Asia::Tbilisi 2.11 + DateTime::TimeZone::Asia::Tehran 2.11 + DateTime::TimeZone::Asia::Thimphu 2.11 + DateTime::TimeZone::Asia::Tokyo 2.11 + DateTime::TimeZone::Asia::Tomsk 2.11 + DateTime::TimeZone::Asia::Ulaanbaatar 2.11 + DateTime::TimeZone::Asia::Urumqi 2.11 + DateTime::TimeZone::Asia::Ust_Nera 2.11 + DateTime::TimeZone::Asia::Vladivostok 2.11 + DateTime::TimeZone::Asia::Yakutsk 2.11 + DateTime::TimeZone::Asia::Yangon 2.11 + DateTime::TimeZone::Asia::Yekaterinburg 2.11 + DateTime::TimeZone::Asia::Yerevan 2.11 + DateTime::TimeZone::Atlantic::Azores 2.11 + DateTime::TimeZone::Atlantic::Bermuda 2.11 + DateTime::TimeZone::Atlantic::Canary 2.11 + DateTime::TimeZone::Atlantic::Cape_Verde 2.11 + DateTime::TimeZone::Atlantic::Faroe 2.11 + DateTime::TimeZone::Atlantic::Madeira 2.11 + DateTime::TimeZone::Atlantic::Reykjavik 2.11 + DateTime::TimeZone::Atlantic::South_Georgia 2.11 + DateTime::TimeZone::Atlantic::Stanley 2.11 + DateTime::TimeZone::Australia::Adelaide 2.11 + DateTime::TimeZone::Australia::Brisbane 2.11 + DateTime::TimeZone::Australia::Broken_Hill 2.11 + DateTime::TimeZone::Australia::Currie 2.11 + DateTime::TimeZone::Australia::Darwin 2.11 + DateTime::TimeZone::Australia::Eucla 2.11 + DateTime::TimeZone::Australia::Hobart 2.11 + DateTime::TimeZone::Australia::Lindeman 2.11 + DateTime::TimeZone::Australia::Lord_Howe 2.11 + DateTime::TimeZone::Australia::Melbourne 2.11 + DateTime::TimeZone::Australia::Perth 2.11 + DateTime::TimeZone::Australia::Sydney 2.11 + DateTime::TimeZone::CET 2.11 + DateTime::TimeZone::CST6CDT 2.11 + DateTime::TimeZone::Catalog 2.11 + DateTime::TimeZone::EET 2.11 + DateTime::TimeZone::EST 2.11 + DateTime::TimeZone::EST5EDT 2.11 + DateTime::TimeZone::Europe::Amsterdam 2.11 + DateTime::TimeZone::Europe::Andorra 2.11 + DateTime::TimeZone::Europe::Astrakhan 2.11 + DateTime::TimeZone::Europe::Athens 2.11 + DateTime::TimeZone::Europe::Belgrade 2.11 + DateTime::TimeZone::Europe::Berlin 2.11 + DateTime::TimeZone::Europe::Brussels 2.11 + DateTime::TimeZone::Europe::Bucharest 2.11 + DateTime::TimeZone::Europe::Budapest 2.11 + DateTime::TimeZone::Europe::Chisinau 2.11 + DateTime::TimeZone::Europe::Copenhagen 2.11 + DateTime::TimeZone::Europe::Dublin 2.11 + DateTime::TimeZone::Europe::Gibraltar 2.11 + DateTime::TimeZone::Europe::Helsinki 2.11 + DateTime::TimeZone::Europe::Istanbul 2.11 + DateTime::TimeZone::Europe::Kaliningrad 2.11 + DateTime::TimeZone::Europe::Kiev 2.11 + DateTime::TimeZone::Europe::Kirov 2.11 + DateTime::TimeZone::Europe::Lisbon 2.11 + DateTime::TimeZone::Europe::London 2.11 + DateTime::TimeZone::Europe::Luxembourg 2.11 + DateTime::TimeZone::Europe::Madrid 2.11 + DateTime::TimeZone::Europe::Malta 2.11 + DateTime::TimeZone::Europe::Minsk 2.11 + DateTime::TimeZone::Europe::Monaco 2.11 + DateTime::TimeZone::Europe::Moscow 2.11 + DateTime::TimeZone::Europe::Oslo 2.11 + DateTime::TimeZone::Europe::Paris 2.11 + DateTime::TimeZone::Europe::Prague 2.11 + DateTime::TimeZone::Europe::Riga 2.11 + DateTime::TimeZone::Europe::Rome 2.11 + DateTime::TimeZone::Europe::Samara 2.11 + DateTime::TimeZone::Europe::Saratov 2.11 + DateTime::TimeZone::Europe::Simferopol 2.11 + DateTime::TimeZone::Europe::Sofia 2.11 + DateTime::TimeZone::Europe::Stockholm 2.11 + DateTime::TimeZone::Europe::Tallinn 2.11 + DateTime::TimeZone::Europe::Tirane 2.11 + DateTime::TimeZone::Europe::Ulyanovsk 2.11 + DateTime::TimeZone::Europe::Uzhgorod 2.11 + DateTime::TimeZone::Europe::Vienna 2.11 + DateTime::TimeZone::Europe::Vilnius 2.11 + DateTime::TimeZone::Europe::Volgograd 2.11 + DateTime::TimeZone::Europe::Warsaw 2.11 + DateTime::TimeZone::Europe::Zaporozhye 2.11 + DateTime::TimeZone::Europe::Zurich 2.11 + DateTime::TimeZone::Floating 2.11 + DateTime::TimeZone::HST 2.11 + DateTime::TimeZone::Indian::Chagos 2.11 + DateTime::TimeZone::Indian::Christmas 2.11 + DateTime::TimeZone::Indian::Cocos 2.11 + DateTime::TimeZone::Indian::Kerguelen 2.11 + DateTime::TimeZone::Indian::Mahe 2.11 + DateTime::TimeZone::Indian::Maldives 2.11 + DateTime::TimeZone::Indian::Mauritius 2.11 + DateTime::TimeZone::Indian::Reunion 2.11 + DateTime::TimeZone::Local 2.11 + DateTime::TimeZone::Local::Android 2.11 + DateTime::TimeZone::Local::Unix 2.11 + DateTime::TimeZone::Local::VMS 2.11 + DateTime::TimeZone::MET 2.11 + DateTime::TimeZone::MST 2.11 + DateTime::TimeZone::MST7MDT 2.11 + DateTime::TimeZone::OffsetOnly 2.11 + DateTime::TimeZone::OlsonDB 2.11 + DateTime::TimeZone::OlsonDB::Change 2.11 + DateTime::TimeZone::OlsonDB::Observance 2.11 + DateTime::TimeZone::OlsonDB::Rule 2.11 + DateTime::TimeZone::OlsonDB::Zone 2.11 + DateTime::TimeZone::PST8PDT 2.11 + DateTime::TimeZone::Pacific::Apia 2.11 + DateTime::TimeZone::Pacific::Auckland 2.11 + DateTime::TimeZone::Pacific::Bougainville 2.11 + DateTime::TimeZone::Pacific::Chatham 2.11 + DateTime::TimeZone::Pacific::Chuuk 2.11 + DateTime::TimeZone::Pacific::Easter 2.11 + DateTime::TimeZone::Pacific::Efate 2.11 + DateTime::TimeZone::Pacific::Enderbury 2.11 + DateTime::TimeZone::Pacific::Fakaofo 2.11 + DateTime::TimeZone::Pacific::Fiji 2.11 + DateTime::TimeZone::Pacific::Funafuti 2.11 + DateTime::TimeZone::Pacific::Galapagos 2.11 + DateTime::TimeZone::Pacific::Gambier 2.11 + DateTime::TimeZone::Pacific::Guadalcanal 2.11 + DateTime::TimeZone::Pacific::Guam 2.11 + DateTime::TimeZone::Pacific::Honolulu 2.11 + DateTime::TimeZone::Pacific::Kiritimati 2.11 + DateTime::TimeZone::Pacific::Kosrae 2.11 + DateTime::TimeZone::Pacific::Kwajalein 2.11 + DateTime::TimeZone::Pacific::Majuro 2.11 + DateTime::TimeZone::Pacific::Marquesas 2.11 + DateTime::TimeZone::Pacific::Nauru 2.11 + DateTime::TimeZone::Pacific::Niue 2.11 + DateTime::TimeZone::Pacific::Norfolk 2.11 + DateTime::TimeZone::Pacific::Noumea 2.11 + DateTime::TimeZone::Pacific::Pago_Pago 2.11 + DateTime::TimeZone::Pacific::Palau 2.11 + DateTime::TimeZone::Pacific::Pitcairn 2.11 + DateTime::TimeZone::Pacific::Pohnpei 2.11 + DateTime::TimeZone::Pacific::Port_Moresby 2.11 + DateTime::TimeZone::Pacific::Rarotonga 2.11 + DateTime::TimeZone::Pacific::Tahiti 2.11 + DateTime::TimeZone::Pacific::Tarawa 2.11 + DateTime::TimeZone::Pacific::Tongatapu 2.11 + DateTime::TimeZone::Pacific::Wake 2.11 + DateTime::TimeZone::Pacific::Wallis 2.11 + DateTime::TimeZone::UTC 2.11 + DateTime::TimeZone::WET 2.11 requirements: Class::Singleton 1.03 Cwd 3 @@ -1130,16 +722,42 @@ DISTRIBUTIONS File::Compare 0 File::Find 0 File::Spec 0 - List::AllUtils 0 - List::Util 0 + List::Util 1.33 Module::Runtime 0 - Params::Validate 0.72 + Params::ValidationCompiler 0.13 + Specio::Library::Builtins 0 + Specio::Library::String 0 Try::Tiny 0 constant 0 + namespace::autoclean 0 parent 0 + perl 5.008004 + strict 0 + warnings 0 + Devel-StackTrace-2.02 + pathname: D/DR/DROLSKY/Devel-StackTrace-2.02.tar.gz + provides: + Devel::StackTrace 2.02 + Devel::StackTrace::Frame 2.02 + requirements: + ExtUtils::MakeMaker 0 + File::Spec 0 + Scalar::Util 0 + overload 0 perl 5.006 strict 0 - vars 0 + warnings 0 + Dist-CheckConflicts-0.11 + pathname: D/DO/DOY/Dist-CheckConflicts-0.11.tar.gz + provides: + Dist::CheckConflicts 0.11 + requirements: + Carp 0 + Exporter 0 + ExtUtils::MakeMaker 6.30 + Module::Runtime 0.009 + base 0 + strict 0 warnings 0 EV-4.22 pathname: M/ML/MLEHMANN/EV-4.22.tar.gz @@ -1150,6 +768,34 @@ DISTRIBUTIONS Canary::Stability 0 ExtUtils::MakeMaker 6.52 common::sense 0 + Eval-Closure-0.14 + pathname: D/DO/DOY/Eval-Closure-0.14.tar.gz + provides: + Eval::Closure 0.14 + requirements: + Carp 0 + Exporter 0 + ExtUtils::MakeMaker 0 + Scalar::Util 0 + constant 0 + overload 0 + strict 0 + warnings 0 + Exception-Class-1.42 + pathname: D/DR/DROLSKY/Exception-Class-1.42.tar.gz + provides: + Exception::Class 1.42 + Exception::Class::Base 1.42 + requirements: + Class::Data::Inheritable 0.02 + Devel::StackTrace 2.00 + ExtUtils::MakeMaker 0 + Scalar::Util 0 + base 0 + overload 0 + perl 5.008001 + strict 0 + warnings 0 Exporter-Tiny-0.042 pathname: T/TO/TOBYINK/Exporter-Tiny-0.042.tar.gz provides: @@ -1158,6 +804,45 @@ DISTRIBUTIONS requirements: ExtUtils::MakeMaker 6.17 perl 5.006001 + ExtUtils-Config-0.008 + pathname: L/LE/LEONT/ExtUtils-Config-0.008.tar.gz + provides: + ExtUtils::Config 0.008 + requirements: + Data::Dumper 0 + ExtUtils::MakeMaker 6.30 + strict 0 + warnings 0 + ExtUtils-Helpers-0.026 + pathname: L/LE/LEONT/ExtUtils-Helpers-0.026.tar.gz + provides: + ExtUtils::Helpers 0.026 + ExtUtils::Helpers::Unix 0.026 + ExtUtils::Helpers::VMS 0.026 + ExtUtils::Helpers::Windows 0.026 + requirements: + Carp 0 + Exporter 5.57 + ExtUtils::MakeMaker 0 + File::Basename 0 + File::Copy 0 + File::Spec::Functions 0 + Text::ParseWords 3.24 + perl 5.006 + strict 0 + warnings 0 + ExtUtils-InstallPaths-0.011 + pathname: L/LE/LEONT/ExtUtils-InstallPaths-0.011.tar.gz + provides: + ExtUtils::InstallPaths 0.011 + requirements: + Carp 0 + ExtUtils::Config 0.002 + ExtUtils::MakeMaker 0 + File::Spec 0 + perl 5.006 + strict 0 + warnings 0 File-BaseDir-0.07 pathname: K/KI/KIMRYAN/File-BaseDir-0.07.tar.gz provides: @@ -1184,13 +869,13 @@ DISTRIBUTIONS File::Path 0 File::Spec 0 perl 5.008006 - File-MimeInfo-0.27 - pathname: M/MI/MICHIELB/File-MimeInfo-0.27.tar.gz + File-MimeInfo-0.28 + pathname: M/MI/MICHIELB/File-MimeInfo-0.28.tar.gz provides: - File::MimeInfo 0.27 - File::MimeInfo::Applications 0.27 - File::MimeInfo::Magic 0.27 - File::MimeInfo::Rox 0.27 + File::MimeInfo 0.28 + File::MimeInfo::Applications 0.28 + File::MimeInfo::Magic 0.28 + File::MimeInfo::Rox 0.28 requirements: Carp 0 Exporter 0 @@ -1210,6 +895,31 @@ DISTRIBUTIONS File::Spec 3.29 Test::More 0.42 perl 5.00503 + File-ShareDir-1.102 + pathname: R/RE/REHSACK/File-ShareDir-1.102.tar.gz + provides: + File::ShareDir 1.102 + requirements: + Carp 0 + Class::Inspector 1.12 + ExtUtils::MakeMaker 0 + File::ShareDir::Install 0.03 + File::Spec 0.80 + perl 5.008001 + warnings 0 + File-ShareDir-Install-0.11 + pathname: E/ET/ETHER/File-ShareDir-Install-0.11.tar.gz + provides: + File::ShareDir::Install 0.11 + requirements: + Carp 0 + Exporter 0 + File::Spec 0 + IO::Dir 0 + Module::Build::Tiny 0.034 + perl 5.008 + strict 0 + warnings 0 File-Which-1.21 pathname: P/PL/PLICEASE/File-Which-1.21.tar.gz provides: @@ -1217,10 +927,10 @@ DISTRIBUTIONS requirements: ExtUtils::MakeMaker 0 perl 5.006 - Filesys-DiskUsage-0.08 - pathname: S/SZ/SZABGAB/Filesys-DiskUsage-0.08.tar.gz + Filesys-DiskUsage-0.10 + pathname: M/MA/MANWAR/Filesys-DiskUsage-0.10.tar.gz provides: - Filesys::DiskUsage 0.08 + Filesys::DiskUsage 0.10 requirements: ExtUtils::MakeMaker 0 File::Basename 0 @@ -1228,6 +938,7 @@ DISTRIBUTIONS File::Temp 0 Test::More 0 Test::Warn 0 + perl 5.006 HTTP-Lite-2.44 pathname: N/NE/NEILB/HTTP-Lite-2.44.tar.gz provides: @@ -1247,17 +958,17 @@ DISTRIBUTIONS IO::Socket 0 Socket 1.97 Test::More 0.88 - IO-Socket-SSL-2.027 - pathname: S/SU/SULLR/IO-Socket-SSL-2.027.tar.gz + IO-Socket-SSL-2.048 + pathname: S/SU/SULLR/IO-Socket-SSL-2.048.tar.gz provides: - IO::Socket::SSL 2.027 + IO::Socket::SSL 2.048 IO::Socket::SSL::Intercept 2.014 - IO::Socket::SSL::OCSP_Cache 2.027 - IO::Socket::SSL::OCSP_Resolver 2.027 + IO::Socket::SSL::OCSP_Cache 2.048 + IO::Socket::SSL::OCSP_Resolver 2.048 IO::Socket::SSL::PublicSuffix undef - IO::Socket::SSL::SSL_Context 2.027 - IO::Socket::SSL::SSL_HANDLE 2.027 - IO::Socket::SSL::Session_Cache 2.027 + IO::Socket::SSL::SSL_Context 2.048 + IO::Socket::SSL::SSL_HANDLE 2.048 + IO::Socket::SSL::Session_Cache 2.048 IO::Socket::SSL::Utils 2.014 requirements: ExtUtils::MakeMaker 0 @@ -1302,78 +1013,82 @@ DISTRIBUTIONS re 0 strict 0 warnings 0 - Image-ExifTool-10.15 - pathname: E/EX/EXIFTOOL/Image-ExifTool-10.15.tar.gz + Image-ExifTool-10.50 + pathname: E/EX/EXIFTOOL/Image-ExifTool-10.50.tar.gz provides: File::RandomAccess 1.10 - Image::ExifTool 10.15 + Image::ExifTool 10.50 Image::ExifTool::AES 1.01 Image::ExifTool::AFCP 1.07 Image::ExifTool::AIFF 1.07 Image::ExifTool::APE 1.05 Image::ExifTool::APP12 1.13 Image::ExifTool::ASF 1.23 - Image::ExifTool::Apple 1.02 + Image::ExifTool::Apple 1.03 Image::ExifTool::Audible 1.02 - Image::ExifTool::BMP 1.08 + Image::ExifTool::BMP 1.09 + Image::ExifTool::BPG 1.00 Image::ExifTool::BZZ 1.00 Image::ExifTool::BigTIFF 1.06 - Image::ExifTool::BuildTagLookup 2.95 - Image::ExifTool::Canon 3.61 - Image::ExifTool::CanonCustom 1.53 + Image::ExifTool::BuildTagLookup 3.08 + Image::ExifTool::Canon 3.74 + Image::ExifTool::CanonCustom 1.54 Image::ExifTool::CanonRaw 1.58 Image::ExifTool::CanonVRD 1.28 Image::ExifTool::CaptureOne 1.04 - Image::ExifTool::Casio 1.37 - Image::ExifTool::Charset 1.09 + Image::ExifTool::Casio 1.38 + Image::ExifTool::Charset 1.10 Image::ExifTool::DICOM 1.19 + Image::ExifTool::DJI 1.00 Image::ExifTool::DNG 1.22 - Image::ExifTool::DPX 1.02 + Image::ExifTool::DPX 1.03 Image::ExifTool::DV 1.01 Image::ExifTool::DarwinCore 1.01 Image::ExifTool::DjVu 1.05 Image::ExifTool::EXE 1.13 - Image::ExifTool::Exif 3.79 + Image::ExifTool::Exif 3.91 Image::ExifTool::FLAC 1.07 - Image::ExifTool::FLIR 1.14 + Image::ExifTool::FLIF 1.02 + Image::ExifTool::FLIR 1.15 Image::ExifTool::Fixup 1.05 Image::ExifTool::Flash 1.12 - Image::ExifTool::FlashPix 1.26 + Image::ExifTool::FlashPix 1.29 Image::ExifTool::Font 1.08 Image::ExifTool::FotoStation 1.04 - Image::ExifTool::FujiFilm 1.53 + Image::ExifTool::FujiFilm 1.56 Image::ExifTool::GE 1.00 Image::ExifTool::GIF 1.12 Image::ExifTool::GIMP 1.02 - Image::ExifTool::GPS 1.44 + Image::ExifTool::GPS 1.46 Image::ExifTool::GeoTiff 1.11 - Image::ExifTool::Geotag 1.48 + Image::ExifTool::Geotag 1.51 Image::ExifTool::H264 1.14 Image::ExifTool::HP 1.04 Image::ExifTool::HTML 1.15 - Image::ExifTool::HtmlDump 1.33 + Image::ExifTool::HtmlDump 1.34 Image::ExifTool::ICC_Profile 1.30 Image::ExifTool::ID3 1.47 - Image::ExifTool::IPTC 1.53 + Image::ExifTool::IPTC 1.54 Image::ExifTool::ISO 1.01 Image::ExifTool::ITC 1.02 - Image::ExifTool::Import 1.05 + Image::ExifTool::Import 1.06 Image::ExifTool::InDesign 1.04 Image::ExifTool::JPEG 1.25 - Image::ExifTool::JPEGDigest 1.05 + Image::ExifTool::JPEGDigest 1.06 + Image::ExifTool::JSON 1.00 Image::ExifTool::JVC 1.03 - Image::ExifTool::Jpeg2000 1.25 + Image::ExifTool::Jpeg2000 1.26 Image::ExifTool::Kodak 1.41 Image::ExifTool::KyoceraRaw 1.03 Image::ExifTool::LNK 1.07 Image::ExifTool::Lang::cs 1.07 Image::ExifTool::Lang::de 1.30 - Image::ExifTool::Lang::en_ca 1.10 - Image::ExifTool::Lang::en_gb 1.11 + Image::ExifTool::Lang::en_ca 1.11 + Image::ExifTool::Lang::en_gb 1.12 Image::ExifTool::Lang::es 1.14 Image::ExifTool::Lang::fi 1.02 Image::ExifTool::Lang::fr 1.30 - Image::ExifTool::Lang::it 1.12 + Image::ExifTool::Lang::it 1.13 Image::ExifTool::Lang::ja 1.22 Image::ExifTool::Lang::ko 1.06 Image::ExifTool::Lang::nl 1.11 @@ -1383,76 +1098,80 @@ DISTRIBUTIONS Image::ExifTool::Lang::tr 1.04 Image::ExifTool::Lang::zh_cn 1.08 Image::ExifTool::Lang::zh_tw 1.06 - Image::ExifTool::Leaf 1.06 + Image::ExifTool::Leaf 1.07 Image::ExifTool::Lytro 1.02 - Image::ExifTool::M2TS 1.12 - Image::ExifTool::MIE 1.45 + Image::ExifTool::M2TS 1.13 + Image::ExifTool::MIE 1.46 Image::ExifTool::MIFF 1.07 Image::ExifTool::MNG 1.00 Image::ExifTool::MOI 1.02 Image::ExifTool::MPC 1.01 Image::ExifTool::MPEG 1.15 - Image::ExifTool::MPF 1.12 - Image::ExifTool::MWG 1.16 + Image::ExifTool::MPF 1.13 + Image::ExifTool::MWG 1.19 Image::ExifTool::MXF 1.08 - Image::ExifTool::MakerNotes 1.97 - Image::ExifTool::Matroska 1.07 - Image::ExifTool::Microsoft 1.17 - Image::ExifTool::Minolta 2.32 - Image::ExifTool::MinoltaRaw 1.14 + Image::ExifTool::MacOS 1.01 + Image::ExifTool::MakerNotes 1.99 + Image::ExifTool::Matroska 1.08 + Image::ExifTool::Microsoft 1.18 + Image::ExifTool::Minolta 2.48 + Image::ExifTool::MinoltaRaw 1.15 Image::ExifTool::Motorola 1.00 - Image::ExifTool::Nikon 3.17 + Image::ExifTool::Nikon 3.33 Image::ExifTool::NikonCapture 1.14 - Image::ExifTool::NikonCustom 1.12 + Image::ExifTool::NikonCustom 1.15 Image::ExifTool::Nintendo 1.00 Image::ExifTool::OOXML 1.07 - Image::ExifTool::Ogg 1.01 - Image::ExifTool::Olympus 2.40 + Image::ExifTool::Ogg 1.02 + Image::ExifTool::Olympus 2.48 Image::ExifTool::OpenEXR 1.02 - Image::ExifTool::PDF 1.41 + Image::ExifTool::Opus 1.00 + Image::ExifTool::PDF 1.43 Image::ExifTool::PGF 1.02 Image::ExifTool::PICT 1.05 - Image::ExifTool::PLIST 1.06 - Image::ExifTool::PNG 1.36 + Image::ExifTool::PLIST 1.07 + Image::ExifTool::PLUS 1.00 + Image::ExifTool::PNG 1.40 Image::ExifTool::PPM 1.08 Image::ExifTool::PSP 1.05 Image::ExifTool::Palm 1.00 - Image::ExifTool::Panasonic 1.91 - Image::ExifTool::PanasonicRaw 1.09 - Image::ExifTool::Pentax 3.02 - Image::ExifTool::PhaseOne 1.03 + Image::ExifTool::Panasonic 1.92 + Image::ExifTool::PanasonicRaw 1.10 + Image::ExifTool::Pentax 3.13 + Image::ExifTool::PhaseOne 1.04 Image::ExifTool::PhotoCD 1.01 - Image::ExifTool::PhotoMechanic 1.04 - Image::ExifTool::Photoshop 1.49 + Image::ExifTool::PhotoMechanic 1.05 + Image::ExifTool::Photoshop 1.54 Image::ExifTool::PostScript 1.41 Image::ExifTool::PrintIM 1.07 Image::ExifTool::Qualcomm 1.01 - Image::ExifTool::QuickTime 1.96 - Image::ExifTool::RIFF 1.41 + Image::ExifTool::QuickTime 2.02 + Image::ExifTool::RIFF 1.42 Image::ExifTool::RSRC 1.08 Image::ExifTool::RTF 1.02 Image::ExifTool::Radiance 1.01 Image::ExifTool::Rawzor 1.04 Image::ExifTool::Real 1.06 Image::ExifTool::Reconyx 1.04 - Image::ExifTool::Ricoh 1.31 - Image::ExifTool::Samsung 1.32 + Image::ExifTool::Ricoh 1.32 + Image::ExifTool::Samsung 1.38 Image::ExifTool::Sanyo 1.16 Image::ExifTool::Scalado 1.01 Image::ExifTool::Shortcuts 1.57 - Image::ExifTool::Sigma 1.17 - Image::ExifTool::SigmaRaw 1.24 - Image::ExifTool::Sony 2.34 - Image::ExifTool::SonyIDC 1.05 + Image::ExifTool::Sigma 1.23 + Image::ExifTool::SigmaRaw 1.25 + Image::ExifTool::Sony 2.58 + Image::ExifTool::SonyIDC 1.06 Image::ExifTool::Stim 1.01 - Image::ExifTool::TagInfoXML 1.28 - Image::ExifTool::TagLookup 1.13 + Image::ExifTool::TagInfoXML 1.29 + Image::ExifTool::TagLookup 1.16 Image::ExifTool::Theora 1.00 Image::ExifTool::Torrent 1.03 Image::ExifTool::Unknown 1.13 Image::ExifTool::VCard 1.04 + Image::ExifTool::Validate 1.02 Image::ExifTool::Vorbis 1.08 - Image::ExifTool::XMP 2.91 + Image::ExifTool::XMP 3.02 Image::ExifTool::ZIP 1.18 Image::ExifTool::iWork 1.04 requirements: @@ -1478,23 +1197,14 @@ DISTRIBUTIONS base 0 strict 0 warnings 0 - List-MoreUtils-0.415 - pathname: R/RE/REHSACK/List-MoreUtils-0.415.tar.gz + List-MoreUtils-0.419 + pathname: R/RE/REHSACK/List-MoreUtils-0.419.tar.gz provides: - List::MoreUtils 0.415 - List::MoreUtils::PP 0.415 - List::MoreUtils::XS 0.415 + List::MoreUtils 0.419 + List::MoreUtils::PP 0.419 requirements: - Carp 0 Exporter::Tiny 0.038 ExtUtils::MakeMaker 0 - File::Basename 0 - File::Copy 0 - File::Path 0 - File::Spec 0 - IPC::Cmd 0 - XSLoader 0 - base 0 Locale-Maketext-Lexicon-1.00 pathname: D/DR/DRTECH/Locale-Maketext-Lexicon-1.00.tar.gz provides: @@ -1523,6 +1233,13 @@ DISTRIBUTIONS requirements: ExtUtils::MakeMaker 6.30 Locale::Maketext 1.17 + MRO-Compat-0.13 + pathname: H/HA/HAARG/MRO-Compat-0.13.tar.gz + provides: + MRO::Compat 0.13 + requirements: + ExtUtils::MakeMaker 0 + perl 5.006 Module-Build-0.4205 pathname: L/LE/LEONT/Module-Build-0.4205.tar.gz provides: @@ -1578,6 +1295,31 @@ DISTRIBUTIONS Text::ParseWords 0 perl 5.006001 version 0.87 + Module-Build-Tiny-0.039 + pathname: L/LE/LEONT/Module-Build-Tiny-0.039.tar.gz + provides: + Module::Build::Tiny 0.039 + requirements: + CPAN::Meta 0 + DynaLoader 0 + Exporter 5.57 + ExtUtils::CBuilder 0 + ExtUtils::Config 0.003 + ExtUtils::Helpers 0.020 + ExtUtils::Install 0 + ExtUtils::InstallPaths 0.002 + ExtUtils::ParseXS 0 + File::Basename 0 + File::Find 0 + File::Path 0 + File::Spec::Functions 0 + Getopt::Long 2.36 + JSON::PP 2 + Pod::Man 0 + TAP::Harness::Env 0 + perl 5.006 + strict 0 + warnings 0 Module-Implementation-0.07 pathname: D/DR/DROLSKY/Module-Implementation-0.07.tar.gz provides: @@ -1599,8 +1341,8 @@ DISTRIBUTIONS perl 5.006 strict 0 warnings 0 - Mojolicious-6.63 - pathname: S/SR/SRI/Mojolicious-6.63.tar.gz + Mojolicious-7.31 + pathname: S/SR/SRI/Mojolicious-7.31.tar.gz provides: Mojo undef Mojo::Asset undef @@ -1622,6 +1364,7 @@ DISTRIBUTIONS Mojo::Date undef Mojo::EventEmitter undef Mojo::Exception undef + Mojo::File undef Mojo::Headers undef Mojo::HelloWorld undef Mojo::Home undef @@ -1630,6 +1373,8 @@ DISTRIBUTIONS Mojo::IOLoop::Delay undef Mojo::IOLoop::Server undef Mojo::IOLoop::Stream undef + Mojo::IOLoop::Subprocess undef + Mojo::IOLoop::TLS undef Mojo::JSON undef Mojo::JSON::Pointer undef Mojo::Loader undef @@ -1647,6 +1392,8 @@ DISTRIBUTIONS Mojo::Server::Daemon undef Mojo::Server::Hypnotoad undef Mojo::Server::Morbo undef + Mojo::Server::Morbo::Backend undef + Mojo::Server::Morbo::Backend::Poll undef Mojo::Server::PSGI undef Mojo::Server::PSGI::_IO undef Mojo::Server::Prefork undef @@ -1663,7 +1410,7 @@ DISTRIBUTIONS Mojo::UserAgent::Transactor undef Mojo::Util undef Mojo::WebSocket undef - Mojolicious 6.63 + Mojolicious 7.31 Mojolicious::Command undef Mojolicious::Command::cgi undef Mojolicious::Command::cpanify undef @@ -1685,7 +1432,6 @@ DISTRIBUTIONS Mojolicious::Controller undef Mojolicious::Lite undef Mojolicious::Plugin undef - Mojolicious::Plugin::Charset undef Mojolicious::Plugin::Config undef Mojolicious::Plugin::Config::Sandbox undef Mojolicious::Plugin::DefaultHelpers undef @@ -1715,21 +1461,17 @@ DISTRIBUTIONS JSON::PP 2.27103 Pod::Simple 3.09 Time::Local 1.2 - Mojolicious-Plugin-AssetPack-1.13 - pathname: J/JH/JHTHORSEN/Mojolicious-Plugin-AssetPack-1.13.tar.gz + Mojolicious-Plugin-AssetPack-1.44 + pathname: J/JH/JHTHORSEN/Mojolicious-Plugin-AssetPack-1.44.tar.gz provides: - Mojolicious::Plugin::AssetPack 1.13 + Mojolicious::Plugin::AssetPack 1.44 Mojolicious::Plugin::AssetPack::Asset undef Mojolicious::Plugin::AssetPack::Asset::Null undef - Mojolicious::Plugin::AssetPack::Backcompat undef - Mojolicious::Plugin::AssetPack::Backcompat::Asset undef - Mojolicious::Plugin::AssetPack::Handler::Http undef - Mojolicious::Plugin::AssetPack::Handler::Https undef - Mojolicious::Plugin::AssetPack::Handler::Sprites undef Mojolicious::Plugin::AssetPack::Pipe undef Mojolicious::Plugin::AssetPack::Pipe::CoffeeScript undef Mojolicious::Plugin::AssetPack::Pipe::Combine undef Mojolicious::Plugin::AssetPack::Pipe::Css undef + Mojolicious::Plugin::AssetPack::Pipe::Favicon undef Mojolicious::Plugin::AssetPack::Pipe::Fetch undef Mojolicious::Plugin::AssetPack::Pipe::JavaScript undef Mojolicious::Plugin::AssetPack::Pipe::Jpeg undef @@ -1738,17 +1480,8 @@ DISTRIBUTIONS Mojolicious::Plugin::AssetPack::Pipe::Reloader undef Mojolicious::Plugin::AssetPack::Pipe::Riotjs undef Mojolicious::Plugin::AssetPack::Pipe::Sass undef - Mojolicious::Plugin::AssetPack::Preprocessor undef - Mojolicious::Plugin::AssetPack::Preprocessor::CoffeeScript undef - Mojolicious::Plugin::AssetPack::Preprocessor::Css undef - Mojolicious::Plugin::AssetPack::Preprocessor::Fallback undef - Mojolicious::Plugin::AssetPack::Preprocessor::JavaScript undef - Mojolicious::Plugin::AssetPack::Preprocessor::Jsx undef - Mojolicious::Plugin::AssetPack::Preprocessor::Less undef - Mojolicious::Plugin::AssetPack::Preprocessor::Sass undef - Mojolicious::Plugin::AssetPack::Preprocessor::Scss undef - Mojolicious::Plugin::AssetPack::Preprocessors 0.01 - Mojolicious::Plugin::AssetPack::Preprocessors::CWD 0.01 + Mojolicious::Plugin::AssetPack::Pipe::TypeScript undef + Mojolicious::Plugin::AssetPack::Pipe::Vuejs undef Mojolicious::Plugin::AssetPack::Store undef Mojolicious::Plugin::AssetPack::Util undef Mojolicious::Plugin::AssetPack::Util::_chdir undef @@ -1756,7 +1489,7 @@ DISTRIBUTIONS ExtUtils::MakeMaker 0 File::Which 1.21 IPC::Run3 0.048 - Mojolicious 6.50 + Mojolicious 7.17 Test::More 0.88 Mojolicious-Plugin-DebugDumperHelper-0.03 pathname: L/LD/LDIDRY/Mojolicious-Plugin-DebugDumperHelper-0.03.tar.gz @@ -1775,10 +1508,10 @@ DISTRIBUTIONS Mojolicious 5 Test::More 0 perl 5.010001 - Net-Domain-TLD-1.74 - pathname: A/AL/ALEXP/Net-Domain-TLD-1.74.tar.gz + Net-Domain-TLD-1.75 + pathname: A/AL/ALEXP/Net-Domain-TLD-1.75.tar.gz provides: - Net::Domain::TLD 1.74 + Net::Domain::TLD 1.75 requirements: Carp 0 ExtUtils::MakeMaker 0 @@ -1822,6 +1555,36 @@ DISTRIBUTIONS Test::More 0.47 Test::Script 1.06 perl 5.006 + Package-Stash-0.37 + pathname: D/DO/DOY/Package-Stash-0.37.tar.gz + provides: + Package::Stash 0.37 + Package::Stash::PP 0.37 + requirements: + B 0 + Carp 0 + Config 0 + Dist::CheckConflicts 0.02 + ExtUtils::MakeMaker 0 + File::Spec 0 + Getopt::Long 0 + Module::Implementation 0.06 + Package::Stash::XS 0.26 + Scalar::Util 0 + Symbol 0 + Text::ParseWords 0 + constant 0 + strict 0 + warnings 0 + Package-Stash-XS-0.28 + pathname: D/DO/DOY/Package-Stash-XS-0.28.tar.gz + provides: + Package::Stash::XS 0.28 + requirements: + ExtUtils::MakeMaker 6.30 + XSLoader 0 + strict 0 + warnings 0 Params-Classify-0.013 pathname: Z/ZE/ZEFRAM/Params-Classify-0.013.tar.gz provides: @@ -1869,6 +1632,24 @@ DISTRIBUTIONS strict 0 vars 0 warnings 0 + Params-ValidationCompiler-0.24 + pathname: D/DR/DROLSKY/Params-ValidationCompiler-0.24.tar.gz + provides: + Params::ValidationCompiler 0.24 + Params::ValidationCompiler::Compiler 0.24 + Params::ValidationCompiler::Exceptions 0.24 + requirements: + B 0 + Carp 0 + Eval::Closure 0 + Exception::Class 0 + Exporter 0 + ExtUtils::MakeMaker 0 + List::Util 1.29 + Scalar::Util 0 + overload 0 + strict 0 + warnings 0 Probe-Perl-0.03 pathname: K/KW/KWILLIAMS/Probe-Perl-0.03.tar.gz provides: @@ -1878,6 +1659,14 @@ DISTRIBUTIONS ExtUtils::MakeMaker 6.30 File::Spec 0 strict 0 + Role-Tiny-2.000005 + pathname: H/HA/HAARG/Role-Tiny-2.000005.tar.gz + provides: + Role::Tiny 2.000005 + Role::Tiny::With 2.000005 + requirements: + Exporter 5.57 + perl 5.006 SUPER-1.20141117 pathname: C/CH/CHROMATIC/SUPER-1.20141117.tar.gz provides: @@ -1887,6 +1676,90 @@ DISTRIBUTIONS Sub::Identify 0.03 Test::Simple 0.61 perl v5.6.2 + Scalar-List-Utils-1.47 + pathname: P/PE/PEVANS/Scalar-List-Utils-1.47.tar.gz + provides: + List::Util 1.47 + List::Util::XS 1.47 + Scalar::Util 1.47 + Sub::Util 1.47 + requirements: + ExtUtils::MakeMaker 0 + Test::More 0 + perl 5.006 + Specio-0.37 + pathname: D/DR/DROLSKY/Specio-0.37.tar.gz + provides: + Specio 0.37 + Specio::Coercion 0.37 + Specio::Constraint::AnyCan 0.37 + Specio::Constraint::AnyDoes 0.37 + Specio::Constraint::AnyIsa 0.37 + Specio::Constraint::Enum 0.37 + Specio::Constraint::Intersection 0.37 + Specio::Constraint::ObjectCan 0.37 + Specio::Constraint::ObjectDoes 0.37 + Specio::Constraint::ObjectIsa 0.37 + Specio::Constraint::Parameterizable 0.37 + Specio::Constraint::Parameterized 0.37 + Specio::Constraint::Role::CanType 0.37 + Specio::Constraint::Role::DoesType 0.37 + Specio::Constraint::Role::Interface 0.37 + Specio::Constraint::Role::IsaType 0.37 + Specio::Constraint::Simple 0.37 + Specio::Constraint::Structurable 0.37 + Specio::Constraint::Structured 0.37 + Specio::Constraint::Union 0.37 + Specio::Declare 0.37 + Specio::DeclaredAt 0.37 + Specio::Exception 0.37 + Specio::Exporter 0.37 + Specio::Helpers 0.37 + Specio::Library::Builtins 0.37 + Specio::Library::Numeric 0.37 + Specio::Library::Perl 0.37 + Specio::Library::String 0.37 + Specio::Library::Structured 0.37 + Specio::Library::Structured::Dict 0.37 + Specio::Library::Structured::Map 0.37 + Specio::Library::Structured::Tuple 0.37 + Specio::OO 0.37 + Specio::PartialDump 0.37 + Specio::Registry 0.37 + Specio::Role::Inlinable 0.37 + Specio::Subs 0.37 + Specio::TypeChecks 0.37 + Test::Specio 0.37 + requirements: + B 0 + Carp 0 + Devel::StackTrace 0 + Eval::Closure 0 + Exporter 0 + ExtUtils::MakeMaker 0 + IO::File 0 + List::Util 1.33 + MRO::Compat 0 + Module::Runtime 0 + Role::Tiny 1.003003 + Role::Tiny::With 0 + Scalar::Util 0 + Storable 0 + Test::Fatal 0 + Test::More 0.96 + overload 0 + parent 0 + perl 5.008 + re 0 + strict 0 + version 0.83 + warnings 0 + Sub-Exporter-Progressive-0.001013 + pathname: F/FR/FREW/Sub-Exporter-Progressive-0.001013.tar.gz + provides: + Sub::Exporter::Progressive 0.001013 + requirements: + ExtUtils::MakeMaker 0 Sub-Identify-0.12 pathname: R/RG/RGARCIA/Sub-Identify-0.12.tar.gz provides: @@ -1918,6 +1791,18 @@ DISTRIBUTIONS Text::Balanced 2 if 0 perl 5.005 + Test-Fatal-0.014 + pathname: R/RJ/RJBS/Test-Fatal-0.014.tar.gz + provides: + Test::Fatal 0.014 + requirements: + Carp 0 + Exporter 5.57 + ExtUtils::MakeMaker 0 + Test::Builder 0 + Try::Tiny 0.07 + strict 0 + warnings 0 Test-MockModule-0.11 pathname: G/GF/GFRANKS/Test-MockModule-0.11.tar.gz provides: @@ -1956,10 +1841,10 @@ DISTRIBUTIONS Test::Builder::Tester 1.02 Test::More 0 perl 5.006 - Text-Unidecode-1.27 - pathname: S/SB/SBURKE/Text-Unidecode-1.27.tar.gz + Text-Unidecode-1.30 + pathname: S/SB/SBURKE/Text-Unidecode-1.30.tar.gz provides: - Text::Unidecode 1.27 + Text::Unidecode 1.30 requirements: ExtUtils::MakeMaker 0 perl 5.008 @@ -1974,9 +1859,50 @@ DISTRIBUTIONS constant 0 strict 0 warnings 0 + Variable-Magic-0.61 + pathname: V/VP/VPIT/Variable-Magic-0.61.tar.gz + provides: + Variable::Magic 0.61 + requirements: + Carp 0 + Config 0 + Exporter 0 + ExtUtils::MakeMaker 0 + IO::Handle 0 + IO::Select 0 + IPC::Open3 0 + POSIX 0 + Socket 0 + Test::More 0 + XSLoader 0 + base 0 + lib 0 + perl 5.008 common-sense-3.73 pathname: M/ML/MLEHMANN/common-sense-3.73.tar.gz provides: common::sense 3.73 requirements: ExtUtils::MakeMaker 0 + namespace-autoclean-0.28 + pathname: E/ET/ETHER/namespace-autoclean-0.28.tar.gz + provides: + namespace::autoclean 0.28 + requirements: + B::Hooks::EndOfScope 0.12 + ExtUtils::MakeMaker 0 + List::Util 0 + Sub::Identify 0 + namespace::clean 0.20 + perl 5.006 + strict 0 + warnings 0 + namespace-clean-0.27 + pathname: R/RI/RIBASUSHI/namespace-clean-0.27.tar.gz + provides: + namespace::clean 0.27 + requirements: + B::Hooks::EndOfScope 0.12 + ExtUtils::MakeMaker 0 + Package::Stash 0.23 + perl 5.008001 diff --git a/lib/Lutim.pm b/lib/Lutim.pm index 53f2fa8..854e272 100644 --- a/lib/Lutim.pm +++ b/lib/Lutim.pm @@ -1,7 +1,7 @@ package Lutim; use Mojo::Base 'Mojolicious'; use Mojo::Util qw(quote); -use LutimModel; +use Lutim::DB::Image; use Crypt::CBC; use Data::Entropy qw(entropy_source); @@ -42,6 +42,7 @@ sub startup { crypto_key_length => 8, thumbnail_size => 100, theme => 'default', + dbtype => 'sqlite', } }); @@ -143,24 +144,23 @@ sub startup { my $c = shift; # Create some short patterns for provisioning - if (LutimModel::Lutim->count('WHERE path IS NULL') < $c->config->{provisioning}) { + my $img = Lutim::DB::Image->new(app => $c->app); + if ($img->count_empty < $c->config->{provisioning}) { for (my $i = 0; $i < $c->config->{provis_step}; $i++) { - if (LutimModel->begin) { - my $short; - do { - $short= $c->shortener($c->config->{length}); - } while (LutimModel::Lutim->count('WHERE short = ?', $short) || $short eq 'about' || $short eq 'stats' || $short eq 'd' || $short eq 'm' || $short eq 'gallery' || $short eq 'zip' || $short eq 'infos'); + my $short; + do { + $short = $c->shortener($c->config->{length}); + } while ($img->count_short($short) || $short eq 'about' || $short eq 'stats' || $short eq 'd' || $short eq 'm' || $short eq 'gallery' || $short eq 'zip' || $short eq 'infos'); - LutimModel::Lutim->create( - short => $short, - counter => 0, - enabled => 1, - delete_at_first_view => 0, - delete_at_day => 0, - mod_token => $c->shortener($c->config->{token_length}) - ); - LutimModel->commit; - } + $img->short($short) + ->counter(0) + ->enabled(1) + ->delete_at_first_view(0) + ->delete_at_day(0) + ->mod_token($c->shortener($c->config->{token_length})) + ->write; + + $img = Lutim::DB::Image->new(app => $c->app); } } } @@ -285,10 +285,10 @@ sub startup { $self->helper( delete_image => sub { - my $c = shift; - my $image = shift; - unlink $image->path(); - $image->update(enabled => 0); + my $c = shift; + my $img = shift; + unlink $img->path or warn "Could not unlink ".$img->path.": $!"; + $img->disable(); } ); diff --git a/lib/Lutim/Command/cron/cleanbdd.pm b/lib/Lutim/Command/cron/cleanbdd.pm index 4257755..c1c5f28 100644 --- a/lib/Lutim/Command/cron/cleanbdd.pm +++ b/lib/Lutim/Command/cron/cleanbdd.pm @@ -1,7 +1,6 @@ package Lutim::Command::cron::cleanbdd; use Mojo::Base 'Mojolicious::Command'; -use LutimModel; -use Mojo::Util qw(slurp decode); +use Lutim::DB::Image; use FindBin qw($Bin); use File::Spec qw(catfile); @@ -15,16 +14,15 @@ sub run { file => File::Spec->catfile($Bin, '..' ,'lutim.conf'), default => { keep_ip_during => 365, + dbtype => 'sqlite', } }); my $separation = time() - $config->{keep_ip_during} * 86400; - LutimModel->do( - 'UPDATE lutim SET created_by = "" WHERE path IS NOT NULL AND created_at < ?', - {}, - $separation - ); + my $dbi = Lutim::DB::Image->new(app => $c->app); + + $dbi->clean_ips_until($separation); } =encoding utf8 diff --git a/lib/Lutim/Command/cron/cleanfiles.pm b/lib/Lutim/Command/cron/cleanfiles.pm index 008ece6..a2e7d76 100644 --- a/lib/Lutim/Command/cron/cleanfiles.pm +++ b/lib/Lutim/Command/cron/cleanfiles.pm @@ -1,8 +1,8 @@ package Lutim::Command::cron::cleanfiles; use Mojo::Base 'Mojolicious::Command'; -use LutimModel; -use Lutim; use Mojo::Util qw(slurp decode); +use Lutim::DB::Image; +use Lutim; use FindBin qw($Bin); use File::Spec qw(catfile); @@ -11,26 +11,33 @@ has usage => sub { shift->extract_usage }; sub run { my $c = shift; - my $l = Lutim->new; - - my $time = time(); - my @images = LutimModel::Lutim->select('WHERE enabled = 1 AND (delete_at_day * 86400) < (? - created_at) AND delete_at_day != 0', $time); - - for my $image (@images) { - $l->app->delete_image($image); - } my $config = $c->app->plugin('Config', { - file => File::Spec->catfile($Bin, '..' ,'lutim.conf'), + file => File::Spec->catfile($Bin, '..' ,'lutim.conf'), + default => { + dbtype => 'sqlite', + } }); - if (defined($config->{delete_no_longer_viewed_files}) && $config->{delete_no_longer_viewed_files} > 0) { - $time = time() - $config->{delete_no_longer_viewed_files} * 86400; - @images = LutimModel::Lutim->select('WHERE enabled = 1 AND last_access_at < ?', $time); + my $l = Lutim->new; - for my $image (@images) { - $l->app->delete_image($image); + my $dbi = Lutim::DB::Image->new(app => $c->app); + + $dbi->get_images_to_clean()->each( + sub { + my ($img, $num) = @_; + $l->app->delete_image($img); } + ); + + if (defined($config->{delete_no_longer_viewed_files}) && $config->{delete_no_longer_viewed_files} > 0) { + my $time = time() - $config->{delete_no_longer_viewed_files} * 86400; + $dbi->get_no_longer_viewed_files($time)->each( + sub { + my ($img, $num) = @_; + $l->app->delete_image($img); + } + ); } } diff --git a/lib/Lutim/Command/cron/stats.pm b/lib/Lutim/Command/cron/stats.pm index c82d6fa..08c79b5 100644 --- a/lib/Lutim/Command/cron/stats.pm +++ b/lib/Lutim/Command/cron/stats.pm @@ -1,8 +1,9 @@ package Lutim::Command::cron::stats; use Mojo::Base 'Mojolicious::Command'; -use LutimModel; +use Lutim::DB::Image; use Mojo::DOM; -use Mojo::Util qw(slurp spurt encode); +use Mojo::Util qw(encode); +use Mojo::File; use DateTime; use FindBin qw($Bin); use File::Spec qw(catfile); @@ -17,7 +18,8 @@ sub run { file => File::Spec->catfile($Bin, '..' ,'lutim.conf'), theme => 'default', default => { - stats_day_num => 365 + stats_day_num => 365, + dbtype => 'sqlite' } }); @@ -26,7 +28,7 @@ sub run { $config->{theme} = 'default'; $template = 'themes/'.$config->{theme}.'/templates/data.html.ep.template'; } - my $text = slurp($template); + my $text = Mojo::File->new($template)->slurp; my $dom = Mojo::DOM->new($text); my $thead_tr = $dom->at('table thead tr'); my $tbody_tr = $dom->at('table tbody tr'); @@ -35,18 +37,22 @@ sub run { my $separation = time() - $config->{stats_day_num} * 86400; my %data; - for my $img (LutimModel::Lutim->select('WHERE path IS NOT NULL AND created_at >= ?', $separation)) { - my $time = DateTime->from_epoch(epoch => $img->created_at); - my ($year, $month, $day) = ($time->year(), $time->month(), $time->day()); + my $img = Lutim::DB::Image->new(app => $c->app); + $img->select_created_after($separation)->each( + sub { + my ($e, $num) = @_; + my $time = DateTime->from_epoch(epoch => $e->created_at); + my ($year, $month, $day) = ($time->year(), $time->month(), $time->day()); - if (defined($data{$year}->{$month}->{$day})) { - $data{$year}->{$month}->{$day} += 1; - } else { - $data{$year}->{$month}->{$day} = 1; + if (defined($data{$year}->{$month}->{$day})) { + $data{$year}->{$month}->{$day} += 1; + } else { + $data{$year}->{$month}->{$day} = 1; + } } - } + ); - my $total = LutimModel::Lutim->count('WHERE path IS NOT NULL AND created_at < ?', $separation); + my $total = $img->count_created_before($separation); for my $year (sort {$a <=> $b} keys %data) { for my $month (sort {$a <=> $b} keys %{$data{$year}}) { for my $day (sort {$a <=> $b} keys %{$data{$year}->{$month}}) { @@ -64,27 +70,29 @@ sub run { $config->{theme} = 'default'; $template = 'themes/'.$config->{theme}.'/templates/raw.html.ep.template'; } - my $text2 = slurp($template2); + my $text2 = Mojo::File->new($template2)->slurp; my $dom2 = Mojo::DOM->new($text2); my $raw = $dom2->at('table tbody'); my $raw_foot = $dom2->at('table tfoot'); - my $unlimited_enabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 0 AND enabled = 1'); - my $unlimited_disabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 0 AND enabled = 0'); - my $day_enabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 1 AND enabled = 1'); - my $day_disabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 1 AND enabled = 0'); - my $week_enabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 7 AND enabled = 1'); - my $week_disabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 7 AND enabled = 0'); - my $month_enabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 30 AND enabled = 1'); - my $month_disabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 30 AND enabled = 0'); - my $year_enabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 365 AND enabled = 1'); - my $year_disabled = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 365 AND enabled = 0'); - my $year_disabled_in_month = LutimModel::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = 365 AND enabled = 0 AND created_at < ?', time - 30 * 86400); + my $unlimited_enabled = $img->count_delete_at_day_endis(0, 1); + my $unlimited_disabled = $img->count_delete_at_day_endis(0, 0); + my $day_enabled = $img->count_delete_at_day_endis(1, 1); + my $day_disabled = $img->count_delete_at_day_endis(1, 0); + my $week_enabled = $img->count_delete_at_day_endis(7, 1); + my $week_disabled = $img->count_delete_at_day_endis(7, 0); + my $month_enabled = $img->count_delete_at_day_endis(30, 1); + my $month_disabled = $img->count_delete_at_day_endis(30, 0); + my $year_enabled = $img->count_delete_at_day_endis(365, 1); + my $year_disabled = $img->count_delete_at_day_endis(365, 0); + my $year_disabled_in_month = $img->count_delete_at_day_endis(365, 1, time - 335 * 86400); + + my $year_disabled_in_month_pct = ($year_enabled != 0) ? " (".sprintf('%.2f', $year_disabled_in_month/$year_enabled)."%)" : ''; $raw->append_content("\n<%= \$raw[4] %>".$unlimited_enabled."".$unlimited_disabled."ΓΈ\n"); $raw->append_content("<%= \$raw[5] %>".$day_enabled."".$day_disabled."".$day_enabled." (100%)\n"); $raw->append_content("<%= \$raw[6] %>".$week_enabled."".$week_disabled."".$week_enabled." (100%)\n"); $raw->append_content("<%= \$raw[7] %>".$month_enabled."".$month_disabled."".$month_enabled." (100%)\n"); - $raw->append_content("<%= \$raw[8] %>".$year_enabled."".$year_disabled."".$year_disabled_in_month." (".sprintf('%.2f', $year_disabled_in_month/$year_enabled)."%)\n"); + $raw->append_content("<%= \$raw[8] %>".$year_enabled."".$year_disabled."".$year_disabled_in_month.$year_disabled_in_month_pct."\n"); $raw_foot->append_content("\n<%= \$raw[9] %>".($unlimited_enabled + $day_enabled + $week_enabled + $month_enabled + $year_enabled)."".($unlimited_disabled + $day_disabled + $week_disabled + $month_disabled + $year_disabled)."".($day_enabled + $week_enabled + $month_enabled + $year_disabled_in_month)."\n"); @@ -140,8 +148,8 @@ Morris.Donut({ $dom2 EOF - spurt $dom, 'themes/'.$config->{theme}.'/templates/data.html.ep'; - spurt encode('UTF-8', $dom2), 'themes/'.$config->{theme}.'/templates/raw.html.ep'; + Mojo::File->new('themes/'.$config->{theme}.'/templates/data.html.ep')->spurt($dom); + Mojo::File->new('themes/'.$config->{theme}.'/templates/raw.html.ep')->spurt(encode('UTF-8', $dom2)); } =encoding utf8 diff --git a/lib/Lutim/Command/cron/watch.pm b/lib/Lutim/Command/cron/watch.pm index 7ae7cad..1e0f1a7 100644 --- a/lib/Lutim/Command/cron/watch.pm +++ b/lib/Lutim/Command/cron/watch.pm @@ -1,8 +1,10 @@ +# vim:set sw=4 ts=4 sts=4 ft=perl expandtab: package Lutim::Command::cron::watch; use Mojo::Base 'Mojolicious::Command'; use Mojo::Util qw(slurp decode); use Filesys::DiskUsage qw/du/; -use LutimModel; +use Lutim::DB::Image; +use Lutim; use Switch; use FindBin qw($Bin); use File::Spec qw(catfile); @@ -16,7 +18,8 @@ sub run { my $config = $c->app->plugin('Config', { file => File::Spec->catfile($Bin, '..' ,'lutim.conf'), default => { - policy_when_full => 'warn' + policy_when_full => 'warn', + dbtype => 'sqlite', } }); @@ -36,11 +39,15 @@ sub run { } case 'delete' { say '[Lutim cron job watch] Older files are being deleted'; + my $dbi = Lutim::DB::Image->new(app => $c->app); + my $l = Lutim->new; do { - for my $img (LutimModel::Lutim->select('WHERE path IS NOT NULL AND enabled = 1 ORDER BY created_at ASC LIMIT 50')) { - unlink $img->path() or warn "Could not unlink ".$img->path.": $!"; - $img->update(enabled => 0); - } + $dbi->get_50_oldest()->each( + sub { + my ($img, $num) = @_; + $l->app->delete_image($img); + } + ); } while (du(qw/files/) > $config->{max_total_size}); } else { diff --git a/lib/Lutim/Controller.pm b/lib/Lutim/Controller.pm index d9229b8..1a94305 100644 --- a/lib/Lutim/Controller.pm +++ b/lib/Lutim/Controller.pm @@ -4,6 +4,7 @@ use Mojo::Base 'Mojolicious::Controller'; use Mojo::Util qw(url_unescape b64_encode); use Mojo::Asset::Memory; use Mojo::JSON qw(true false); +use Lutim::DB::Image; use DateTime; use Digest::file qw(digest_file_hex); use Text::Unidecode; @@ -45,9 +46,12 @@ sub about { } sub stats { - shift->render( + my $c = shift; + + my $img = Lutim::DB::Image->new(app => $c); + $c->render( template => 'stats', - total => LutimModel::Lutim->count('WHERE path IS NOT NULL') + total => $img->count_not_empty ); } @@ -85,13 +89,13 @@ sub get_counter { my $short = $c->param('short'); my $token = $c->param('token'); - my @images = LutimModel::Lutim->select('WHERE short = ? AND path IS NOT NULL AND mod_token = ?', ($short, $token)); - if (scalar(@images)) { + my $img = Lutim::DB::Image->new(app => $c->app, short => $short); + if (defined($img->mod_token) && $img->mod_token eq $token) { return $c->render( json => { success => true, - counter => $images[0]->counter, - enabled => ($images[0]->enabled) ? true : false + counter => $img->counter, + enabled => ($img->enabled) ? true : false } ); } @@ -109,11 +113,10 @@ sub modify { my $token = $c->param('token'); my $url = $c->param('url'); - my @images = LutimModel::Lutim->select('WHERE short = ? AND path IS NOT NULL', $short); - if (scalar(@images)) { - my $image = $images[0]; + my $image = Lutim::DB::Image->new(app => $c->app, short => $short); + if ($image->path) { my $msg; - if ($image->mod_token() ne $token || $token eq '') { + if ($image->mod_token ne $token || $token eq '') { $msg = $c->l('The delete token is invalid.'); } else { $c->app->log->info('[MODIFICATION] someone modify '.$image->filename.' with token method (path: '.$image->path.')'); @@ -178,11 +181,10 @@ sub delete { my $short = $c->param('short'); my $token = $c->param('token'); - my @images = LutimModel::Lutim->select('WHERE short = ? AND path IS NOT NULL', $short); - if (scalar(@images)) { - my $image = $images[0]; + my $image = Lutim::DB::Image->new(app => $c->app, short => $short); + if ($image->path) { my $msg; - if ($image->mod_token() ne $token || $token eq '') { + if ($image->mod_token ne $token || $token eq '') { $msg = $c->l('The delete token is invalid.'); } elsif ($image->enabled() == 0) { $msg = $c->l('The image %1 has already been deleted.', $image->filename); @@ -349,102 +351,96 @@ sub add { return $c->redirect_to('/'); } } - if(LutimModel->begin) { - my @records = LutimModel::Lutim->select('WHERE path IS NULL LIMIT 1'); - if (scalar(@records)) { - # Save file and create record - my $filename = unidecode($upload->filename); - my $ext = ($filename =~ m/([^.]+)$/)[0]; - my $path = 'files/'.$records[0]->short.'.'.$ext; + my $record = Lutim::DB::Image->new(app => $c->app)->select_empty; + if ($record->short) { + # Save file and create record + my $filename = unidecode($upload->filename); + my $ext = ($filename =~ m/([^.]+)$/)[0]; + my $path = 'files/'.$record->short.'.'.$ext; - my ($width, $height); - if ($im_loaded && $mediatype ne 'image/svg+xml' && $mediatype !~ m#image/(x-)?xcf# && $mediatype ne 'image/webp') { # ImageMagick don't work in Debian with svg (for now?) - my $im = Image::Magick->new; - $im->BlobToImage($upload->slurp); + my ($width, $height); + if ($im_loaded && $mediatype ne 'image/svg+xml' && $mediatype !~ m#image/(x-)?xcf# && $mediatype ne 'image/webp') { # ImageMagick don't work in Debian with svg (for now?) + my $im = Image::Magick->new; + $im->BlobToImage($upload->slurp); - # Automatic rotation from EXIF tag - $im->AutoOrient(); + # Automatic rotation from EXIF tag + $im->AutoOrient(); - # Update the uploaded file with it's auto-rotated clone - my $asset = Mojo::Asset::Memory->new->add_chunk($im->ImageToBlob()); - $upload->asset($asset); + # Update the uploaded file with it's auto-rotated clone + my $asset = Mojo::Asset::Memory->new->add_chunk($im->ImageToBlob()); + $upload->asset($asset); - # Create the thumbnail - $width = $im->Get('width'); - $height = $im->Get('height'); - $im->Resize(geometry=>'x85'); - - $thumb = 'data:'.$mediatype.';base64,'; - if ($mediatype eq 'image/gif') { - $thumb .= b64_encode $im->[0]->ImageToBlob(); - } else { - $thumb .= b64_encode $im->ImageToBlob(); - } + # Create the thumbnail + $width = $im->Get('width'); + $height = $im->Get('height'); + $im->Resize(geometry=>'x85'); + $thumb = 'data:'.$mediatype.';base64,'; + if ($mediatype eq 'image/gif') { + $thumb .= b64_encode $im->[0]->ImageToBlob(); + } else { + $thumb .= b64_encode $im->ImageToBlob(); } - unless ((defined($keep_exif) && $keep_exif) || $mediatype eq 'image/svg+xml' || $mediatype !~ m#image/(x-)?xcf# || $mediatype ne 'image/webp') { - # Remove the EXIF tags - my $data = new IO::Scalar \$upload->slurp(); - my $et = new Image::ExifTool; - - # Use $data in Image::ExifTool object - $et->ExtractInfo($data); - # Remove all metadata - $et->SetNewValue('*', undef); - - # Create a temporary IO::Scalar to write into - my $temp; - my $a = new IO::Scalar \$temp; - $et->WriteInfo($data, $a); - - # Update the uploaded file with it's no-tags clone - $data = Mojo::Asset::Memory->new->add_chunk($temp); - $upload->asset($data); - } - - my $key; - if ($c->param('crypt') || $c->config->{always_encrypt}) { - ($upload, $key) = $c->crypt($upload, $filename); - } - $upload->move_to($path); - - $records[0]->update( - path => $path, - filename => $filename, - mediatype => $mediatype, - footprint => digest_file_hex($path, 'SHA-512'), - enabled => 1, - delete_at_day => ($c->param('delete-day') && ($c->param('delete-day') <= $c->max_delay || $c->max_delay == 0)) ? $c->param('delete-day') : $c->max_delay, - delete_at_first_view => ($c->param('first-view')) ? 1 : 0, - created_at => time(), - created_by => $ip, - width => $width, - height => $height - ); - - # Log image creation - $c->app->log->info('[CREATION] '.$ip.' pushed '.$filename.' (path: '.$path.')'); - - # Give url to user - $short = $records[0]->short; - $real_short = $short; - if (!defined($records[0]->mod_token)) { - $records[0]->update( - mod_token => $c->shortener($c->config->{token_length}) - ); - } - $token = $records[0]->mod_token; - $short .= '/'.$key if (defined($key)); - - $limit = $records[0]->delete_at_day; - $created = $records[0]->created_at; - } else { - # Houston, we have a problem - $msg = $c->l('There is no more available URL. Retry or contact the administrator. %1', $c->config->{contact}); } + + unless ((defined($keep_exif) && $keep_exif) || $mediatype eq 'image/svg+xml' || $mediatype !~ m#image/(x-)?xcf# || $mediatype ne 'image/webp') { + # Remove the EXIF tags + my $data = new IO::Scalar \$upload->slurp(); + my $et = new Image::ExifTool; + + # Use $data in Image::ExifTool object + $et->ExtractInfo($data); + # Remove all metadata + $et->SetNewValue('*', undef); + + # Create a temporary IO::Scalar to write into + my $temp; + my $a = new IO::Scalar \$temp; + $et->WriteInfo($data, $a); + + # Update the uploaded file with it's no-tags clone + $data = Mojo::Asset::Memory->new->add_chunk($temp); + $upload->asset($data); + } + + my $key; + if ($c->param('crypt') || $c->config->{always_encrypt}) { + ($upload, $key) = $c->crypt($upload, $filename); + } + $upload->move_to($path); + + $record->path($path) + ->filename($filename) + ->mediatype($mediatype) + ->footprint(digest_file_hex($path, 'SHA-512')) + ->enabled(1) + ->delete_at_day(($c->param('delete-day') && ($c->param('delete-day') <= $c->max_delay || $c->max_delay == 0)) ? $c->param('delete-day') : $c->max_delay) + ->delete_at_first_view(($c->param('first-view'))? 1 : 0) + ->created_at(time()) + ->created_by($ip) + ->width($width) + ->height($height) + ->write; + + # Log image creation + $c->app->log->info('[CREATION] '.$ip.' pushed '.$filename.' (path: '.$path.')'); + + # Give url to user + $short = $record->short; + $real_short = $short; + if (!defined($record->mod_token)) { + $record->mod_token($c->shortener($c->config->{token_length}))->write; + } + $token = $record->mod_token; + $short .= '/'.$key if (defined($key)); + + $limit = $record->delete_at_day; + $created = $record->created_at; + } else { + # Houston, we have a problem + $msg = $c->l('There is no more available URL. Retry or contact the administrator. %1', $c->config->{contact}); } - LutimModel->commit; } else { $msg = $c->l('The file %1 is not an image.', $upload->filename); } @@ -519,15 +515,14 @@ sub short { my $thumb = $c->param('thumb'); my $dl = (defined($c->param('dl'))) ? 'attachment' : 'inline'; - my @images = LutimModel::Lutim->select('WHERE short = ? AND ENABLED = 1 AND path IS NOT NULL', $short); - - if (scalar(@images)) { - if($images[0]->delete_at_day && $images[0]->created_at + $images[0]->delete_at_day * 86400 <= time()) { + my $image = Lutim::DB::Image->new(app => $c->app, short => $short); + if ($image->enabled && $image->path) { + if($image->delete_at_day && $image->created_at + $image->delete_at_day * 86400 <= time()) { # Log deletion - $c->app->log->info('[DELETION] someone tried to view '.$images[0]->filename.' but it has been removed by expiration (path: '.$images[0]->path.')'); + $c->app->log->info('[DELETION] someone tried to view '.$image->filename.' but it has been removed by expiration (path: '.$image->path.')'); # Delete image - $c->delete_image($images[0]); + $c->delete_image($image); # Warn user $c->flash( @@ -539,54 +534,53 @@ sub short { my $test; if (defined($touit)) { $test = 1; - my $short = $images[0]->short; + my $short = $image->short; $short .= '/'.$key if (defined($key)); my ($width, $height) = (340,340); - if ($images[0]->mediatype eq 'image/gif') { - if (defined($images[0]->width) && defined($images[0]->height)) { - ($width, $height) = ($images[0]->width, $images[0]->height); + if ($image->mediatype eq 'image/gif') { + if (defined($image->width) && defined($image->height)) { + ($width, $height) = ($image->width, $image->height); } elsif ($im_loaded) { - my $upload = $c->decrypt($key, $images[0]->path); + my $upload = $c->decrypt($key, $image->path); my $im = Image::Magick->new; $im->BlobToImage($upload->slurp); $width = $im->Get('width'); $height = $im->Get('height'); - $images[0]->update( - width => $width, - height => $height - ); + $image->width($width) + ->height($height) + ->write; } } return $c->render( template => 'twitter', layout => undef, short => $short, - filename => $images[0]->filename, - mimetype => ($c->req->url->to_abs()->scheme eq 'https') ? $images[0]->mediatype : '', + filename => $image->filename, + mimetype => ($c->req->url->to_abs()->scheme eq 'https') ? $image->mediatype : '', width => $width, height => $height ); } else { # Delete image if needed - if ($images[0]->delete_at_first_view && $images[0]->counter >= 1) { + if ($image->delete_at_first_view && $image->counter >= 1) { # Log deletion - $c->app->log->info('[DELETION] someone made '.$images[0]->filename.' removed (path: '.$images[0]->path.')'); + $c->app->log->info('[DELETION] someone made '.$image->filename.' removed (path: '.$image->path.')'); # Delete image - $c->delete_image($images[0]); + $c->delete_image($image); $c->flash( msg => $c->l('Unable to find the image: it has been deleted.') ); return $c->redirect_to('/'); } else { - my $expires = ($images[0]->delete_at_day) ? $images[0]->delete_at_day : 360; - my $dt = DateTime->from_epoch( epoch => $expires * 86400 + $images[0]->created_at); + my $expires = ($image->delete_at_day) ? $image->delete_at_day : 360; + my $dt = DateTime->from_epoch( epoch => $expires * 86400 + $image->created_at); $dt->set_time_zone('GMT'); $expires = $dt->strftime("%a, %d %b %Y %H:%M:%S GMT"); - $test = $c->render_file($images[0]->filename, $images[0]->path, $images[0]->mediatype, $dl, $expires, $images[0]->delete_at_first_view, $key, $thumb); + $test = $c->render_file($image->filename, $image->path, $image->mediatype, $dl, $expires, $image->delete_at_first_view, $key, $thumb); } } @@ -594,40 +588,36 @@ sub short { # Update counter $c->on(finish => sub { # Log access - $c->app->log->info('[VIEW] someone viewed '.$images[0]->filename.' (path: '.$images[0]->path.')'); + $c->app->log->info('[VIEW] someone viewed '.$image->filename.' (path: '.$image->path.')'); # Update record - my $counter = $images[0]->counter + 1; - $images[0]->update(counter => $counter); - - $images[0]->update(last_access_at => time()); + my $counter = $image->counter + 1; + $image->counter($counter) + ->last_access_at(time) + ->write; # Delete image if needed - if ($images[0]->delete_at_first_view) { + if ($image->delete_at_first_view) { # Log deletion - $c->app->log->info('[DELETION] someone made '.$images[0]->filename.' removed (path: '.$images[0]->path.')'); + $c->app->log->info('[DELETION] someone made '.$image->filename.' removed (path: '.$image->path.')'); # Delete image - $c->delete_image($images[0]); + $c->delete_image($image); } }); } + } elsif ($image->path && !$image->enabled) { + # Log access try + $c->app->log->info('[NOT FOUND] someone tried to view '.$short.' but it does\'nt exist anymore.'); + + # Warn user + $c->flash( + msg => $c->l('Unable to find the image: it has been deleted.') + ); + return $c->redirect_to('/'); } else { - @images = LutimModel::Lutim->select('WHERE short = ? AND ENABLED = 0 AND path IS NOT NULL', $short); - - if (scalar(@images)) { - # Log access try - $c->app->log->info('[NOT FOUND] someone tried to view '.$short.' but it does\'nt exist anymore.'); - - # Warn user - $c->flash( - msg => $c->l('Unable to find the image: it has been deleted.') - ); - return $c->redirect_to('/'); - } else { - # Image never existed - $c->render_not_found; - } + # Image never existed + $c->render_not_found; } } @@ -649,16 +639,16 @@ sub zip { } else { $short =~ s/\.[^.]*//; } - my @images = LutimModel::Lutim->select('WHERE short = ? AND ENABLED = 1 AND path IS NOT NULL', $short); + my $image = Lutim::DB::Image->new(app => $c->app, short => $short); - if (scalar(@images)) { - my $filename = $images[0]->filename; - if($images[0]->delete_at_day && $images[0]->created_at + $images[0]->delete_at_day * 86400 <= time()) { + if ($image->enabled && $image->path) { + my $filename = $image->filename; + if($image->delete_at_day && $image->created_at + $image->delete_at_day * 86400 <= time()) { # Log deletion - $c->app->log->info('[DELETION] someone tried to view '.$images[0]->filename.' but it has been removed by expiration (path: '.$images[0]->path.')'); + $c->app->log->info('[DELETION] someone tried to view '.$image->filename.' but it has been removed by expiration (path: '.$image->path.')'); # Delete image - $c->delete_image($images[0]); + $c->delete_image($image); # Warn user $zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$filename.'.txt'); @@ -666,22 +656,22 @@ sub zip { } # Delete image if needed - if ($images[0]->delete_at_first_view && $images[0]->counter >= 1) { + if ($image->delete_at_first_view && $image->counter >= 1) { # Log deletion - $c->app->log->info('[DELETION] someone made '.$images[0]->filename.' removed (path: '.$images[0]->path.')'); + $c->app->log->info('[DELETION] someone made '.$image->filename.' removed (path: '.$image->path.')'); # Delete image - $c->delete_image($images[0]); + $c->delete_image($image); $zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$filename.'.txt'); next; } else { - my $expires = ($images[0]->delete_at_day) ? $images[0]->delete_at_day : 360; - my $dt = DateTime->from_epoch( epoch => $expires * 86400 + $images[0]->created_at); + my $expires = ($image->delete_at_day) ? $image->delete_at_day : 360; + my $dt = DateTime->from_epoch( epoch => $expires * 86400 + $image->created_at); $dt->set_time_zone('GMT'); $expires = $dt->strftime("%a, %d %b %Y %H:%M:%S GMT"); - my $path = $images[0]->path; + my $path = $image->path; unless ( -f $path && -r $path ) { $c->app->log->error("Cannot read file [$path]. error [$!]"); $zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$filename.'.txt'); @@ -695,26 +685,22 @@ sub zip { } # Log access - $c->app->log->info('[VIEW] someone viewed '.$images[0]->filename.' (path: '.$images[0]->path.')'); - # Update counter - $images[0]->update(counter => $images[0]->counter + 1); - # Update record - $images[0]->update(last_access_at => time()); + $c->app->log->info('[VIEW] someone viewed '.$image->filename.' (path: '.$image->path.')'); + # Update counter and record + $image->counter($image->counter + 1) + ->last_access_at(time) + ->write; } + } elsif ($image->path && !$image->enabled) { + # Log access try + $c->app->log->info('[NOT FOUND] someone tried to view '.$short.' but it does\'nt exist anymore.'); + + # Warn user + $zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$image->filename.'.txt'); + next; } else { - @images = LutimModel::Lutim->select('WHERE short = ? AND ENABLED = 0 AND path IS NOT NULL', $short); - - if (scalar(@images)) { - # Log access try - $c->app->log->info('[NOT FOUND] someone tried to view '.$short.' but it does\'nt exist anymore.'); - - # Warn user - $zip->addString($c->l('Unable to find the image: it has been deleted.'), 'images/'.$images[0]->filename.'.txt'); - next; - } else { - $zip->addString($c->l('Image not found.'), 'images/'.$short.'.txt'); - next; - } + $zip->addString($c->l('Image not found.'), 'images/'.$short.'.txt'); + next; } } my ($fh, $zipfile) = Archive::Zip::tempFile(); diff --git a/lib/Lutim/DB/Image.pm b/lib/Lutim/DB/Image.pm new file mode 100644 index 0000000..0e936e0 --- /dev/null +++ b/lib/Lutim/DB/Image.pm @@ -0,0 +1,318 @@ +# vim:set sw=4 ts=4 sts=4 ft=perl expandtab: +package Lutim::DB::Image; +use Mojo::Base -base; + +has 'short'; +has 'path'; +has 'footprint'; +has 'enabled'; +has 'mediatype'; +has 'filename'; +has 'counter' => 0; +has 'delete_at_first_view'; +has 'delete_at_day'; +has 'created_at'; +has 'created_by'; +has 'last_access_at'; +has 'mod_token'; +has 'width'; +has 'height'; +has 'app'; + +=head1 NAME + +Lutim::DB::Image - DB abstraction layer for Lutim images + +=head1 Contributing + +When creating a new database accessor, make sure that it provides the following subroutines. +After that, modify this file and modify the C subroutine to allow to use your accessor. + +Have a look at Lutim::DB::Image::SQLite's code: it's simple and may be more understandable that this doc. + +=head1 Attributes + +=over 1 + +=item B : random string + +=item B : string, path to the image, relative to lutim's installation directory + +=item B : string, sha512 checksum of the image + +=item B : boolean, is the image accessible? + +=item B : string, mimetype of the image + +=item B : string + +=item B : integer + +=item B : boolean + +=item B : integer, number of days from image upload to deletion + +=item B : unix timestamp + +=item B : unix timestamp + +=item B : unix timestamp + +=item B : random string + +=item B : integer + +=item B : integer + +=item B : a mojolicious object + +=back + +=head1 Sub routines + +=head2 new + +=over 1 + +=item B : C<$c = Lutim::DB::Image-Enew(app =E $self);> + +=item B : any of the attribute above + +=item B : construct a new db accessor object. If the C attribute is provided, it have to load the informations from the database. + +=item B : the db accessor object + +=item B : the app argument is used by Lutim::DB::Image to choose which db accessor will be used, you don't need to use it in new(), but you can use it to access helpers or configuration settings in the other subroutines + +=back + +=cut + +sub new { + my $c = shift; + + $c = $c->SUPER::new(@_); + + if (ref($c) eq 'Lutim::DB::Image') { + my $dbtype = $c->app->config('dbtype'); + if ($dbtype eq 'sqlite') { + use Lutim::DB::Image::SQLite; + $c = Lutim::DB::Image::SQLite->new(@_); + #} elsif ($dbtype eq 'postgresql') { + # use Lutim::DB::Image::Pg; + # $c = Lutim::DB::Image::Pg->new(@_); + } + } + + return $c; +} + +sub to_hash { + my $c = shift; + + return { + short => $c->short, + path => $c->path, + footprint => $c->footprint, + enabled => $c->enabled, + mediatype => $c->mediatype, + filename => $c->filename, + counter => $c->counter, + delete_at_first_view => $c->delete_at_first_view, + delete_at_day => $c->delete_at_day, + created_at => $c->created_at, + created_by => $c->created_by, + last_access_at => $c->last_access_at, + mod_token => $c->mod_token, + width => $c->width, + height => $c->height + }; +} + +=head2 count_delete_at_day_endis + +=over 1 + +=item B : C<$c-Ecount_delete_at_day_endis($delete_at_day, $enabled[, $time])> + +=item B : two mandatory parameters: one integer, the delete_at_day attribute, a boolean (0 or 1), the enabled attribute + an optional parameter: an unix timestamp + +=item B : count how many images there is with the given delete_at_day attribute, and enabled or disabled, depending on the given enabled attribute + if the optional parameter is given, count only images according to the given mandatory parameters that were created before the timestamp + +=item B : integer + +=back + +=head2 count_created_before + +=over 1 + +=item B : C<$c-Ecount_created_before($time)> + +=item B : an unix timestamp + +=item B : count how many images have been created before the given timestamp + +=item B : integer + +=back + +=head2 select_created_after + +=over 1 + +=item B : C<$c-Eselect_created_after($time)> + +=item B : an unix timestamp + +=item B : select images created after the given timestamp + +=item B : a Mojo::Collection object containing the images created after the given timestamp + +=back + +=head2 select_empty + +=over 1 + +=item B : C<$c-Eselect_empty> + +=item B : none + +=item B : select a ready-to-use empty record + +=item B : a db accessor object + +=back + +=head2 write + +=over 1 + +=item B : C<$c-Ewrite> + +=item B : none + +=item B : create or update a record in the database, with the values of the object's attributes + +=item B : the db accessor object + +=back + +=head2 count_short + +=over 1 + +=item B : C<$c-Ecount_short($short)> + +=item B : a random string, unique image identifier in the database + +=item B : checks that an identifier isn't already used + +=item B : integer, number of records having this identifier (should be 0 or 1) + +=back + +=head2 count_empty + +=over 1 + +=item B : C<$c-Ecount_empty> + +=item B : none + +=item B : counts the number of record which path is null + +=item B : integer + +=back + +=head2 count_not_empty + +=over 1 + +=item B : C<$c-Ecount_not_empty> + +=item B : none + +=item B : counts the number of record which path is not null + +=item B : integer + +=back + +=head2 clean_ips_until + +=over 1 + +=item B : C<$c-Eclean_ips_until($time)> + +=item B : unix timestamp + +=item B : remove the image's sender information on images created before the given timestamp + +=item B : the db accessor object + +=back + +=head2 get_no_longer_viewed_files + +=over 1 + +=item B : C<$c-Eget_no_longer_viewed_files($time)> + +=item B : unix timestamp + +=item B : get images no longer viewed after the given timestamp + +=item B : a Mojo::Collection object containing the no longer viewed images as Lutim::DB::Image objects + +=back + +=head2 get_images_to_clean + +=over 1 + +=item B : C<$c-Eget_images_to_clean> + +=item B : none + +=item B : get images that are expired but not marked as it + +=item B : a Mojo::Collection object containing the images to clean as Lutim::DB::Image objects + +=back + +=head2 get_50_oldest + +=over 1 + +=item B : C<$c-Eget_50_oldest> + +=item B : none + +=item B : get the 50 oldest enabled images + +=item B : a Mojo::Collection object containing the 50 oldest enabled images as Lutim::DB::Image objects + +=back + +=head2 disable + +=over 1 + +=item B : C<$c-Edisable> + +=item B : none + +=item B : change the attribute C to false and update the database record + +=item B : the db accessor object + +=back + +=cut + +1; diff --git a/lib/Lutim/DB/Image/SQLite.pm b/lib/Lutim/DB/Image/SQLite.pm new file mode 100644 index 0000000..a165d37 --- /dev/null +++ b/lib/Lutim/DB/Image/SQLite.pm @@ -0,0 +1,240 @@ +# vim:set sw=4 ts=4 sts=4 ft=perl expandtab: +package Lutim::DB::Image::SQLite; +use Mojo::Base 'Lutim::DB::Image'; +use Lutim::DB::SQLite; +use Mojo::Collection 'c'; + +has 'record'; + +sub new { + my $c = shift; + $c = $c->SUPER::new(@_); + $c = $c->_slurp if ($c->short); + return $c; +} + +sub count_delete_at_day_endis { + my $c = shift; + my $day = shift; + my $enabled = shift; + my $created = shift; + + if (defined $created) { + return Lutim::DB::SQLite::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = ? AND enabled = ? AND created_at < ?', $day, $enabled, $created); + } else { + return Lutim::DB::SQLite::Lutim->count('WHERE path IS NOT NULL AND delete_at_day = ? AND enabled = ?', $day, $enabled); + } +} + +sub count_created_before { + my $c = shift; + my $time = shift; + + return Lutim::DB::SQLite::Lutim->count('WHERE path IS NOT NULL AND created_at < ?', $time); +} + +sub select_created_after { + my $c = shift; + my $time = shift; + + my @images; + + my @records = Lutim::DB::SQLite::Lutim->select('WHERE path IS NOT NULL AND created_at >= ?', $time); + + for my $e (@records) { + my $i = Lutim::DB::Image->new(app => $c->app); + $i->record($e); + $i->_slurp; + + push @images, $i; + } + + return c(@images); +} + +sub select_empty { + my $c = shift; + + my @records = Lutim::DB::SQLite::Lutim->select('WHERE path IS NULL LIMIT 1'); + + $c->record($records[0]); + $c = $c->_slurp; + + return $c; +} + +sub write { + my $c = shift; + + if ($c->record) { + $c->record->update( + counter => $c->counter, + created_at => $c->created_at, + created_by => $c->created_by, + delete_at_day => $c->delete_at_day, + delete_at_first_view => $c->delete_at_first_view, + enabled => $c->enabled, + filename => $c->filename, + footprint => $c->footprint, + height => $c->height, + last_access_at => $c->last_access_at, + mediatype => $c->mediatype, + mod_token => $c->mod_token, + path => $c->path, + short => $c->short, + width => $c->width + ); + } else { + my $record = Lutim::DB::SQLite::Lutim->create( + counter => $c->counter, + created_at => $c->created_at, + created_by => $c->created_by, + delete_at_day => $c->delete_at_day, + delete_at_first_view => $c->delete_at_first_view, + enabled => $c->enabled, + filename => $c->filename, + footprint => $c->footprint, + height => $c->height, + last_access_at => $c->last_access_at, + mediatype => $c->mediatype, + mod_token => $c->mod_token, + path => $c->path, + short => $c->short, + width => $c->width + ); + $c->record($record); + } + + return $c; +} + +sub count_short { + my $c = shift; + my $short = shift; + + return Lutim::DB::SQLite::Lutim->count('WHERE short IS ?', $short); +} + +sub count_empty { + my $c = shift; + + return Lutim::DB::SQLite::Lutim->count('WHERE path IS NULL'); +} + +sub count_not_empty { + my $c = shift; + + return Lutim::DB::SQLite::Lutim->count('WHERE path IS NOT NULL'); +} + +sub clean_ips_until { + my $c = shift; + my $time = shift; + + Lutim::DB::SQLite->do( + 'UPDATE lutim SET created_by = "" WHERE path IS NOT NULL AND created_at < ?', + {}, + $time + ); + + return $c; +} + +sub get_no_longer_viewed_files { + my $c = shift; + my $time = shift; + + my @images; + + my @records = c(Lutim::DB::SQLite::Lutim->select('WHERE enabled = 1 AND last_access_at < ?', $time)); + + for my $e (@records) { + my $i = Lutim::DB::Image->new(app => $c->app); + $i->record($e); + $i->_slurp; + + push @images, $i; + } + + return c(@images); +} + +sub get_images_to_clean { + my $c = shift; + + my @images; + + my @records = Lutim::DB::SQLite::Lutim->select('WHERE enabled = 1 AND (delete_at_day * 86400) < (? - created_at) AND delete_at_day != 0', time()); + + for my $e (@records) { + my $i = Lutim::DB::Image->new(app => $c->app); + $i->record($e); + $i->_slurp; + + push @images, $i; + } + + return c(@images); +} + +sub get_50_oldest { + my $c = shift; + + my @images; + + my @records = Lutim::DB::SQLite::Lutim->select('WHERE path IS NOT NULL AND enabled = 1 ORDER BY created_at ASC LIMIT 50'); + + for my $e (@records) { + my $i = Lutim::DB::Image->new(app => $c->app); + $i->record($e); + $i->_slurp; + + push @images, $i; + } + + return c(@images); +} + +sub disable { + my $c = shift; + + $c->record->update(enabled => 0); + $c->enabled(0); + + return $c; +} + +sub _slurp { + my $c = shift; + + my @images; + if ($c->record) { + @images = ($c->record); + } elsif ($c->short) { + @images = Lutim::DB::SQLite::Lutim->select('WHERE short = ?', $c->short); + } + + if (scalar @images) { + $c->short($images[0]->short); + $c->path($images[0]->path); + $c->footprint($images[0]->footprint); + $c->enabled($images[0]->enabled); + $c->mediatype($images[0]->mediatype); + $c->filename($images[0]->filename); + $c->counter($images[0]->counter); + $c->delete_at_first_view($images[0]->delete_at_first_view); + $c->delete_at_day($images[0]->delete_at_day); + $c->created_at($images[0]->created_at); + $c->created_by($images[0]->created_by); + $c->last_access_at($images[0]->last_access_at); + $c->mod_token($images[0]->mod_token); + $c->width($images[0]->width); + $c->height($images[0]->height); + + $c->record($images[0]) unless $c->record; + } + + return $c; +} + +1; diff --git a/lib/LutimModel.pm b/lib/Lutim/DB/SQLite.pm similarity index 86% rename from lib/LutimModel.pm rename to lib/Lutim/DB/SQLite.pm index 7456baa..b6d1530 100644 --- a/lib/LutimModel.pm +++ b/lib/Lutim/DB/SQLite.pm @@ -1,13 +1,14 @@ -package LutimModel; +# vim:set sw=4 ts=4 sts=4 ft=perl expandtab: +package Lutim::DB::SQLite; use Mojolicious; +use Mojo::File; use FindBin qw($Bin); -use File::Spec qw(catfile); BEGIN { my $m = Mojolicious->new; our $config = $m->plugin('Config' => { - file => File::Spec->catfile($Bin, '..' ,'lutim.conf'), + file => Mojo::File->new($Bin, '..' ,'lutim.conf')->to_abs->to_string, default => { db_path => 'lutim.db' } diff --git a/lutim.conf.template b/lutim.conf.template index 3d4fc47..e7f3836 100644 --- a/lutim.conf.template +++ b/lutim.conf.template @@ -108,12 +108,28 @@ # optional, defaut is / #prefix => '/', + # choose what database you want to use + # valid choices are sqlite and postgresql (all lowercase) + # optional, default is sqlite + #dbtype => 'sqlite', + + # SQLite ONLY - only used if dbtype is set to sqlite # define a path to the SQLite database # you can define it relative to lutim directory or set an absolute path # remember that it has to be in a directory writable by Lutim user # optional, default is lutim.db #db_path => 'lutim.db', + # PostgreSQL ONLY - only used if dbtype is set to postgresql + # these are the credentials to access the PostgreSQL database + # mandatory if you choosed postgresql as dbtype + #pgdb => { + # database => 'lutim', + # host => 'localhost', + # #user => 'DBUSER', + # #pwd => 'DBPASSWORD' + #}, + # define the height of the thumbnails generated at users' will # this is not the height of the thumbnails send after upload, # we're talking about thumbnails generated when someone asked for