# HG changeset patch # User Michael J. Flickinger # Date 1232308887 18000 # Node ID 02d30d4e5ec856265d9905dc1f9ea42df33a43fc Initial import diff --git a/Changes b/Changes new file mode 100644 --- /dev/null +++ b/Changes @@ -0,0 +1,4 @@ +This file documents the revision history for Perl extension Savane. + +0.01 2009-01-18 14:06:11 + - initial revision, generated by Catalyst diff --git a/LICENSE b/LICENSE new file mode 100644 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,19 @@ +# IMPORTANT: if you delete this file your app will not work as +# expected. you have been warned +use inc::Module::Install; + +name 'Savane'; +all_from 'lib/Savane.pm'; + +requires 'Catalyst::Runtime' => '5.7014'; +requires 'Catalyst::Plugin::ConfigLoader'; +requires 'Catalyst::Plugin::Static::Simple'; +requires 'Catalyst::Action::RenderView'; +requires 'parent'; +requires 'Config::General'; # This should reflect the config file format you've chosen + # See Catalyst::Plugin::ConfigLoader for supported formats +catalyst; + +install_script glob('script/*.pl'); +auto_install; +WriteAll; diff --git a/README b/README new file mode 100644 --- /dev/null +++ b/README @@ -0,0 +1,1 @@ +Run script/savane_server.pl to test the application. diff --git a/lib/Savane.pm b/lib/Savane.pm new file mode 100644 --- /dev/null +++ b/lib/Savane.pm @@ -0,0 +1,74 @@ +package Savane; + +use strict; +use warnings; + +use Catalyst::Runtime '5.70'; + +# Set flags and add plugins for the application +# +# -Debug: activates the debug mode for very useful log messages +# ConfigLoader: will load the configuration from a Config::General file in the +# application's home directory +# Static::Simple: will serve static files from the application's root +# directory + +use parent qw/Catalyst/; + +our $VERSION = '0.01'; + +# Configure the application. +# +# Note that settings in savane.conf (or other external +# configuration file that you set up manually) take precedence +# over this when using ConfigLoader. Thus configuration +# details given here can function as a default configuration, +# with a external configuration file acting as an override for +# local deployment. + +__PACKAGE__->config( name => 'Savane' ); + +# Start the application +__PACKAGE__->setup(qw/-Debug ConfigLoader Static::Simple/); + +=head1 NAME + +Savane - Web framework for Savane interface. + +=head1 SYNOPSIS + + script/savane_server.pl + +=head1 DESCRIPTION + +Savane + +=head1 SEE ALSO + +L, L + +=head1 AUTHOR + +Michael J. Flickinger C<< >> + +=head1 LICENSE + + Savane + Copyright (C) 2009 - Savannah Hackers + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +=cut + +1; diff --git a/lib/Savane/Controller/Root.pm b/lib/Savane/Controller/Root.pm new file mode 100644 --- /dev/null +++ b/lib/Savane/Controller/Root.pm @@ -0,0 +1,83 @@ +package Savane::Controller::Root; + +use strict; +use warnings; +use parent 'Catalyst::Controller'; + +# +# Sets the actions in this controller to be registered with no prefix +# so they function identically to actions created in MyApp.pm +# +__PACKAGE__->config->{namespace} = ''; + +=head1 NAME + +Savane::Controller::Root - Root Controller for Savane + +=head1 DESCRIPTION + +[enter your description here] + +=head1 METHODS + +=cut + +=head2 index + +=cut + +sub index :Path :Args(0) { + my ( $self, $c ) = @_; + + # example of a template being called + $c->stash->{remote_host} = $c->req->address; + $c->stash->{template} = 'templates/main_page.tt'; +} + +sub default :Path { + my ( $self, $c ) = @_; + $c->response->body( 'Page not found' ); + $c->response->status(404); + +} + +=head2 end + +Allow for "post processing" of in our application. +* Write some code for handling "server errors". +* Also, attempt to render a view, if needed. + +=cut + +sub end : Private { + my ( $self, $c ) = @_; + + return if $c->res->body; # already have a response + $c->forward( 'Savane::View::TT' ); # render template +} + +=head1 AUTHOR + +Michael J. Flickinger C<< >> + +=head1 LICENSE + + Savane + Copyright (C) 2009 - Savannah Hackers + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +=cut + +1; diff --git a/lib/Savane/Model/DB.pm b/lib/Savane/Model/DB.pm new file mode 100644 --- /dev/null +++ b/lib/Savane/Model/DB.pm @@ -0,0 +1,50 @@ +package Savane::Model::DB; + +use strict; +use base 'Catalyst::Model::DBIC::Schema'; + +__PACKAGE__->config( + schema_class => 'Savane::Schema', + connect_info => [ + 'dbi:mysql:dbname=savane_dev', + 'root', + ], +); + +=head1 NAME + +Savane::Model::DB - Catalyst DBIC Schema Model + +=head1 SYNOPSIS + +See L + +=head1 DESCRIPTION + +L Model using schema L + +=head1 AUTHOR + +Michael J. Flickinger C<< >> + +=head1 LICENSE + + Savane + Copyright (C) 2009 - Savannah Hackers + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +=cut + +1; diff --git a/lib/Savane/Schema.pm b/lib/Savane/Schema.pm new file mode 100644 --- /dev/null +++ b/lib/Savane/Schema.pm @@ -0,0 +1,48 @@ +package Savane::Schema; + +use strict; +use base qw/DBIx::Class::Schema::Loader/; + +__PACKAGE__->loader_options( + relationships => 1, + # debug => 1, +); + +=head1 NAME + +Savane::Schema - DBIx::Class::Schema::Loader class + +=head1 SYNOPSIS + +See L + +=head1 DESCRIPTION + +Generated by L for use in L + +=head1 AUTHOR + +Michael J. Flickinger C<< >> + +=head1 LICENSE + + Savane + Copyright (C) 2009 - Savannah Hackers + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +=cut + +1; + diff --git a/lib/Savane/View/TT.pm b/lib/Savane/View/TT.pm new file mode 100644 --- /dev/null +++ b/lib/Savane/View/TT.pm @@ -0,0 +1,40 @@ +package Savane::View::TT; + +use strict; +use base 'Catalyst::View::TT'; + +__PACKAGE__->config(TEMPLATE_EXTENSION => '.tt'); + +=head1 NAME + +Savane::View::TT - TT View for Savane + +=head1 DESCRIPTION + +TT View for Savane. + +=head1 AUTHOR + +Michael J. Flickinger C<< >> + +=head1 LICENSE + + Savane + Copyright (C) 2009 - Savannah Hackers + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +=cut + +1; diff --git a/root/favicon.ico b/root/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5ad723dc416e8ad9c8dea9457a564c59499466e9 GIT binary patch literal 2551 zc%1E4&rcIk5T4fJ!yhO=lxo3Ru_7!gh!UY8`~g5nfRqqUgj2)GD;!$F0TKw1z=d!! z5SqXNNKe2YASW@YSWRPBQs_okX-Q+3y6BG6g#;Fa)W&#`Nhb5Ynfbn*x7ob606Ne^ zW+qTf2S*w}A;3PifWrVVOu3>&j@$x!eaB3<7xa2R^z{XysmTXkuM8ab5+)}_*4fFk zwl*JOiFyPW9gRY5tw7iZ9#5Es!wT!|m7%*^g6wP_W@kmx5MX#X3^g^Y%x3d3Syl)K zp{2zKf*^z29R;V8Cq0QRFH6knl)-HFQeB{2kmeAep@9d#Ut%1$%G_=dIyw^1RHz2mi*J{d7%6+xdg)?bQ2}?0t1L})mESMFa?Sz; z7YZI8Pz!Ud51w8=!1>p8x+nPu*pzQDcQ z7tK69J#n=sVWH42x?EADJBA!-EhC-rI6l6O@wlSVwcFpS^VHRC;@H?W(p`e>?VAV? zB#)5C)M&ShxU-`in=3KL^z>&nMj}7a>-~;&_Ymj(zJ{Pix?7UoE62UUs;YN1*E)HS z)&a_`CCzua0$5%B8vFY<$Tw;IhH~pk^FyJys=;w9SX{hahyFMa`#fIOxE diff --git a/root/static/images/btn_120x50_built.png b/root/static/images/btn_120x50_built.png new file mode 100644 index 0000000000000000000000000000000000000000..c709fd67191037b89c6cfcdd821b9afb3b0447e7 GIT binary patch literal 3826 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 U#u9YuYXLxQBdwZe;HaYi0UKhVf&c&j diff --git a/root/static/images/btn_120x50_powered_shadow.png b/root/static/images/btn_120x50_powered_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..e6876c08fc78dcad5e4fd5a2e895f3522ad63a13 GIT binary patch literal 3673 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 Ut#h9AEdv~FT`pDI+)66^FB~`OF8}}l diff --git a/root/static/images/btn_88x31_built_shadow.png b/root/static/images/btn_88x31_built_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..ccf4624b5de3d4a0c4b5f772bcce7ad247e2a237 GIT binary patch literal 2274 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 diff --git a/root/static/images/btn_88x31_powered_shadow.png b/root/static/images/btn_88x31_powered_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..aa776fa40f8e6d41c5277be33b0e16b10c1def92 GIT binary patch literal 2304 zc$@(M3IFzqP)M95=8lSn+S=N7acr}&uJm+t-{0TO&C9~W!QHyL z>FMe2>guJXqT1To{YgnSE+>hGgxuWRkd29NZ*R}f&(YD*_F+1Tm;0N>!>{`vUo6&2Xl z)#@xP_V)Gv#l?bsdAYc^$;ijW#KK8JJJ#0L%*@Qu005$+p?h|5V_jI*)YPu8t)7~f zg@Jv~(9Xrh#KgnG?Ck4oW?`eBoWj7r{=vb<#>Upy)!Ne1O-4Y+$j7_8yS=-)OG`^? zYHI2W3;+NBMn*>d{{H>_{qFAW{QUg-`ug_v_W1bt_4W1C)zsD1)cN`O^78WZ^z{Aw z{p952`}_Oz^YZTQ?eOsM^Yiok{rvIq@#N*?@bK^N@9+Hm{nXUdoS2mS{Qd3j?(*~U z{r&vz@9y{a_x=3*TwGk~>gnp~>64I+_V@PH)YM*AQRnC9+1c6c?(O;c_|?|c)z#JW z^77Ho&Yzr_r>Cc?r=;cOgwrQQ%&#h?%LSc^7HfKlplcysjg^VHMQ&abY(zrF75?)j&u{r>$>Nkhz?ov5g%>d(&V;NSoL{$E*B zrJ|qw;^Xx;HvXQU-_z6j`uW(ct=rq%=RZI9`1jy~f&PJkZEbAp>+9X!-QM2ax45?1 z+S#zMuk`iw`uqCf3k&7a(c{d_@$&KW@bL5U@y5o*?s9VW?d`O)vd_=X@#^XS>gx9B z=&P)&(9zG|*Vomfqt&UX-=d=N@bKT;+hJj0)6~=W$H(~h_rWFUoB#j?g-Jv~RCwB~ zl?hN2R~W|^MW}#5eMZ1|RYW<08WdSMf~E+HriB_?t$0v85V^D>9)u(;34)S})_r3r7_CGt>%|0TpCkldz z;JoL9=t+#^inO6X(b0Pjto4R9aTo_H($xs8ci;%?*yz3=Ys z{v8=F?k%?nyYXpOg0HV{N=nM9F#jtL*EkhU1LFs8Z@Tj^{)&ItsTAMSc-!~?lfXL7 z7<;WDsr+tSn>b*=1UkRBNZJxpyclEg%tF~CBoc}2``-)m-h)J9=%)TBj|-q!QyM0= z8~} zxU=XnR8gDj2p1QZFRQChQj5FP0#1PvMlfF)!SUzhLRzR~^SyC|!SwA+q;R!1-eDYa zq6DKa(d#Ep{By#7tL9Dt8d`f~m<`B?i@O+? zkr8Lhu-S$UN5iewp!4chCnpiFJ(6r%p-B8SEjl{7^FA1>d=ir6a=Aj$sObNugMQbW z_ck{x_EvxldlmAE3I$VBp{Ng!Xq3Z3Q6ZN{gh$}45ejfBm%F$rn#beuL_CoQ#!7@xlqd&g!Ntii zqj^|ClSNS|ikE}J=H;NJVIZvKt-_UXA&(Ff9^OB_wqU`w`ClwrG#?T>+lHvm8r5pG z(Fh?M<%AfItFsT^KZ*{h>ruVh7;-%O0=i(tIs7ys=xA#!I`C?U+K7u}zVE@wf=g7vb{T7*LD z;L_Tc#6-o`O;cK0rbxAIT5ZNiH_Vu!pG=u9-L2J1p_`>bv;8bZf-+o3>xI= z`JxI_1^u`HEvcMbiFQ>AP-PX4AxKcU3uUS*QKd?C386_U6+BrKQ=$@}sF12E)xK;o zA-l6Pv58`6fHuhQ-GA;CQTIlU^P?6w*!BIH2&LAoMKMt*m8#1`0xDG?NJW`cDy$o* z7<7ngh!UU=_fym%0Z8C96<)VuAFny>G+mCHp`5Ofm}rxXUihi!S0iV9Tw|hXi>%yY zDL25kxu&LurfV!TEs>cF7L%#G+#)f|MKKZyZ86Za!9W{i|LAH(lV>Jhrh$v zYnif#&6@S=7xvOuxsEwZ^L?DB2KFgaoqd=)ws~(6_bFSvZH%!dZbh<3ACkNxPV=t- a0|4eoa7M-5CQbkV002ovPDHLkV1l4dqzaP& diff --git a/root/static/images/catalyst_logo.png b/root/static/images/catalyst_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..21f1cac7a9e12236982adf3f548dcaee560cbabb GIT binary patch literal 13710 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 diff --git a/root/templates/main_page.tt b/root/templates/main_page.tt new file mode 100644 --- /dev/null +++ b/root/templates/main_page.tt @@ -0,0 +1,4 @@ +Welcome to a whole new world of Savannah'ing.

+ +By the way, you seem to be connecting from [% remote_host %] + diff --git a/savane.conf b/savane.conf new file mode 100644 --- /dev/null +++ b/savane.conf @@ -0,0 +1,3 @@ +# rename this file to Savane.yml and put a : in front of "name" if +# you want to use yaml like in old versions of Catalyst +name Savane diff --git a/script/savane_cgi.pl b/script/savane_cgi.pl new file mode 100755 --- /dev/null +++ b/script/savane_cgi.pl @@ -0,0 +1,36 @@ +#!/usr/bin/perl -w + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'CGI' } + +use strict; +use warnings; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use Savane; + +Savane->run; + +1; + +=head1 NAME + +savane_cgi.pl - Catalyst CGI + +=head1 SYNOPSIS + +See L + +=head1 DESCRIPTION + +Run a Catalyst application as a cgi script. + +=head1 AUTHOR + +Sebastian Riedel, C + +=head1 COPYRIGHT + +This library is free software, you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/script/savane_create.pl b/script/savane_create.pl new file mode 100755 --- /dev/null +++ b/script/savane_create.pl @@ -0,0 +1,75 @@ +#!/usr/bin/perl -w + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use Catalyst::Helper; + +my $force = 0; +my $mech = 0; +my $help = 0; + +GetOptions( + 'nonew|force' => \$force, + 'mech|mechanize' => \$mech, + 'help|?' => \$help + ); + +pod2usage(1) if ( $help || !$ARGV[0] ); + +my $helper = Catalyst::Helper->new( { '.newfiles' => !$force, mech => $mech } ); + +pod2usage(1) unless $helper->mk_component( 'Savane', @ARGV ); + +1; + +=head1 NAME + +savane_create.pl - Create a new Catalyst Component + +=head1 SYNOPSIS + +savane_create.pl [options] model|view|controller name [helper] [options] + + Options: + -force don't create a .new file where a file to be created exists + -mechanize use Test::WWW::Mechanize::Catalyst for tests if available + -help display this help and exits + + Examples: + savane_create.pl controller My::Controller + savane_create.pl controller My::Controller BindLex + savane_create.pl -mechanize controller My::Controller + savane_create.pl view My::View + savane_create.pl view MyView TT + savane_create.pl view TT TT + savane_create.pl model My::Model + savane_create.pl model SomeDB DBIC::Schema MyApp::Schema create=dynamic\ + dbi:SQLite:/tmp/my.db + savane_create.pl model AnotherDB DBIC::Schema MyApp::Schema create=static\ + dbi:Pg:dbname=foo root 4321 + + See also: + perldoc Catalyst::Manual + perldoc Catalyst::Manual::Intro + +=head1 DESCRIPTION + +Create a new Catalyst Component. + +Existing component files are not overwritten. If any of the component files +to be created already exist the file will be written with a '.new' suffix. +This behavior can be suppressed with the C<-force> option. + +=head1 AUTHOR + +Sebastian Riedel, C +Maintained by the Catalyst Core Team. + +=head1 COPYRIGHT + +This library is free software, you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/script/savane_fastcgi.pl b/script/savane_fastcgi.pl new file mode 100755 --- /dev/null +++ b/script/savane_fastcgi.pl @@ -0,0 +1,80 @@ +#!/usr/bin/perl -w + +BEGIN { $ENV{CATALYST_ENGINE} ||= 'FastCGI' } + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use Savane; + +my $help = 0; +my ( $listen, $nproc, $pidfile, $manager, $detach, $keep_stderr ); + +GetOptions( + 'help|?' => \$help, + 'listen|l=s' => \$listen, + 'nproc|n=i' => \$nproc, + 'pidfile|p=s' => \$pidfile, + 'manager|M=s' => \$manager, + 'daemon|d' => \$detach, + 'keeperr|e' => \$keep_stderr, +); + +pod2usage(1) if $help; + +Savane->run( + $listen, + { nproc => $nproc, + pidfile => $pidfile, + manager => $manager, + detach => $detach, + keep_stderr => $keep_stderr, + } +); + +1; + +=head1 NAME + +savane_fastcgi.pl - Catalyst FastCGI + +=head1 SYNOPSIS + +savane_fastcgi.pl [options] + + Options: + -? -help display this help and exits + -l -listen Socket path to listen on + (defaults to standard input) + can be HOST:PORT, :PORT or a + filesystem path + -n -nproc specify number of processes to keep + to serve requests (defaults to 1, + requires -listen) + -p -pidfile specify filename for pid file + (requires -listen) + -d -daemon daemonize (requires -listen) + -M -manager specify alternate process manager + (FCGI::ProcManager sub-class) + or empty string to disable + -e -keeperr send error messages to STDOUT, not + to the webserver + +=head1 DESCRIPTION + +Run a Catalyst application as fastcgi. + +=head1 AUTHOR + +Sebastian Riedel, C +Maintained by the Catalyst Core Team. + +=head1 COPYRIGHT + +This library is free software, you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/script/savane_server.pl b/script/savane_server.pl new file mode 100755 --- /dev/null +++ b/script/savane_server.pl @@ -0,0 +1,115 @@ +#!/usr/bin/perl -w + +BEGIN { + $ENV{CATALYST_ENGINE} ||= 'HTTP'; + $ENV{CATALYST_SCRIPT_GEN} = 31; + require Catalyst::Engine::HTTP; +} + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; + +my $debug = 0; +my $fork = 0; +my $help = 0; +my $host = undef; +my $port = $ENV{SAVANE_PORT} || $ENV{CATALYST_PORT} || 3000; +my $keepalive = 0; +my $restart = $ENV{SAVANE_RELOAD} || $ENV{CATALYST_RELOAD} || 0; +my $restart_delay = 1; +my $restart_regex = '(?:/|^)(?!\.#).+(?:\.yml$|\.yaml$|\.conf|\.pm)$'; +my $restart_directory = undef; +my $follow_symlinks = 0; + +my @argv = @ARGV; + +GetOptions( + 'debug|d' => \$debug, + 'fork' => \$fork, + 'help|?' => \$help, + 'host=s' => \$host, + 'port=s' => \$port, + 'keepalive|k' => \$keepalive, + 'restart|r' => \$restart, + 'restartdelay|rd=s' => \$restart_delay, + 'restartregex|rr=s' => \$restart_regex, + 'restartdirectory=s@' => \$restart_directory, + 'followsymlinks' => \$follow_symlinks, +); + +pod2usage(1) if $help; + +if ( $restart && $ENV{CATALYST_ENGINE} eq 'HTTP' ) { + $ENV{CATALYST_ENGINE} = 'HTTP::Restarter'; +} +if ( $debug ) { + $ENV{CATALYST_DEBUG} = 1; +} + +# This is require instead of use so that the above environment +# variables can be set at runtime. +require Savane; + +Savane->run( $port, $host, { + argv => \@argv, + 'fork' => $fork, + keepalive => $keepalive, + restart => $restart, + restart_delay => $restart_delay, + restart_regex => qr/$restart_regex/, + restart_directory => $restart_directory, + follow_symlinks => $follow_symlinks, +} ); + +1; + +=head1 NAME + +savane_server.pl - Catalyst Testserver + +=head1 SYNOPSIS + +savane_server.pl [options] + + Options: + -d -debug force debug mode + -f -fork handle each request in a new process + (defaults to false) + -? -help display this help and exits + -host host (defaults to all) + -p -port port (defaults to 3000) + -k -keepalive enable keep-alive connections + -r -restart restart when files get modified + (defaults to false) + -rd -restartdelay delay between file checks + -rr -restartregex regex match files that trigger + a restart when modified + (defaults to '\.yml$|\.yaml$|\.conf|\.pm$') + -restartdirectory the directory to search for + modified files, can be set mulitple times + (defaults to '[SCRIPT_DIR]/..') + -follow_symlinks follow symlinks in search directories + (defaults to false. this is a no-op on Win32) + See also: + perldoc Catalyst::Manual + perldoc Catalyst::Manual::Intro + +=head1 DESCRIPTION + +Run a Catalyst Testserver for this application. + +=head1 AUTHOR + +Sebastian Riedel, C +Maintained by the Catalyst Core Team. + +=head1 COPYRIGHT + +This library is free software, you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/script/savane_test.pl b/script/savane_test.pl new file mode 100755 --- /dev/null +++ b/script/savane_test.pl @@ -0,0 +1,54 @@ +#!/usr/bin/perl -w + +use strict; +use warnings; +use Getopt::Long; +use Pod::Usage; +use FindBin; +use lib "$FindBin::Bin/../lib"; +use Catalyst::Test 'Savane'; + +my $help = 0; + +GetOptions( 'help|?' => \$help ); + +pod2usage(1) if ( $help || !$ARGV[0] ); + +print request($ARGV[0])->content . "\n"; + +1; + +=head1 NAME + +savane_test.pl - Catalyst Test + +=head1 SYNOPSIS + +savane_test.pl [options] uri + + Options: + -help display this help and exits + + Examples: + savane_test.pl http://localhost/some_action + savane_test.pl /some_action + + See also: + perldoc Catalyst::Manual + perldoc Catalyst::Manual::Intro + +=head1 DESCRIPTION + +Run a Catalyst action from the command line. + +=head1 AUTHOR + +Sebastian Riedel, C +Maintained by the Catalyst Core Team. + +=head1 COPYRIGHT + +This library is free software, you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/t/01app.t b/t/01app.t new file mode 100644 --- /dev/null +++ b/t/01app.t @@ -0,0 +1,7 @@ +use strict; +use warnings; +use Test::More tests => 2; + +BEGIN { use_ok 'Catalyst::Test', 'Savane' } + +ok( request('/')->is_success, 'Request should succeed' ); diff --git a/t/02pod.t b/t/02pod.t new file mode 100644 --- /dev/null +++ b/t/02pod.t @@ -0,0 +1,9 @@ +use strict; +use warnings; +use Test::More; + +eval "use Test::Pod 1.14"; +plan skip_all => 'Test::Pod 1.14 required' if $@; +plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; + +all_pod_files_ok(); diff --git a/t/03podcoverage.t b/t/03podcoverage.t new file mode 100644 --- /dev/null +++ b/t/03podcoverage.t @@ -0,0 +1,9 @@ +use strict; +use warnings; +use Test::More; + +eval "use Test::Pod::Coverage 1.04"; +plan skip_all => 'Test::Pod::Coverage 1.04 required' if $@; +plan skip_all => 'set TEST_POD to enable this test' unless $ENV{TEST_POD}; + +all_pod_coverage_ok(); diff --git a/t/model_DB.t b/t/model_DB.t new file mode 100644 --- /dev/null +++ b/t/model_DB.t @@ -0,0 +1,6 @@ +use strict; +use warnings; +use Test::More tests => 1; + +BEGIN { use_ok 'Savane::Model::DB' } + diff --git a/t/view_TT.t b/t/view_TT.t new file mode 100644 --- /dev/null +++ b/t/view_TT.t @@ -0,0 +1,6 @@ +use strict; +use warnings; +use Test::More tests => 1; + +BEGIN { use_ok 'Savane::View::TT' } +