Mercurial > hg > soundsoftware-site
changeset 1119:22d81bd0b62c redmine-2.2-integration
Deleted existing the embedded plugin and replaced it witgh redmine_embedded (same functionality, but upgraded to be compatible with Redmine 2.x).
author | luisf <luis.figueira@eecs.qmul.ac.uk> |
---|---|
date | Tue, 08 Jan 2013 14:43:04 +0000 |
parents | 35686c1667de |
children | 55944e901e9e |
files | plugins/embedded/COPYING plugins/embedded/README plugins/embedded/RUNNING_TESTS plugins/embedded/app/controllers/embedded_controller.rb plugins/embedded/app/helpers/embedded_helper.rb plugins/embedded/app/views/embedded/index.html.erb plugins/embedded/app/views/settings/_embedded.html.erb plugins/embedded/assets/javascripts/rcov.js plugins/embedded/assets/stylesheets/doxygen.css plugins/embedded/assets/stylesheets/javadoc.css plugins/embedded/assets/stylesheets/rcov.css plugins/embedded/init.rb plugins/embedded/lib/embedded.rb plugins/embedded/test/fixtures/html/app-controllers-account_controller_rb.html plugins/embedded/test/fixtures/html/index.html plugins/embedded/test/fixtures/html/misc/misc.html plugins/embedded/test/fixtures/html/misc/misc.txt plugins/embedded/test/functional/embedded_controller_test.rb plugins/embedded/test/test_helper.rb plugins/embedded/test/unit/embedded_test.rb plugins/redmine_embedded/COPYING plugins/redmine_embedded/README.md plugins/redmine_embedded/app/controllers/redmine_embedded_controller.rb plugins/redmine_embedded/app/helpers/redmine_embedded_helper.rb plugins/redmine_embedded/app/views/redmine_embedded/_upload.html.erb plugins/redmine_embedded/app/views/redmine_embedded/index.html.erb plugins/redmine_embedded/app/views/settings/_redmine_embedded.html.erb plugins/redmine_embedded/assets/javascripts/rcov.js plugins/redmine_embedded/assets/stylesheets/doxygen.css plugins/redmine_embedded/assets/stylesheets/javadoc.css plugins/redmine_embedded/assets/stylesheets/rcov.css plugins/redmine_embedded/config/routes.rb plugins/redmine_embedded/init.rb plugins/redmine_embedded/lib/redmine_embedded.rb |
diffstat | 34 files changed, 1470 insertions(+), 2607 deletions(-) [+] |
line wrap: on
line diff
--- a/plugins/embedded/COPYING Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) 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 -this service 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 make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -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 -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the 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 a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE 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. - - 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 -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - 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 2 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision 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, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This 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.
--- a/plugins/embedded/README Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -Embedded plugin for Redmine -Copyright (C) 2008 Jean-Philippe Lang - -The plugin lets you embed html pages (eg. documentation, test reports) in your projects. - -See: http://www.redmine.org/wiki/redmine/PluginEmbedded
--- a/plugins/embedded/RUNNING_TESTS Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -rake test:plugins PLUGIN=embedded
--- a/plugins/embedded/app/controllers/embedded_controller.rb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2008 Jean-Philippe Lang -# -# 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 2 -# 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -require 'iconv' - -class EmbeddedController < ApplicationController - class EmbeddedControllerError < StandardError; end - - unloadable - layout 'base' - before_filter :find_project, :authorize - - def index - path = get_real_path(params[:path]) - if File.directory?(path) - file = get_index_file(path) - target = params[:path] || [] - target << file - # Forces redirect to the index file when the requested path is a directory - # so that relative links in embedded html pages work - redirect_to :path => target - return - end - - # Check file extension - raise EmbeddedControllerError.new('This file can not be viewed (invalid extension).') unless Redmine::Plugins::Embedded.valid_extension?(path) - - if Redmine::MimeType.is_type?('image', path) - send_file path, :disposition => 'inline', :type => Redmine::MimeType.of(path) - else - embed_file path - end - - rescue Errno::ENOENT => e - # File was not found - render_404 - rescue Errno::EACCES => e - # Can not read the file - render_error "Unable to read the file: #{e.message}" - rescue EmbeddedControllerError => e - render_error e.message - end - - private - - def find_project - @project = Project.find(params[:id]) - rescue ActiveRecord::RecordNotFound - render_404 - end - - # Return the path to the html root directory for the current project - def get_project_directory - @project_directory ||= Setting.plugin_embedded['path'].to_s.gsub('{PROJECT}', @project.identifier) - end - - # Returns the absolute path of the requested file - # Parameter is an Array - def get_real_path(path) - real = get_project_directory - real = File.join(real, path) unless path.nil? || path.empty? - dir = File.expand_path(get_project_directory) - real = File.expand_path(real) - raise Errno::ENOENT unless real.starts_with?(dir) && File.exist?(real) - real - end - - # Returns the index file in the given directory - # and raises an exception if none is found - def get_index_file(dir) - indexes = Setting.plugin_embedded['index'].to_s.split - file = indexes.find {|f| File.exist?(File.join(dir, f))} - raise EmbeddedControllerError.new("No index file found in #{dir} (#{indexes.join(', ')}).") if file.nil? - file - end - - # Renders a given HTML file - def embed_file(path) - @content = File.read(path) - - # Extract html title from embedded page - if @content =~ %r{<title>([^<]*)</title>}mi - @title = $1.strip - end - - # Keep html body only - @content.gsub!(%r{^.*<body[^>]*>(.*)</body>.*$}mi, '\\1') - - # Re-encode content if needed - source_encoding = Setting.plugin_embedded['encoding'].to_s - unless source_encoding.blank? - begin; @content = Iconv.new('UTF-8', source_encoding).iconv(@content); rescue; end - end - - @doc_template = Redmine::Plugins::Embedded.detect_template_from_path(path) - render :action => 'index' - end -end
--- a/plugins/embedded/app/helpers/embedded_helper.rb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2008 Jean-Philippe Lang -# -# 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 2 -# 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -module EmbeddedHelper - - # Adds include tags for assets of the given template - def asset_include_tags(template) - - Redmine::Plugins::Embedded.assets(template).each { |asset| content_for(:header_tags) { asset_include_tag(asset) } } - end - - private - - def asset_include_tag(asset) - if asset =~ %r{\.js$} - javascript_include_tag(asset, :plugin => 'embedded') - else - stylesheet_link_tag(asset, :plugin => 'embedded') - end - end -end
--- a/plugins/embedded/app/views/embedded/index.html.erb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -<!-- Embedded page --> -<div class="embedded"> -<%= @content %> -</div> -<!-- Embedded page end --> - -<% html_title(@title) if @title %> - -<% asset_include_tags(@doc_template) %>
--- a/plugins/embedded/app/views/settings/_embedded.html.erb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -<p><label>HTML directory</label> -<%= text_field_tag 'settings[path]', @settings['path'], :size => 80 %> -<br /><em>Use {PROJECT} to include the project identifier in the path</em></p> - -<p><label>Index files</label> -<%= text_area_tag 'settings[index]', @settings['index'], :cols => 60, :rows => 3 %> -<br /><em>Space separated list of index files by priority</em></p> - -<p><label>Valid extensions</label> -<%= text_area_tag 'settings[extensions]', @settings['extensions'], :cols => 60, :rows => 3 %> -<br /><em>Space separated list of file extensions that can be viewed (case insensitive)</em></p> - -<p><label>Default template</label> -<%= select_tag 'settings[template]', options_for_select([''] + Redmine::Plugins::Embedded.available_templates, @settings['template']) %></p> - -<p><label>Files encoding</label> -<%= text_field_tag 'settings[encoding]', @settings['encoding'] %> -<br /><em>Eg. ISO-8859-1<br />Leave this field empty if HTML files are UTF-8 encoded</em></p> - -<p><label>Menu caption</label> -<%= text_field_tag 'settings[menu]', @settings['menu'], :size => 30 %> -<br /><em>Clear this field if you don't want to add a tab to the project menu</em></p>
--- a/plugins/embedded/assets/javascripts/rcov.js Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ -function toggleCode( id ) { - if ( document.getElementById ) - elem = document.getElementById( id ); - else if ( document.all ) - elem = eval( "document.all." + id ); - else - return false; - - elemStyle = elem.style; - - if ( elemStyle.display != "block" ) { - elemStyle.display = "block" - } else { - elemStyle.display = "none" - } - - return true; -}
--- a/plugins/embedded/assets/stylesheets/doxygen.css Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,174 +0,0 @@ -#content { - font-family: Geneva, Arial, Helvetica, sans-serif; -} -#content h1, h2, h3 {border: 0;} -#content h1 {margin-bottom: 1em;} -#content CAPTION { font-weight: bold } -#content DIV.qindex { - line-height: 120%; - margin-bottom: 1em; -} -#content A.qindex { - text-decoration: none; - font-weight: bold; - padding: 2px; -} -#content A.qindexHL { - text-decoration: underline; - font-weight: bold; - padding: 2px; -} -#content A.el { text-decoration: none; font-weight: bold } -#content A.elRef { font-weight: bold } -#content A.code { text-decoration: none; font-weight: normal; color: #1A419D} -#content A.codeRef { font-weight: normal; color: #1A419D} -#content DL.el { margin-left: -1cm } -#content PRE.fragment { - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - margin-top: 4px; - margin-bottom: 4px; - margin-left: 2px; - margin-right: 8px; - padding-left: 6px; - padding-right: 6px; - padding-top: 4px; - padding-bottom: 4px; -} -#content DIV.fragment { - border: 1px solid #CCCCCC; - background-color: #f5f5f5; - padding: 6px; -} -#content DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } -#content TD.md { background-color: #F4F4FB; font-weight: bold; } -#content TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } -#content TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } -#content DIV.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold; - font-family: Geneva, Arial, Helvetica, sans-serif; -} -#content DIV.groupText { margin-left: 16px; font-style: italic; font-size: 14px } -#content TD.indexkey { - background-color: #eeeeff; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px; - border: 1px solid #CCCCCC; -} -#content TD.indexvalue { - background-color: #eeeeff; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px; - border: 1px solid #CCCCCC; -} -#content TR.memlist { - background-color: #f0f0f0; -} -#content P.formulaDsp { text-align: center; } -#content IMG.formulaDsp { } -#content IMG.formulaInl { vertical-align: middle; } -#content SPAN.keyword { color: #008000 } -#content SPAN.keywordtype { color: #604020 } -#content SPAN.keywordflow { color: #e08000 } -#content SPAN.comment { color: #800000 } -#content SPAN.preprocessor { color: #806020 } -#content SPAN.stringliteral { color: #002080 } -#content SPAN.charliteral { color: #008080 } -#content .mdTable { - border: 1px solid #868686; - background-color: #F4F4FB; -} -#content .mdRow { - padding: 8px 10px; -} -#content .mdescLeft { - padding: 0px 8px 4px 8px; - font-size: 14px; - font-style: italic; - background-color: #FAFAFA; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; -} -#content .mdescRight { - padding: 0px 8px 4px 8px; - font-size: 14px; - font-style: italic; - background-color: #FAFAFA; - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; -} -#content .memItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-style: solid; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-family: Geneva, Arial, Helvetica, sans-serif; - font-size: 12px; -} -#content .memItemRight { - padding: 1px 8px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-style: solid; - border-top-color: #E0E0E0; - border-right-color: #E0E0E0; - border-bottom-color: #E0E0E0; - border-left-color: #E0E0E0; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - background-color: #FAFAFA; - font-family: Geneva, Arial, Helvetica, sans-serif; - font-size: 13px; -} -#content .search { color: #003399; - font-weight: bold; -} -#content FORM.search { - margin-bottom: 0px; - margin-top: 0px; -} -#content INPUT.search { font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #eeeeff; -} -#content TD.tiny { font-size: 75%; -}
--- a/plugins/embedded/assets/stylesheets/javadoc.css Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -/* Javadoc style sheet */ - -/* Table colors */ -.TableHeadingColor { background: #eef; } /* Dark mauve */ -.TableHeadingColor th b { font-size: 70%; } -.TableSubHeadingColor { background: #EEEEee; } /* Light mauve */ -.TableRowColor { background: #FFFFFF; } /* White */ - -/* Font used in left-hand frame lists */ -.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } -.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } - -/* Navigation bar fonts and colors */ -.NavBarCell1 { background-color: inherit; } /* Light mauve */ -.NavBarCell1Rev { background-color: inherit; } /* Dark Blue */ -.NavBarFont1 { font-family: Arial, Helvetica, sans-serif;} -.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; font-style: underline; } - -.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000; display: none;} -.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} - -#content table { border-collapse: collapse; border-color: #ddd; }
--- a/plugins/embedded/assets/stylesheets/rcov.css Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,525 +0,0 @@ -span.cross-ref-title { - font-size: 140%; -} -span.cross-ref a { - text-decoration: none; -} -span.cross-ref { - background-color:#f3f7fa; - border: 1px dashed #333; - margin: 1em; - padding: 0.5em; - overflow: hidden; -} -a.crossref-toggle { - text-decoration: none; -} -span.marked0 { - background-color: rgb(185, 210, 200); - display: block; -} -span.marked1 { - background-color: rgb(190, 215, 205); - display: block; -} -span.inferred0 { - background-color: rgb(175, 200, 200); - display: block; -} -span.inferred1 { - background-color: rgb(180, 205, 205); - display: block; -} -span.uncovered0 { - background-color: rgb(225, 110, 110); - display: block; -} -span.uncovered1 { - background-color: rgb(235, 120, 120); - display: block; -} -span.overview { - border-bottom: 8px solid black; -} -div.overview { - border-bottom: 8px solid black; -} -#content div.footer { - font-size: 68%; - margin-top: 1.5em; -} -#content h1, h2, h3, h4, h5, h6 { - margin-bottom: 0.5em; -} -h5 { - margin-top: 0.5em; -} -.hidden { - display: none; -} -div.separator { - height: 10px; -} -/* Commented out for better readability, esp. on IE */ -/* -table tr td, table tr th { - font-size: 68%; -} -td.value table tr td { - font-size: 11px; -} -*/ -table.percent_graph { - height: 12px; - border: #808080 1px solid; - empty-cells: show; -} -table.percent_graph td.covered { - height: 10px; - background: #00f000; -} -table.percent_graph td.uncovered { - height: 10px; - background: #e00000; -} -table.percent_graph td.NA { - height: 10px; - background: #eaeaea; -} -table.report { - border-collapse: collapse; - width: 100%; -} -table.report td.heading { - background: #dcecff; - border: #d0d0d0 1px solid; - font-weight: bold; - text-align: center; -} -table.report td.heading:hover { - background: #c0ffc0; -} -table.report td.text { - border: #d0d0d0 1px solid; -} -table.report td.value, -table.report td.lines_total, -table.report td.lines_code { - text-align: right; - border: #d0d0d0 1px solid; -} -table.report tr.light { - background-color: #f6f7f8; -} -table.report tr.dark { - background-color: #fff; -} -span.run0 { - background-color: rgb(178, 204, 255); - display: block; -} -span.run1 { - background-color: rgb(178, 206, 255); - display: block; -} -span.run2 { - background-color: rgb(178, 209, 255); - display: block; -} -span.run3 { - background-color: rgb(178, 211, 255); - display: block; -} -span.run4 { - background-color: rgb(178, 214, 255); - display: block; -} -span.run5 { - background-color: rgb(178, 218, 255); - display: block; -} -span.run6 { - background-color: rgb(178, 220, 255); - display: block; -} -span.run7 { - background-color: rgb(178, 223, 255); - display: block; -} -span.run8 { - background-color: rgb(178, 225, 255); - display: block; -} -span.run9 { - background-color: rgb(178, 228, 255); - display: block; -} -span.run10 { - background-color: rgb(178, 232, 255); - display: block; -} -span.run11 { - background-color: rgb(178, 234, 255); - display: block; -} -span.run12 { - background-color: rgb(178, 237, 255); - display: block; -} -span.run13 { - background-color: rgb(178, 239, 255); - display: block; -} -span.run14 { - background-color: rgb(178, 242, 255); - display: block; -} -span.run15 { - background-color: rgb(178, 246, 255); - display: block; -} -span.run16 { - background-color: rgb(178, 248, 255); - display: block; -} -span.run17 { - background-color: rgb(178, 251, 255); - display: block; -} -span.run18 { - background-color: rgb(178, 253, 255); - display: block; -} -span.run19 { - background-color: rgb(178, 255, 253); - display: block; -} -span.run20 { - background-color: rgb(178, 255, 249); - display: block; -} -span.run21 { - background-color: rgb(178, 255, 247); - display: block; -} -span.run22 { - background-color: rgb(178, 255, 244); - display: block; -} -span.run23 { - background-color: rgb(178, 255, 242); - display: block; -} -span.run24 { - background-color: rgb(178, 255, 239); - display: block; -} -span.run25 { - background-color: rgb(178, 255, 235); - display: block; -} -span.run26 { - background-color: rgb(178, 255, 233); - display: block; -} -span.run27 { - background-color: rgb(178, 255, 230); - display: block; -} -span.run28 { - background-color: rgb(178, 255, 228); - display: block; -} -span.run29 { - background-color: rgb(178, 255, 225); - display: block; -} -span.run30 { - background-color: rgb(178, 255, 221); - display: block; -} -span.run31 { - background-color: rgb(178, 255, 219); - display: block; -} -span.run32 { - background-color: rgb(178, 255, 216); - display: block; -} -span.run33 { - background-color: rgb(178, 255, 214); - display: block; -} -span.run34 { - background-color: rgb(178, 255, 211); - display: block; -} -span.run35 { - background-color: rgb(178, 255, 207); - display: block; -} -span.run36 { - background-color: rgb(178, 255, 205); - display: block; -} -span.run37 { - background-color: rgb(178, 255, 202); - display: block; -} -span.run38 { - background-color: rgb(178, 255, 200); - display: block; -} -span.run39 { - background-color: rgb(178, 255, 197); - display: block; -} -span.run40 { - background-color: rgb(178, 255, 193); - display: block; -} -span.run41 { - background-color: rgb(178, 255, 191); - display: block; -} -span.run42 { - background-color: rgb(178, 255, 188); - display: block; -} -span.run43 { - background-color: rgb(178, 255, 186); - display: block; -} -span.run44 { - background-color: rgb(178, 255, 183); - display: block; -} -span.run45 { - background-color: rgb(178, 255, 179); - display: block; -} -span.run46 { - background-color: rgb(179, 255, 178); - display: block; -} -span.run47 { - background-color: rgb(182, 255, 178); - display: block; -} -span.run48 { - background-color: rgb(184, 255, 178); - display: block; -} -span.run49 { - background-color: rgb(187, 255, 178); - display: block; -} -span.run50 { - background-color: rgb(191, 255, 178); - display: block; -} -span.run51 { - background-color: rgb(193, 255, 178); - display: block; -} -span.run52 { - background-color: rgb(196, 255, 178); - display: block; -} -span.run53 { - background-color: rgb(198, 255, 178); - display: block; -} -span.run54 { - background-color: rgb(201, 255, 178); - display: block; -} -span.run55 { - background-color: rgb(205, 255, 178); - display: block; -} -span.run56 { - background-color: rgb(207, 255, 178); - display: block; -} -span.run57 { - background-color: rgb(210, 255, 178); - display: block; -} -span.run58 { - background-color: rgb(212, 255, 178); - display: block; -} -span.run59 { - background-color: rgb(215, 255, 178); - display: block; -} -span.run60 { - background-color: rgb(219, 255, 178); - display: block; -} -span.run61 { - background-color: rgb(221, 255, 178); - display: block; -} -span.run62 { - background-color: rgb(224, 255, 178); - display: block; -} -span.run63 { - background-color: rgb(226, 255, 178); - display: block; -} -span.run64 { - background-color: rgb(229, 255, 178); - display: block; -} -span.run65 { - background-color: rgb(233, 255, 178); - display: block; -} -span.run66 { - background-color: rgb(235, 255, 178); - display: block; -} -span.run67 { - background-color: rgb(238, 255, 178); - display: block; -} -span.run68 { - background-color: rgb(240, 255, 178); - display: block; -} -span.run69 { - background-color: rgb(243, 255, 178); - display: block; -} -span.run70 { - background-color: rgb(247, 255, 178); - display: block; -} -span.run71 { - background-color: rgb(249, 255, 178); - display: block; -} -span.run72 { - background-color: rgb(252, 255, 178); - display: block; -} -span.run73 { - background-color: rgb(255, 255, 178); - display: block; -} -span.run74 { - background-color: rgb(255, 252, 178); - display: block; -} -span.run75 { - background-color: rgb(255, 248, 178); - display: block; -} -span.run76 { - background-color: rgb(255, 246, 178); - display: block; -} -span.run77 { - background-color: rgb(255, 243, 178); - display: block; -} -span.run78 { - background-color: rgb(255, 240, 178); - display: block; -} -span.run79 { - background-color: rgb(255, 238, 178); - display: block; -} -span.run80 { - background-color: rgb(255, 234, 178); - display: block; -} -span.run81 { - background-color: rgb(255, 232, 178); - display: block; -} -span.run82 { - background-color: rgb(255, 229, 178); - display: block; -} -span.run83 { - background-color: rgb(255, 226, 178); - display: block; -} -span.run84 { - background-color: rgb(255, 224, 178); - display: block; -} -span.run85 { - background-color: rgb(255, 220, 178); - display: block; -} -span.run86 { - background-color: rgb(255, 218, 178); - display: block; -} -span.run87 { - background-color: rgb(255, 215, 178); - display: block; -} -span.run88 { - background-color: rgb(255, 212, 178); - display: block; -} -span.run89 { - background-color: rgb(255, 210, 178); - display: block; -} -span.run90 { - background-color: rgb(255, 206, 178); - display: block; -} -span.run91 { - background-color: rgb(255, 204, 178); - display: block; -} -span.run92 { - background-color: rgb(255, 201, 178); - display: block; -} -span.run93 { - background-color: rgb(255, 198, 178); - display: block; -} -span.run94 { - background-color: rgb(255, 196, 178); - display: block; -} -span.run95 { - background-color: rgb(255, 192, 178); - display: block; -} -span.run96 { - background-color: rgb(255, 189, 178); - display: block; -} -span.run97 { - background-color: rgb(255, 187, 178); - display: block; -} -span.run98 { - background-color: rgb(255, 184, 178); - display: block; -} -span.run99 { - background-color: rgb(255, 182, 178); - display: block; -} -span.run100 { - background-color: rgb(255, 178, 178); - display: block; -} -pre { - white-space: pre-wrap; /* CSS2.1 compliant */ - white-space: -moz-pre-wrap; /* Mozilla-based browsers */ - white-space: -o-pre-wrap; /* Opera 7+ */ -}
--- a/plugins/embedded/init.rb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -require 'redmine' -require 'embedded' - -Redmine::Plugin.register :embedded do - name 'Embedded' - author 'Jean-Philippe Lang' - description 'Embed various documentations in your projects' - version '0.0.1' - settings :default => { 'path' => '/var/doc/{PROJECT}/html', - 'index' => 'main.html overview-summary.html index.html', - 'extensions' => 'html png gif', - 'template' => '', - 'encoding' => '', - 'menu' => 'Embedded' }, - :partial => 'settings/embedded' - - project_module :embedded do - permission :view_embedded_doc, {:embedded => :index} - end - - menu :project_menu, :embedded, { :controller => 'embedded', :action => 'index', :path => nil }, - :caption => Proc.new { Setting.plugin_embedded['menu'] }, - :if => Proc.new { !Setting.plugin_embedded['menu'].blank? } -end - -# Routes -class << ActionController::Routing::Routes;self;end.class_eval do - define_method :clear!, lambda {} -end - -ActionController::Routing::Routes.draw do |map| - map.connect 'embedded/:id/*path', :controller => 'embedded', :action => 'index' -end
--- a/plugins/embedded/lib/embedded.rb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2008 Jean-Philippe Lang -# -# 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 2 -# 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -module Redmine - module Plugins - module Embedded - class << self - - # Returns an Array of available templates - def available_templates - assets_by_template.keys.sort - end - - # Returns the assets for a given template - def assets(template) - assets_by_template.has_key?(template) ? assets_by_template[template] : [] - end - - def detect_template_from_path(path) - t = path.to_s.split(%r{[/\\]}) & available_templates - t.empty? ? Setting.plugin_embedded['template'].to_s : t.first - end - - def valid_extension?(path) - extensions = Setting.plugin_embedded['extensions'].to_s.split.each(&:downcase) - extensions.include?(File.extname(path).downcase[1..-1]) - end - - private - - # A Hash of available assets by template - def assets_by_template - @@assets_by_template ||= scan_assets - end - - # Scans assets directory for templates - # and returns a Hash of available assets by template - def scan_assets - a = Hash.new {|h,k| h[k] = [] } - Dir.glob(File.join(File.dirname(__FILE__), '../assets/*/*.{css,js}')).each do |asset| - asset = File.basename(asset) - template = asset.gsub(%r{\.(js|css)$}, '') - a[template] << asset - end - a - end - end - end - end -end
--- a/plugins/embedded/test/fixtures/html/app-controllers-account_controller_rb.html Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,783 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>app/controllers/account_controller.rb - C0 code coverage information</title> - <style type='text/css'>body { background-color: rgb(240, 240, 245); }</style> - <style type='text/css'>span.cross-ref-title { - font-size: 140%; -} -span.cross-ref a { - text-decoration: none; -} -span.cross-ref { - background-color:#f3f7fa; - border: 1px dashed #333; - margin: 1em; - padding: 0.5em; - overflow: hidden; -} -a.crossref-toggle { - text-decoration: none; -} -span.marked0 { - background-color: rgb(185, 210, 200); - display: block; -} -span.marked1 { - background-color: rgb(190, 215, 205); - display: block; -} -span.inferred0 { - background-color: rgb(175, 200, 200); - display: block; -} -span.inferred1 { - background-color: rgb(180, 205, 205); - display: block; -} -span.uncovered0 { - background-color: rgb(225, 110, 110); - display: block; -} -span.uncovered1 { - background-color: rgb(235, 120, 120); - display: block; -} -span.overview { - border-bottom: 8px solid black; -} -div.overview { - border-bottom: 8px solid black; -} -body { - font-family: verdana, arial, helvetica; -} -div.footer { - font-size: 68%; - margin-top: 1.5em; -} -h1, h2, h3, h4, h5, h6 { - margin-bottom: 0.5em; -} -h5 { - margin-top: 0.5em; -} -.hidden { - display: none; -} -div.separator { - height: 10px; -} -/* Commented out for better readability, esp. on IE */ -/* -table tr td, table tr th { - font-size: 68%; -} -td.value table tr td { - font-size: 11px; -} -*/ -table.percent_graph { - height: 12px; - border: #808080 1px solid; - empty-cells: show; -} -table.percent_graph td.covered { - height: 10px; - background: #00f000; -} -table.percent_graph td.uncovered { - height: 10px; - background: #e00000; -} -table.percent_graph td.NA { - height: 10px; - background: #eaeaea; -} -table.report { - border-collapse: collapse; - width: 100%; -} -table.report td.heading { - background: #dcecff; - border: #d0d0d0 1px solid; - font-weight: bold; - text-align: center; -} -table.report td.heading:hover { - background: #c0ffc0; -} -table.report td.text { - border: #d0d0d0 1px solid; -} -table.report td.value, -table.report td.lines_total, -table.report td.lines_code { - text-align: right; - border: #d0d0d0 1px solid; -} -table.report tr.light { - background-color: rgb(240, 240, 245); -} -table.report tr.dark { - background-color: rgb(230, 230, 235); -} -</style> - <script type='text/javascript'> -// <![CDATA[ - function toggleCode( id ) { - if ( document.getElementById ) - elem = document.getElementById( id ); - else if ( document.all ) - elem = eval( "document.all." + id ); - else - return false; - - elemStyle = elem.style; - - if ( elemStyle.display != "block" ) { - elemStyle.display = "block" - } else { - elemStyle.display = "none" - } - - return true; - } - - // Make cross-references hidden by default - document.writeln( "<style type=\"text/css\">span.cross-ref { display: none }</style>" ) - // ]]> -</script> - <style type='text/css'>span.run0 { - background-color: rgb(178, 204, 255); - display: block; -} -span.run1 { - background-color: rgb(178, 206, 255); - display: block; -} -span.run2 { - background-color: rgb(178, 209, 255); - display: block; -} -span.run3 { - background-color: rgb(178, 211, 255); - display: block; -} -span.run4 { - background-color: rgb(178, 214, 255); - display: block; -} -span.run5 { - background-color: rgb(178, 218, 255); - display: block; -} -span.run6 { - background-color: rgb(178, 220, 255); - display: block; -} -span.run7 { - background-color: rgb(178, 223, 255); - display: block; -} -span.run8 { - background-color: rgb(178, 225, 255); - display: block; -} -span.run9 { - background-color: rgb(178, 228, 255); - display: block; -} -span.run10 { - background-color: rgb(178, 232, 255); - display: block; -} -span.run11 { - background-color: rgb(178, 234, 255); - display: block; -} -span.run12 { - background-color: rgb(178, 237, 255); - display: block; -} -span.run13 { - background-color: rgb(178, 239, 255); - display: block; -} -span.run14 { - background-color: rgb(178, 242, 255); - display: block; -} -span.run15 { - background-color: rgb(178, 246, 255); - display: block; -} -span.run16 { - background-color: rgb(178, 248, 255); - display: block; -} -span.run17 { - background-color: rgb(178, 251, 255); - display: block; -} -span.run18 { - background-color: rgb(178, 253, 255); - display: block; -} -span.run19 { - background-color: rgb(178, 255, 253); - display: block; -} -span.run20 { - background-color: rgb(178, 255, 249); - display: block; -} -span.run21 { - background-color: rgb(178, 255, 247); - display: block; -} -span.run22 { - background-color: rgb(178, 255, 244); - display: block; -} -span.run23 { - background-color: rgb(178, 255, 242); - display: block; -} -span.run24 { - background-color: rgb(178, 255, 239); - display: block; -} -span.run25 { - background-color: rgb(178, 255, 235); - display: block; -} -span.run26 { - background-color: rgb(178, 255, 233); - display: block; -} -span.run27 { - background-color: rgb(178, 255, 230); - display: block; -} -span.run28 { - background-color: rgb(178, 255, 228); - display: block; -} -span.run29 { - background-color: rgb(178, 255, 225); - display: block; -} -span.run30 { - background-color: rgb(178, 255, 221); - display: block; -} -span.run31 { - background-color: rgb(178, 255, 219); - display: block; -} -span.run32 { - background-color: rgb(178, 255, 216); - display: block; -} -span.run33 { - background-color: rgb(178, 255, 214); - display: block; -} -span.run34 { - background-color: rgb(178, 255, 211); - display: block; -} -span.run35 { - background-color: rgb(178, 255, 207); - display: block; -} -span.run36 { - background-color: rgb(178, 255, 205); - display: block; -} -span.run37 { - background-color: rgb(178, 255, 202); - display: block; -} -span.run38 { - background-color: rgb(178, 255, 200); - display: block; -} -span.run39 { - background-color: rgb(178, 255, 197); - display: block; -} -span.run40 { - background-color: rgb(178, 255, 193); - display: block; -} -span.run41 { - background-color: rgb(178, 255, 191); - display: block; -} -span.run42 { - background-color: rgb(178, 255, 188); - display: block; -} -span.run43 { - background-color: rgb(178, 255, 186); - display: block; -} -span.run44 { - background-color: rgb(178, 255, 183); - display: block; -} -span.run45 { - background-color: rgb(178, 255, 179); - display: block; -} -span.run46 { - background-color: rgb(179, 255, 178); - display: block; -} -span.run47 { - background-color: rgb(182, 255, 178); - display: block; -} -span.run48 { - background-color: rgb(184, 255, 178); - display: block; -} -span.run49 { - background-color: rgb(187, 255, 178); - display: block; -} -span.run50 { - background-color: rgb(191, 255, 178); - display: block; -} -span.run51 { - background-color: rgb(193, 255, 178); - display: block; -} -span.run52 { - background-color: rgb(196, 255, 178); - display: block; -} -span.run53 { - background-color: rgb(198, 255, 178); - display: block; -} -span.run54 { - background-color: rgb(201, 255, 178); - display: block; -} -span.run55 { - background-color: rgb(205, 255, 178); - display: block; -} -span.run56 { - background-color: rgb(207, 255, 178); - display: block; -} -span.run57 { - background-color: rgb(210, 255, 178); - display: block; -} -span.run58 { - background-color: rgb(212, 255, 178); - display: block; -} -span.run59 { - background-color: rgb(215, 255, 178); - display: block; -} -span.run60 { - background-color: rgb(219, 255, 178); - display: block; -} -span.run61 { - background-color: rgb(221, 255, 178); - display: block; -} -span.run62 { - background-color: rgb(224, 255, 178); - display: block; -} -span.run63 { - background-color: rgb(226, 255, 178); - display: block; -} -span.run64 { - background-color: rgb(229, 255, 178); - display: block; -} -span.run65 { - background-color: rgb(233, 255, 178); - display: block; -} -span.run66 { - background-color: rgb(235, 255, 178); - display: block; -} -span.run67 { - background-color: rgb(238, 255, 178); - display: block; -} -span.run68 { - background-color: rgb(240, 255, 178); - display: block; -} -span.run69 { - background-color: rgb(243, 255, 178); - display: block; -} -span.run70 { - background-color: rgb(247, 255, 178); - display: block; -} -span.run71 { - background-color: rgb(249, 255, 178); - display: block; -} -span.run72 { - background-color: rgb(252, 255, 178); - display: block; -} -span.run73 { - background-color: rgb(255, 255, 178); - display: block; -} -span.run74 { - background-color: rgb(255, 252, 178); - display: block; -} -span.run75 { - background-color: rgb(255, 248, 178); - display: block; -} -span.run76 { - background-color: rgb(255, 246, 178); - display: block; -} -span.run77 { - background-color: rgb(255, 243, 178); - display: block; -} -span.run78 { - background-color: rgb(255, 240, 178); - display: block; -} -span.run79 { - background-color: rgb(255, 238, 178); - display: block; -} -span.run80 { - background-color: rgb(255, 234, 178); - display: block; -} -span.run81 { - background-color: rgb(255, 232, 178); - display: block; -} -span.run82 { - background-color: rgb(255, 229, 178); - display: block; -} -span.run83 { - background-color: rgb(255, 226, 178); - display: block; -} -span.run84 { - background-color: rgb(255, 224, 178); - display: block; -} -span.run85 { - background-color: rgb(255, 220, 178); - display: block; -} -span.run86 { - background-color: rgb(255, 218, 178); - display: block; -} -span.run87 { - background-color: rgb(255, 215, 178); - display: block; -} -span.run88 { - background-color: rgb(255, 212, 178); - display: block; -} -span.run89 { - background-color: rgb(255, 210, 178); - display: block; -} -span.run90 { - background-color: rgb(255, 206, 178); - display: block; -} -span.run91 { - background-color: rgb(255, 204, 178); - display: block; -} -span.run92 { - background-color: rgb(255, 201, 178); - display: block; -} -span.run93 { - background-color: rgb(255, 198, 178); - display: block; -} -span.run94 { - background-color: rgb(255, 196, 178); - display: block; -} -span.run95 { - background-color: rgb(255, 192, 178); - display: block; -} -span.run96 { - background-color: rgb(255, 189, 178); - display: block; -} -span.run97 { - background-color: rgb(255, 187, 178); - display: block; -} -span.run98 { - background-color: rgb(255, 184, 178); - display: block; -} -span.run99 { - background-color: rgb(255, 182, 178); - display: block; -} -span.run100 { - background-color: rgb(255, 178, 178); - display: block; -} -</style> - </head> - <body><h3>C0 code coverage information</h3> - <p>Generated on Tue Jun 24 21:43:53 +0200 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a> - </p> - <hr/> - <pre><span class='marked0'>Code reported as executed by Ruby looks like this... -</span><span class='marked1'>and this: this line is also marked as covered. -</span><span class='inferred0'>Lines considered as run by rcov, but not reported by Ruby, look like this, -</span><span class='inferred1'>and this: these lines were inferred by rcov (using simple heuristics). -</span><span class='uncovered0'>Finally, here's a line marked as not executed. -</span></pre> -<table class='report'><thead><tr><td class='heading'>Name</td> - <td class='heading'>Total lines</td> - <td class='heading'>Lines of code</td> - <td class='heading'>Total coverage</td> - <td class='heading'>Code coverage</td> - </tr> - </thead> - <tbody><tr class='light'><td><a href='app-controllers-account_controller_rb.html'>app/controllers/account_controller.rb</a> - </td> - <td class='lines_total'><tt>173</tt> - </td> - <td class='lines_code'><tt>129</tt> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>98.8%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='99'/> - <td class='uncovered' width='1'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>98.4%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='98'/> - <td class='uncovered' width='2'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - </tr> - </tbody> - </table> -<pre><span class="inferred0"><a name="line1"></a> 1 # redMine - project management software -</span><span class="inferred1"><a name="line2"></a> 2 # Copyright (C) 2006-2007 Jean-Philippe Lang -</span><span class="inferred0"><a name="line3"></a> 3 # -</span><span class="inferred1"><a name="line4"></a> 4 # This program is free software; you can redistribute it and/or -</span><span class="inferred0"><a name="line5"></a> 5 # modify it under the terms of the GNU General Public License -</span><span class="inferred1"><a name="line6"></a> 6 # as published by the Free Software Foundation; either version 2 -</span><span class="inferred0"><a name="line7"></a> 7 # of the License, or (at your option) any later version. -</span><span class="inferred1"><a name="line8"></a> 8 # -</span><span class="inferred0"><a name="line9"></a> 9 # This program is distributed in the hope that it will be useful, -</span><span class="inferred1"><a name="line10"></a> 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of -</span><span class="inferred0"><a name="line11"></a> 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -</span><span class="inferred1"><a name="line12"></a> 12 # GNU General Public License for more details. -</span><span class="inferred0"><a name="line13"></a> 13 # -</span><span class="inferred1"><a name="line14"></a> 14 # You should have received a copy of the GNU General Public License -</span><span class="inferred0"><a name="line15"></a> 15 # along with this program; if not, write to the Free Software -</span><span class="inferred1"><a name="line16"></a> 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -</span><span class="inferred0"><a name="line17"></a> 17 -</span><span class="marked1"><a name="line18"></a> 18 class AccountController < ApplicationController -</span><span class="marked0"><a name="line19"></a> 19 layout 'base' -</span><span class="marked1"><a name="line20"></a> 20 helper :custom_fields -</span><span class="marked0"><a name="line21"></a> 21 include CustomFieldsHelper -</span><span class="inferred1"><a name="line22"></a> 22 -</span><span class="inferred0"><a name="line23"></a> 23 # prevents login action to be filtered by check_if_login_required application scope filter -</span><span class="marked1"><a name="line24"></a> 24 skip_before_filter :check_if_login_required, :only => [:login, :lost_password, :register, :activate] -</span><span class="inferred0"><a name="line25"></a> 25 -</span><span class="inferred1"><a name="line26"></a> 26 # Show user's account -</span><span class="marked0"><a name="line27"></a> 27 def show -</span><span class="marked1"><a name="line28"></a> 28 @user = User.find_active(params[:id]) -</span><span class="marked0"><a name="line29"></a> 29 @custom_values = @user.custom_values.find(:all, :include => :custom_field) -</span><span class="inferred1"><a name="line30"></a> 30 -</span><span class="inferred0"><a name="line31"></a> 31 # show only public projects and private projects that the logged in user is also a member of -</span><span class="marked1"><a name="line32"></a> 32 @memberships = @user.memberships.select do |membership| -</span><span class="marked0"><a name="line33"></a> 33 membership.project.is_public? || (User.current.member_of?(membership.project)) -</span><span class="inferred1"><a name="line34"></a> 34 end -</span><span class="inferred0"><a name="line35"></a> 35 rescue ActiveRecord::RecordNotFound -</span><span class="marked1"><a name="line36"></a> 36 render_404 -</span><span class="marked0"><a name="line37"></a> 37 end -</span><span class="inferred1"><a name="line38"></a> 38 -</span><span class="inferred0"><a name="line39"></a> 39 # Login request and validation -</span><span class="marked1"><a name="line40"></a> 40 def login -</span><span class="marked0"><a name="line41"></a> 41 if request.get? -</span><span class="inferred1"><a name="line42"></a> 42 # Logout user -</span><span class="marked0"><a name="line43"></a> 43 self.logged_user = nil -</span><span class="inferred1"><a name="line44"></a> 44 else -</span><span class="inferred0"><a name="line45"></a> 45 # Authenticate user -</span><span class="marked1"><a name="line46"></a> 46 user = User.try_to_login(params[:username], params[:password]) -</span><span class="marked0"><a name="line47"></a> 47 if user -</span><span class="marked1"><a name="line48"></a> 48 self.logged_user = user -</span><span class="inferred0"><a name="line49"></a> 49 # generate a key and set cookie if autologin -</span><span class="marked1"><a name="line50"></a> 50 if params[:autologin] && Setting.autologin? -</span><span class="marked0"><a name="line51"></a> 51 token = Token.create(:user => user, :action => 'autologin') -</span><span class="marked1"><a name="line52"></a> 52 cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now } -</span><span class="inferred0"><a name="line53"></a> 53 end -</span><span class="marked1"><a name="line54"></a> 54 redirect_back_or_default :controller => 'my', :action => 'page' -</span><span class="inferred0"><a name="line55"></a> 55 else -</span><span class="marked1"><a name="line56"></a> 56 flash.now[:error] = l(:notice_account_invalid_creditentials) -</span><span class="inferred0"><a name="line57"></a> 57 end -</span><span class="inferred1"><a name="line58"></a> 58 end -</span><span class="uncovered0"><a name="line59"></a> 59 rescue User::OnTheFlyCreationFailure -</span><span class="uncovered1"><a name="line60"></a> 60 flash.now[:error] = 'Redmine could not retrieve the required information from the LDAP to create your account. Please, contact your Redmine administrator.' -</span><span class="marked0"><a name="line61"></a> 61 end -</span><span class="inferred1"><a name="line62"></a> 62 -</span><span class="inferred0"><a name="line63"></a> 63 # Log out current user and redirect to welcome page -</span><span class="marked1"><a name="line64"></a> 64 def logout -</span><span class="marked0"><a name="line65"></a> 65 cookies.delete :autologin -</span><span class="marked1"><a name="line66"></a> 66 Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin']) if User.current.logged? -</span><span class="marked0"><a name="line67"></a> 67 self.logged_user = nil -</span><span class="marked1"><a name="line68"></a> 68 redirect_to home_url -</span><span class="inferred0"><a name="line69"></a> 69 end -</span><span class="inferred1"><a name="line70"></a> 70 -</span><span class="inferred0"><a name="line71"></a> 71 # Enable user to choose a new password -</span><span class="marked1"><a name="line72"></a> 72 def lost_password -</span><span class="marked0"><a name="line73"></a> 73 redirect_to(home_url) && return unless Setting.lost_password? -</span><span class="marked1"><a name="line74"></a> 74 if params[:token] -</span><span class="marked0"><a name="line75"></a> 75 @token = Token.find_by_action_and_value("recovery", params[:token]) -</span><span class="marked1"><a name="line76"></a> 76 redirect_to(home_url) && return unless @token and !@token.expired? -</span><span class="marked0"><a name="line77"></a> 77 @user = @token.user -</span><span class="marked1"><a name="line78"></a> 78 if request.post? -</span><span class="marked0"><a name="line79"></a> 79 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation] -</span><span class="marked1"><a name="line80"></a> 80 if @user.save -</span><span class="marked0"><a name="line81"></a> 81 @token.destroy -</span><span class="marked1"><a name="line82"></a> 82 flash[:notice] = l(:notice_account_password_updated) -</span><span class="marked0"><a name="line83"></a> 83 redirect_to :action => 'login' -</span><span class="marked1"><a name="line84"></a> 84 return -</span><span class="inferred0"><a name="line85"></a> 85 end -</span><span class="inferred1"><a name="line86"></a> 86 end -</span><span class="marked0"><a name="line87"></a> 87 render :template => "account/password_recovery" -</span><span class="marked1"><a name="line88"></a> 88 return -</span><span class="inferred0"><a name="line89"></a> 89 else -</span><span class="marked1"><a name="line90"></a> 90 if request.post? -</span><span class="marked0"><a name="line91"></a> 91 user = User.find_by_mail(params[:mail]) -</span><span class="inferred1"><a name="line92"></a> 92 # user not found in db -</span><span class="marked0"><a name="line93"></a> 93 flash.now[:error] = l(:notice_account_unknown_email) and return unless user -</span><span class="inferred1"><a name="line94"></a> 94 # user uses an external authentification -</span><span class="marked0"><a name="line95"></a> 95 flash.now[:error] = l(:notice_can_t_change_password) and return if user.auth_source_id -</span><span class="inferred1"><a name="line96"></a> 96 # create a new token for password recovery -</span><span class="marked0"><a name="line97"></a> 97 token = Token.new(:user => user, :action => "recovery") -</span><span class="marked1"><a name="line98"></a> 98 if token.save -</span><span class="marked0"><a name="line99"></a> 99 Mailer.deliver_lost_password(token) -</span><span class="marked1"><a name="line100"></a>100 flash[:notice] = l(:notice_account_lost_email_sent) -</span><span class="marked0"><a name="line101"></a>101 redirect_to :action => 'login' -</span><span class="marked1"><a name="line102"></a>102 return -</span><span class="inferred0"><a name="line103"></a>103 end -</span><span class="inferred1"><a name="line104"></a>104 end -</span><span class="inferred0"><a name="line105"></a>105 end -</span><span class="inferred1"><a name="line106"></a>106 end -</span><span class="inferred0"><a name="line107"></a>107 -</span><span class="inferred1"><a name="line108"></a>108 # User self-registration -</span><span class="marked0"><a name="line109"></a>109 def register -</span><span class="marked1"><a name="line110"></a>110 redirect_to(home_url) && return unless Setting.self_registration? -</span><span class="marked0"><a name="line111"></a>111 if request.get? -</span><span class="marked1"><a name="line112"></a>112 @user = User.new(:language => Setting.default_language) -</span><span class="inferred0"><a name="line113"></a>113 else -</span><span class="marked1"><a name="line114"></a>114 @user = User.new(params[:user]) -</span><span class="marked0"><a name="line115"></a>115 @user.admin = false -</span><span class="marked1"><a name="line116"></a>116 @user.login = params[:user][:login] -</span><span class="marked0"><a name="line117"></a>117 @user.status = User::STATUS_REGISTERED -</span><span class="marked1"><a name="line118"></a>118 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation] -</span><span class="marked0"><a name="line119"></a>119 case Setting.self_registration -</span><span class="marked1"><a name="line120"></a>120 when '1' -</span><span class="inferred0"><a name="line121"></a>121 # Email activation -</span><span class="marked1"><a name="line122"></a>122 token = Token.new(:user => @user, :action => "register") -</span><span class="marked0"><a name="line123"></a>123 if @user.save and token.save -</span><span class="marked1"><a name="line124"></a>124 Mailer.deliver_register(token) -</span><span class="marked0"><a name="line125"></a>125 flash[:notice] = l(:notice_account_register_done) -</span><span class="marked1"><a name="line126"></a>126 redirect_to :action => 'login' -</span><span class="inferred0"><a name="line127"></a>127 end -</span><span class="marked1"><a name="line128"></a>128 when '3' -</span><span class="inferred0"><a name="line129"></a>129 # Automatic activation -</span><span class="marked1"><a name="line130"></a>130 @user.status = User::STATUS_ACTIVE -</span><span class="marked0"><a name="line131"></a>131 if @user.save -</span><span class="marked1"><a name="line132"></a>132 self.logged_user = @user -</span><span class="marked0"><a name="line133"></a>133 flash[:notice] = l(:notice_account_activated) -</span><span class="marked1"><a name="line134"></a>134 redirect_to :controller => 'my', :action => 'account' -</span><span class="inferred0"><a name="line135"></a>135 end -</span><span class="inferred1"><a name="line136"></a>136 else -</span><span class="inferred0"><a name="line137"></a>137 # Manual activation by the administrator -</span><span class="marked1"><a name="line138"></a>138 if @user.save -</span><span class="inferred0"><a name="line139"></a>139 # Sends an email to the administrators -</span><span class="marked1"><a name="line140"></a>140 Mailer.deliver_account_activation_request(@user) -</span><span class="marked0"><a name="line141"></a>141 flash[:notice] = l(:notice_account_pending) -</span><span class="marked1"><a name="line142"></a>142 redirect_to :action => 'login' -</span><span class="inferred0"><a name="line143"></a>143 end -</span><span class="inferred1"><a name="line144"></a>144 end -</span><span class="inferred0"><a name="line145"></a>145 end -</span><span class="inferred1"><a name="line146"></a>146 end -</span><span class="inferred0"><a name="line147"></a>147 -</span><span class="inferred1"><a name="line148"></a>148 # Token based account activation -</span><span class="marked0"><a name="line149"></a>149 def activate -</span><span class="marked1"><a name="line150"></a>150 redirect_to(home_url) && return unless Setting.self_registration? && params[:token] -</span><span class="marked0"><a name="line151"></a>151 token = Token.find_by_action_and_value('register', params[:token]) -</span><span class="marked1"><a name="line152"></a>152 redirect_to(home_url) && return unless token and !token.expired? -</span><span class="marked0"><a name="line153"></a>153 user = token.user -</span><span class="marked1"><a name="line154"></a>154 redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED -</span><span class="marked0"><a name="line155"></a>155 user.status = User::STATUS_ACTIVE -</span><span class="marked1"><a name="line156"></a>156 if user.save -</span><span class="marked0"><a name="line157"></a>157 token.destroy -</span><span class="marked1"><a name="line158"></a>158 flash[:notice] = l(:notice_account_activated) -</span><span class="inferred0"><a name="line159"></a>159 end -</span><span class="marked1"><a name="line160"></a>160 redirect_to :action => 'login' -</span><span class="inferred0"><a name="line161"></a>161 end -</span><span class="inferred1"><a name="line162"></a>162 -</span><span class="marked0"><a name="line163"></a>163 private -</span><span class="marked1"><a name="line164"></a>164 def logged_user=(user) -</span><span class="marked0"><a name="line165"></a>165 if user && user.is_a?(User) -</span><span class="marked1"><a name="line166"></a>166 User.current = user -</span><span class="marked0"><a name="line167"></a>167 session[:user_id] = user.id -</span><span class="inferred1"><a name="line168"></a>168 else -</span><span class="marked0"><a name="line169"></a>169 User.current = User.anonymous -</span><span class="marked1"><a name="line170"></a>170 session[:user_id] = nil -</span><span class="inferred0"><a name="line171"></a>171 end -</span><span class="marked1"><a name="line172"></a>172 end -</span><span class="inferred0"><a name="line173"></a>173 end -</span></pre><hr/> - <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a> - version 0.8.1.2.</p> -<p><a href='http://validator.w3.org/check/referer'><img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88'/> - </a> - <a href='http://jigsaw.w3.org/css-validator/check/referer'><img src='http://jigsaw.w3.org/css-validator/images/vcss' alt='Valid CSS!' style='border:0;width:88px;height:31px'/> - </a> - </p> - </body> - </html>
--- a/plugins/embedded/test/fixtures/html/index.html Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,306 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>C0 code coverage information</title> - <style type='text/css'>body { background-color: rgb(240, 240, 245); }</style> - <style type='text/css'>span.cross-ref-title { - font-size: 140%; -} -span.cross-ref a { - text-decoration: none; -} -span.cross-ref { - background-color:#f3f7fa; - border: 1px dashed #333; - margin: 1em; - padding: 0.5em; - overflow: hidden; -} -a.crossref-toggle { - text-decoration: none; -} -span.marked0 { - background-color: rgb(185, 210, 200); - display: block; -} -span.marked1 { - background-color: rgb(190, 215, 205); - display: block; -} -span.inferred0 { - background-color: rgb(175, 200, 200); - display: block; -} -span.inferred1 { - background-color: rgb(180, 205, 205); - display: block; -} -span.uncovered0 { - background-color: rgb(225, 110, 110); - display: block; -} -span.uncovered1 { - background-color: rgb(235, 120, 120); - display: block; -} -span.overview { - border-bottom: 8px solid black; -} -div.overview { - border-bottom: 8px solid black; -} -body { - font-family: verdana, arial, helvetica; -} -div.footer { - font-size: 68%; - margin-top: 1.5em; -} -h1, h2, h3, h4, h5, h6 { - margin-bottom: 0.5em; -} -h5 { - margin-top: 0.5em; -} -.hidden { - display: none; -} -div.separator { - height: 10px; -} -/* Commented out for better readability, esp. on IE */ -/* -table tr td, table tr th { - font-size: 68%; -} -td.value table tr td { - font-size: 11px; -} -*/ -table.percent_graph { - height: 12px; - border: #808080 1px solid; - empty-cells: show; -} -table.percent_graph td.covered { - height: 10px; - background: #00f000; -} -table.percent_graph td.uncovered { - height: 10px; - background: #e00000; -} -table.percent_graph td.NA { - height: 10px; - background: #eaeaea; -} -table.report { - border-collapse: collapse; - width: 100%; -} -table.report td.heading { - background: #dcecff; - border: #d0d0d0 1px solid; - font-weight: bold; - text-align: center; -} -table.report td.heading:hover { - background: #c0ffc0; -} -table.report td.text { - border: #d0d0d0 1px solid; -} -table.report td.value, -table.report td.lines_total, -table.report td.lines_code { - text-align: right; - border: #d0d0d0 1px solid; -} -table.report tr.light { - background-color: rgb(240, 240, 245); -} -table.report tr.dark { - background-color: rgb(230, 230, 235); -} -</style> - <script type='text/javascript'> -// <![CDATA[ - function toggleCode( id ) { - if ( document.getElementById ) - elem = document.getElementById( id ); - else if ( document.all ) - elem = eval( "document.all." + id ); - else - return false; - - elemStyle = elem.style; - - if ( elemStyle.display != "block" ) { - elemStyle.display = "block" - } else { - elemStyle.display = "none" - } - - return true; - } - - // Make cross-references hidden by default - document.writeln( "<style type=\"text/css\">span.cross-ref { display: none }</style>" ) - // ]]> -</script> - </head> - <body><h3>C0 code coverage information</h3> - <p>Generated on Tue Jun 24 21:43:50 +0200 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a> - </p> - <hr/> - <table class='report'><thead><tr><td class='heading'>Name</td> - <td class='heading'>Total lines</td> - <td class='heading'>Lines of code</td> - <td class='heading'>Total coverage</td> - <td class='heading'>Code coverage</td> - </tr> - </thead> - <tbody><tr class='light'><td>TOTAL</td> - <td class='lines_total'><tt>13757</tt> - </td> - <td class='lines_code'><tt>9314</tt> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>90.7%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='91'/> - <td class='uncovered' width='9'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>86.9%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='87'/> - <td class='uncovered' width='13'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - </tr> - <tr class='dark'><td><a href='app-apis-sys_api_rb.html'>app/apis/sys_api.rb</a> - </td> - <td class='lines_total'><tt>25</tt> - </td> - <td class='lines_code'><tt>8</tt> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>100.0%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='100'/> - <td class='uncovered' width='0'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>100.0%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='100'/> - <td class='uncovered' width='0'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - </tr> - <tr class='light'><td><a href='app-controllers-account_controller_rb.html'>app/controllers/account_controller.rb</a> - </td> - <td class='lines_total'><tt>173</tt> - </td> - <td class='lines_code'><tt>129</tt> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>98.8%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='99'/> - <td class='uncovered' width='1'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>98.4%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='98'/> - <td class='uncovered' width='2'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - </tr> - <tr class='dark'><td><a href='app-controllers-admin_controller_rb.html'>app/controllers/admin_controller.rb</a> - </td> - <td class='lines_total'><tt>86</tt> - </td> - <td class='lines_code'><tt>57</tt> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>91.9%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='92'/> - <td class='uncovered' width='8'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>87.7%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='88'/> - <td class='uncovered' width='12'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - </tr> - <tr class='light'><td><a href='app-controllers-application_rb.html'>app/controllers/application.rb</a> - </td> - <td class='lines_total'><tt>222</tt> - </td> - <td class='lines_code'><tt>162</tt> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>89.6%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='90'/> - <td class='uncovered' width='10'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>87.0%</tt> - </td> - <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='87'/> - <td class='uncovered' width='13'/> - </tr> - </table> - </td> - </tr> - </table> - </td> - </tr> - </tbody> - </table> -<hr/> - <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a> - version 0.8.1.2.</p> -<p><a href='http://validator.w3.org/check/referer'><img src='http://www.w3.org/Icons/valid-xhtml11' height='31' alt='Valid XHTML 1.1!' width='88'/> - </a> - <a href='http://jigsaw.w3.org/css-validator/check/referer'><img src='http://jigsaw.w3.org/css-validator/images/vcss' alt='Valid CSS!' style='border:0;width:88px;height:31px'/> - </a> - </p> - </body> - </html>
--- a/plugins/embedded/test/fixtures/html/misc/misc.html Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -<b>Misc file</b>
--- a/plugins/embedded/test/fixtures/html/misc/misc.txt Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -Misc file
--- a/plugins/embedded/test/functional/embedded_controller_test.rb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,63 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2008 Jean-Philippe Lang -# -# 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 2 -# 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -require File.dirname(__FILE__) + '/../test_helper' - -class EmbeddedControllerTest < ActionController::TestCase - fixtures :projects, :enabled_modules, :users, :roles, :members - - def setup - fixtures_path = File.dirname(__FILE__) + '/../fixtures/html' - - Setting.plugin_embedded = { 'path' => fixtures_path, - 'index' => 'main.html overview-summary.html index.html', - 'extensions' => 'html png gif', - 'template' => '', - 'encoding' => '', - 'menu' => 'Embedded' } - - Project.find(1).enabled_modules << EnabledModule.new(:name => 'embedded') - - anonymous = Role.anonymous - anonymous.permissions += [:view_embedded_doc] - assert anonymous.save - end - - def test_get_root_should_redirect_to_index_file - get :index, :id => 'ecookbook' - assert_redirected_to :path => ['index.html'] - end - - def test_get_index_file - get :index, :id => 'ecookbook', :path => ['index.html'] - assert_response :success - assert_template 'index' - assert_tag :h3, :content => 'C0 code coverage information' - end - - def test_get_subdirectory_file - get :index, :id => 'ecookbook', :path => ['misc', 'misc.html'] - assert_response :success - assert_template 'index' - assert_tag :b, :content => 'Misc file' - end - - def test_get_invalid_extension_should_be_denied - get :index, :id => 'ecookbook', :path => ['misc', 'misc.txt'] - assert_response 500 - end -end
--- a/plugins/embedded/test/test_helper.rb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -ENV["RAILS_ENV"] ||= "test" -require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment") -require 'test_help' - -class Test::Unit::TestCase - # Transactional fixtures accelerate your tests by wrapping each test method - # in a transaction that's rolled back on completion. This ensures that the - # test database remains unchanged so your fixtures don't have to be reloaded - # between every test method. Fewer database queries means faster tests. - # - # Read Mike Clark's excellent walkthrough at - # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting - # - # Every Active Record database supports transactions except MyISAM tables - # in MySQL. Turn off transactional fixtures in this case; however, if you - # don't care one way or the other, switching from MyISAM to InnoDB tables - # is recommended. - # - # The only drawback to using transactional fixtures is when you actually - # need to test transactions. Since your test is bracketed by a transaction, - # any transactions started in your code will be automatically rolled back. - self.use_transactional_fixtures = true - - # Instantiated fixtures are slow, but give you @david where otherwise you - # would need people(:david). If you don't want to migrate your existing - # test cases which use the @david style and don't mind the speed hit (each - # instantiated fixtures translates to a database query per test method), - # then set this back to true. - self.use_instantiated_fixtures = false - - # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. - # - # Note: You'll currently still have to declare fixtures explicitly in integration tests - # -- they do not yet inherit this setting - fixtures :all - - # Add more helper methods to be used by all tests here... -end
--- a/plugins/embedded/test/unit/embedded_test.rb Tue Jan 08 14:06:55 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -# Redmine - project management software -# Copyright (C) 2008 Jean-Philippe Lang -# -# 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 2 -# 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, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -require File.dirname(__FILE__) + '/../test_helper' - -class EmbeddedTest < ActiveSupport::TestCase - - def setup - Setting.plugin_embedded = { 'path' => '/path/to', - 'index' => 'main.html overview-summary.html index.html', - 'extensions' => 'html png gif', - 'template' => 'doxygen', - 'encoding' => '', - 'menu' => 'Embedded' } - end - - def test_available_templates - assert_equal ['doxygen', 'javadoc', 'rcov'], Redmine::Plugins::Embedded.available_templates - end - - def test_assets - assert_equal ['rcov.css', 'rcov.js'], Redmine::Plugins::Embedded.assets('rcov') - end - - def test_detect_template_from_path - to_test = { '/path/to/doc' => 'doxygen', - '/path/to/javadoc/html' => 'javadoc' } - - to_test.each { |path, template| assert_equal template, Redmine::Plugins::Embedded.detect_template_from_path(path) } - end - - def test_valid_extension - to_test = {'index.html' => true, - 'path/to/index.html' => true, - 'path/to/image.png' => true, - 'path/to/something.else' => false} - - to_test.each { |path, expected| assert_equal expected, Redmine::Plugins::Embedded.valid_extension?(path) } - end -end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/COPYING Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This 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.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/README.md Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,8 @@ +Redmine Embedded +================ + +Plugin for Redmine to embed Doxygen/Javadoc files based on the original by Jean-Philippe Lang but updated for Redmine 2 and Rails 3 + +To use, create a directory for the HTML documentation and set the owner to the same user as the webserver user running your Redmine installation. Default setting is "/var/doc". + +Documentation should be a zip of the root html directory, prefereably compiled without search (CSS needs some work).
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/app/controllers/redmine_embedded_controller.rb Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,152 @@ +# Redmine - project management software +# Copyright (C) 2008 Jean-Philippe Lang +# +# 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 2 +# 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +require 'iconv' + +class DataFile < ActiveRecord::Base + def self.save(directory, zipname, upload) + path = File.join(directory, zipname) + File.open(path, "wb") { |f| f.write(upload['datafile'].read) } + end +end + +class RedmineEmbeddedController < ApplicationController + class RedmineEmbeddedControllerError < StandardError; end + + unloadable + layout 'base' + before_filter :find_project, :authorize + + def index + file = params[:request_path] + path = get_real_path(file) + if File.directory?(path) + file = get_index_file(path) + target = file || [] + #target << file + # Forces redirect to the index file when the requested path is a directory + # so that relative links in embedded html pages work + redirect_to :request_path => target + return + end + + # Check file extension + raise RedmineEmbeddedControllerError.new('This file can not be viewed (invalid extension).') unless Redmine::Plugins::RedmineEmbedded.valid_extension?(path) + + if Redmine::MimeType.is_type?('image', path) + send_file path, :disposition => 'inline', :type => Redmine::MimeType.of(path) + else + embed_file path + end + + rescue Errno::ENOENT => e + @content = "No documentation found" + @title = "" + render :index + rescue Errno::EACCES => e + # Can not read the file + render_error "Unable to read the file: #{e.message}" + rescue RedmineEmbeddedControllerError => e + render_error e.message + end + + def upload + if params[:upload] + file = params[:upload] + zipname = sanitize_filename(params[:upload]['datafile'].original_filename) + if ["zip"].include?(File.extname(zipname).downcase[1..-1]) + dir = get_project_directory.gsub("/html", "") + if File.directory? dir + `rm -rf #{dir}/*` #clean up any exisiting docs + else + Dir.mkdir dir + end + filename = DataFile.save(dir, zipname, params[:upload]) + Dir.chdir(dir) + `unzip #{zipname}` + redirect_to show_embedded_url(@project), :notice => "Documentation uploaded" + else + render :index, :error => "File must be ZIP format" + end + else + render :index, :error => "No file uploaded" + end + end + + private + + def sanitize_filename(file_name) + # get only the filename, not the whole path (from IE) + just_filename = File.basename(file_name) + # replace all none alphanumeric, underscore or perioids + # with underscore + just_filename.sub(/[^\w\.\-]/,'_') + end + + def find_project + @project = Project.find(params[:id]) + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Return the path to the html root directory for the current project + def get_project_directory + @project_directory ||= Setting.plugin_redmine_embedded['path'].to_s.gsub('{PROJECT}', @project.identifier) + end + + # Returns the absolute path of the requested file + # Parameter is an Array + def get_real_path(path) + real = get_project_directory + real = File.join(real, path) unless path.nil? || path.empty? + dir = File.expand_path(get_project_directory) + real = File.expand_path(real) + raise Errno::ENOENT unless real.starts_with?(dir) && File.exist?(real) + real + end + + # Returns the index file in the given directory + # and raises an exception if none is found + def get_index_file(dir) + indexes = Setting.plugin_redmine_embedded['index'].to_s.split + file = indexes.find {|f| File.exist?(File.join(dir, f))} + raise RedmineEmbeddedControllerError.new("No index file found in #{dir} (#{indexes.join(', ')}).") if file.nil? + file + end + + # Renders a given HTML file + def embed_file(path) + @content = File.read(path) + + # Extract html title from embedded page + if @content =~ %r{<title>([^<]*)</title>}mi + @title = $1.strip + end + + # Keep html body only + @content.gsub!(%r{^.*<body[^>]*>(.*)</body>.*$}mi, '\\1') + + # Re-encode content if needed + source_encoding = Setting.plugin_redmine_embedded['encoding'].to_s + unless source_encoding.blank? + begin; @content = Iconv.new('UTF-8', source_encoding).iconv(@content); rescue; end + end + + @doc_template = Redmine::Plugins::RedmineEmbedded.detect_template_from_path(path) + render :action => 'index' + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/app/helpers/redmine_embedded_helper.rb Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,35 @@ +# Redmine - project management software +# Copyright (C) 2008 Jean-Philippe Lang +# +# 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 2 +# 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module RedmineEmbeddedHelper + + # Adds include tags for assets of the given template + def asset_include_tags(template) + + Redmine::Plugins::RedmineEmbedded.assets(template).each { |asset| content_for(:header_tags) { asset_include_tag(asset) } } + end + + private + + def asset_include_tag(asset) + if asset =~ %r{\.js$} + javascript_include_tag(asset, :plugin => 'redmine_embedded') + else + stylesheet_link_tag(asset, :plugin => 'redmine_embedded') + end + end +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/app/views/redmine_embedded/_upload.html.erb Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,14 @@ +<div class="row"> + <%= form_tag(upload_embedded_path(@project), :multipart => true) do -%> + <fieldset id="embedded_doc" class="collapsible collapsed"> + <legend onclick="toggleFieldset(this);">Upload documentation</legend> + <div style="display: none;"> + Select File (ZIP format only, root must be html directory): + <%= file_field "upload", "datafile" %> + <%= submit_tag "Upload" %> + </div> + </fieldset> + <% end -%> +</div> +<div class="clearfix"></div> +<hr />
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/app/views/redmine_embedded/index.html.erb Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,9 @@ +<%= render :partial => "upload" if User.current.allowed_to?(:edit_embedded_doc, @project) -%> + +<!-- Embedded page --> +<%= @content.html_safe %> +<!-- Embedded page end --> + +<% html_title(@title) if @title %> + +<% asset_include_tags(@doc_template) %>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/app/views/settings/_redmine_embedded.html.erb Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,22 @@ +<p><label>HTML directory</label> +<%= text_field_tag 'settings[path]', @settings['path'], :size => 80 %> +<br /><em>Use {PROJECT} to include the project identifier in the path</em></p> + +<p><label>Index files</label> +<%= text_area_tag 'settings[index]', @settings['index'], :cols => 60, :rows => 3 %> +<br /><em>Space separated list of index files by priority</em></p> + +<p><label>Valid extensions</label> +<%= text_area_tag 'settings[extensions]', @settings['extensions'], :cols => 60, :rows => 3 %> +<br /><em>Space separated list of file extensions that can be viewed (case insensitive)</em></p> + +<p><label>Default template</label> +<%= select_tag 'settings[template]', options_for_select([''] + Redmine::Plugins::RedmineEmbedded.available_templates, @settings['template']) %></p> + +<p><label>Files encoding</label> +<%= text_field_tag 'settings[encoding]', @settings['encoding'] %> +<br /><em>Eg. ISO-8859-1<br />Leave this field empty if HTML files are UTF-8 encoded</em></p> + +<p><label>Menu caption</label> +<%= text_field_tag 'settings[menu]', @settings['menu'], :size => 30 %> +<br /><em>Clear this field if you don't want to add a tab to the project menu</em></p>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/assets/javascripts/rcov.js Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,18 @@ +function toggleCode( id ) { + if ( document.getElementById ) + elem = document.getElementById( id ); + else if ( document.all ) + elem = eval( "document.all." + id ); + else + return false; + + elemStyle = elem.style; + + if ( elemStyle.display != "block" ) { + elemStyle.display = "block" + } else { + elemStyle.display = "none" + } + + return true; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/assets/stylesheets/doxygen.css Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,224 @@ +#content { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +#content h1, h2, h3 {border: 0;} +#content h1 {margin-bottom: 1em;} +#content CAPTION { font-weight: bold } +#content DIV.qindex { + line-height: 120%; + margin-bottom: 1em; +} +#content A.qindex { + text-decoration: none; + font-weight: bold; + padding: 2px; +} +#content A.qindexHL { + text-decoration: underline; + font-weight: bold; + padding: 2px; +} +#content A.el { text-decoration: none; font-weight: bold } +#content A.elRef { font-weight: bold } +#content A.code { text-decoration: none; font-weight: normal; color: #1A419D} +#content A.codeRef { font-weight: normal; color: #1A419D} +#content DL.el { margin-left: -1cm } +#content PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +#content DIV.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + padding: 6px; +} +#content DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } +#content TD.md { background-color: #F4F4FB; font-weight: bold; } +#content TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } +#content TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } +#content DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; + font-family: Geneva, Arial, Helvetica, sans-serif; +} +#content DIV.groupText { margin-left: 16px; font-style: italic; font-size: 14px } +#content TD.indexkey { + background-color: #eeeeff; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +#content TD.indexvalue { + background-color: #eeeeff; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +#content TR.memlist { + background-color: #f0f0f0; +} +#content P.formulaDsp { text-align: center; } +#content IMG.formulaDsp { } +#content IMG.formulaInl { vertical-align: middle; } +#content SPAN.keyword { color: #008000 } +#content SPAN.keywordtype { color: #604020 } +#content SPAN.keywordflow { color: #e08000 } +#content SPAN.comment { color: #800000 } +#content SPAN.preprocessor { color: #806020 } +#content SPAN.stringliteral { color: #002080 } +#content SPAN.charliteral { color: #008080 } +#content .mdTable { + border: 1px solid #868686; + background-color: #F4F4FB; +} +#content .mdRow { + padding: 8px 10px; +} +#content .mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 14px; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +#content .mdescRight { + padding: 0px 8px 4px 8px; + font-size: 14px; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +#content .memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-style: solid; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-family: Geneva, Arial, Helvetica, sans-serif; + font-size: 12px; +} +#content .memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-style: solid; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-family: Geneva, Arial, Helvetica, sans-serif; + font-size: 13px; +} +#content .search { color: #003399; font-weight: bold; +} +#content FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +#content INPUT.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #eeeeff; +} +#content TD.tiny { font-size: 75%; +} +#content .tabs ul li a#MSearchClose { + width: 12px; + display: inline-block; + overflow: hidden; + padding: 2px; + height: 12px; + line-height: 12px; +} + +#content .tabs ul li #MSearchField { + width: 120px; + margin: 0; +} + +#content .tabs ul li #MSearchBox { + margin-bottom: -2px; +} + +#content .memitem { + padding: 0; + margin-bottom: 10px; +} +#content .memname { + white-space: nowrap; + font-weight: bold; +} +#content .memproto, .memdoc { + border: 1px solid #84b0c7; +} +#content .memdoc { + padding: 2px 5px; + background-color: #eef3f5; + border-top-width: 0; + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -moz-border-radius-bottomleft: 8px; + -moz-border-radius-bottomright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; +} +#content .memproto { + padding: 0; + background-color: #d5e1e8; + font-weight: bold; + -webkit-border-top-left-radius: 8px; + -webkit-border-top-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -moz-border-radius-topleft: 8px; + -moz-border-radius-topright: 8px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/assets/stylesheets/javadoc.css Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,23 @@ +/* Javadoc style sheet */ + +/* Table colors */ +.TableHeadingColor { background: #eef; } /* Dark mauve */ +.TableHeadingColor th b { font-size: 70%; } +.TableSubHeadingColor { background: #EEEEee; } /* Light mauve */ +.TableRowColor { background: #FFFFFF; } /* White */ + +/* Font used in left-hand frame lists */ +.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } +.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 } + +/* Navigation bar fonts and colors */ +.NavBarCell1 { background-color: inherit; } /* Light mauve */ +.NavBarCell1Rev { background-color: inherit; } /* Dark Blue */ +.NavBarFont1 { font-family: Arial, Helvetica, sans-serif;} +.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; font-style: underline; } + +.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000; display: none;} +.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000} + +#content table { border-collapse: collapse; border-color: #ddd; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/assets/stylesheets/rcov.css Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,525 @@ +span.cross-ref-title { + font-size: 140%; +} +span.cross-ref a { + text-decoration: none; +} +span.cross-ref { + background-color:#f3f7fa; + border: 1px dashed #333; + margin: 1em; + padding: 0.5em; + overflow: hidden; +} +a.crossref-toggle { + text-decoration: none; +} +span.marked0 { + background-color: rgb(185, 210, 200); + display: block; +} +span.marked1 { + background-color: rgb(190, 215, 205); + display: block; +} +span.inferred0 { + background-color: rgb(175, 200, 200); + display: block; +} +span.inferred1 { + background-color: rgb(180, 205, 205); + display: block; +} +span.uncovered0 { + background-color: rgb(225, 110, 110); + display: block; +} +span.uncovered1 { + background-color: rgb(235, 120, 120); + display: block; +} +span.overview { + border-bottom: 8px solid black; +} +div.overview { + border-bottom: 8px solid black; +} +#content div.footer { + font-size: 68%; + margin-top: 1.5em; +} +#content h1, h2, h3, h4, h5, h6 { + margin-bottom: 0.5em; +} +h5 { + margin-top: 0.5em; +} +.hidden { + display: none; +} +div.separator { + height: 10px; +} +/* Commented out for better readability, esp. on IE */ +/* +table tr td, table tr th { + font-size: 68%; +} +td.value table tr td { + font-size: 11px; +} +*/ +table.percent_graph { + height: 12px; + border: #808080 1px solid; + empty-cells: show; +} +table.percent_graph td.covered { + height: 10px; + background: #00f000; +} +table.percent_graph td.uncovered { + height: 10px; + background: #e00000; +} +table.percent_graph td.NA { + height: 10px; + background: #eaeaea; +} +table.report { + border-collapse: collapse; + width: 100%; +} +table.report td.heading { + background: #dcecff; + border: #d0d0d0 1px solid; + font-weight: bold; + text-align: center; +} +table.report td.heading:hover { + background: #c0ffc0; +} +table.report td.text { + border: #d0d0d0 1px solid; +} +table.report td.value, +table.report td.lines_total, +table.report td.lines_code { + text-align: right; + border: #d0d0d0 1px solid; +} +table.report tr.light { + background-color: #f6f7f8; +} +table.report tr.dark { + background-color: #fff; +} +span.run0 { + background-color: rgb(178, 204, 255); + display: block; +} +span.run1 { + background-color: rgb(178, 206, 255); + display: block; +} +span.run2 { + background-color: rgb(178, 209, 255); + display: block; +} +span.run3 { + background-color: rgb(178, 211, 255); + display: block; +} +span.run4 { + background-color: rgb(178, 214, 255); + display: block; +} +span.run5 { + background-color: rgb(178, 218, 255); + display: block; +} +span.run6 { + background-color: rgb(178, 220, 255); + display: block; +} +span.run7 { + background-color: rgb(178, 223, 255); + display: block; +} +span.run8 { + background-color: rgb(178, 225, 255); + display: block; +} +span.run9 { + background-color: rgb(178, 228, 255); + display: block; +} +span.run10 { + background-color: rgb(178, 232, 255); + display: block; +} +span.run11 { + background-color: rgb(178, 234, 255); + display: block; +} +span.run12 { + background-color: rgb(178, 237, 255); + display: block; +} +span.run13 { + background-color: rgb(178, 239, 255); + display: block; +} +span.run14 { + background-color: rgb(178, 242, 255); + display: block; +} +span.run15 { + background-color: rgb(178, 246, 255); + display: block; +} +span.run16 { + background-color: rgb(178, 248, 255); + display: block; +} +span.run17 { + background-color: rgb(178, 251, 255); + display: block; +} +span.run18 { + background-color: rgb(178, 253, 255); + display: block; +} +span.run19 { + background-color: rgb(178, 255, 253); + display: block; +} +span.run20 { + background-color: rgb(178, 255, 249); + display: block; +} +span.run21 { + background-color: rgb(178, 255, 247); + display: block; +} +span.run22 { + background-color: rgb(178, 255, 244); + display: block; +} +span.run23 { + background-color: rgb(178, 255, 242); + display: block; +} +span.run24 { + background-color: rgb(178, 255, 239); + display: block; +} +span.run25 { + background-color: rgb(178, 255, 235); + display: block; +} +span.run26 { + background-color: rgb(178, 255, 233); + display: block; +} +span.run27 { + background-color: rgb(178, 255, 230); + display: block; +} +span.run28 { + background-color: rgb(178, 255, 228); + display: block; +} +span.run29 { + background-color: rgb(178, 255, 225); + display: block; +} +span.run30 { + background-color: rgb(178, 255, 221); + display: block; +} +span.run31 { + background-color: rgb(178, 255, 219); + display: block; +} +span.run32 { + background-color: rgb(178, 255, 216); + display: block; +} +span.run33 { + background-color: rgb(178, 255, 214); + display: block; +} +span.run34 { + background-color: rgb(178, 255, 211); + display: block; +} +span.run35 { + background-color: rgb(178, 255, 207); + display: block; +} +span.run36 { + background-color: rgb(178, 255, 205); + display: block; +} +span.run37 { + background-color: rgb(178, 255, 202); + display: block; +} +span.run38 { + background-color: rgb(178, 255, 200); + display: block; +} +span.run39 { + background-color: rgb(178, 255, 197); + display: block; +} +span.run40 { + background-color: rgb(178, 255, 193); + display: block; +} +span.run41 { + background-color: rgb(178, 255, 191); + display: block; +} +span.run42 { + background-color: rgb(178, 255, 188); + display: block; +} +span.run43 { + background-color: rgb(178, 255, 186); + display: block; +} +span.run44 { + background-color: rgb(178, 255, 183); + display: block; +} +span.run45 { + background-color: rgb(178, 255, 179); + display: block; +} +span.run46 { + background-color: rgb(179, 255, 178); + display: block; +} +span.run47 { + background-color: rgb(182, 255, 178); + display: block; +} +span.run48 { + background-color: rgb(184, 255, 178); + display: block; +} +span.run49 { + background-color: rgb(187, 255, 178); + display: block; +} +span.run50 { + background-color: rgb(191, 255, 178); + display: block; +} +span.run51 { + background-color: rgb(193, 255, 178); + display: block; +} +span.run52 { + background-color: rgb(196, 255, 178); + display: block; +} +span.run53 { + background-color: rgb(198, 255, 178); + display: block; +} +span.run54 { + background-color: rgb(201, 255, 178); + display: block; +} +span.run55 { + background-color: rgb(205, 255, 178); + display: block; +} +span.run56 { + background-color: rgb(207, 255, 178); + display: block; +} +span.run57 { + background-color: rgb(210, 255, 178); + display: block; +} +span.run58 { + background-color: rgb(212, 255, 178); + display: block; +} +span.run59 { + background-color: rgb(215, 255, 178); + display: block; +} +span.run60 { + background-color: rgb(219, 255, 178); + display: block; +} +span.run61 { + background-color: rgb(221, 255, 178); + display: block; +} +span.run62 { + background-color: rgb(224, 255, 178); + display: block; +} +span.run63 { + background-color: rgb(226, 255, 178); + display: block; +} +span.run64 { + background-color: rgb(229, 255, 178); + display: block; +} +span.run65 { + background-color: rgb(233, 255, 178); + display: block; +} +span.run66 { + background-color: rgb(235, 255, 178); + display: block; +} +span.run67 { + background-color: rgb(238, 255, 178); + display: block; +} +span.run68 { + background-color: rgb(240, 255, 178); + display: block; +} +span.run69 { + background-color: rgb(243, 255, 178); + display: block; +} +span.run70 { + background-color: rgb(247, 255, 178); + display: block; +} +span.run71 { + background-color: rgb(249, 255, 178); + display: block; +} +span.run72 { + background-color: rgb(252, 255, 178); + display: block; +} +span.run73 { + background-color: rgb(255, 255, 178); + display: block; +} +span.run74 { + background-color: rgb(255, 252, 178); + display: block; +} +span.run75 { + background-color: rgb(255, 248, 178); + display: block; +} +span.run76 { + background-color: rgb(255, 246, 178); + display: block; +} +span.run77 { + background-color: rgb(255, 243, 178); + display: block; +} +span.run78 { + background-color: rgb(255, 240, 178); + display: block; +} +span.run79 { + background-color: rgb(255, 238, 178); + display: block; +} +span.run80 { + background-color: rgb(255, 234, 178); + display: block; +} +span.run81 { + background-color: rgb(255, 232, 178); + display: block; +} +span.run82 { + background-color: rgb(255, 229, 178); + display: block; +} +span.run83 { + background-color: rgb(255, 226, 178); + display: block; +} +span.run84 { + background-color: rgb(255, 224, 178); + display: block; +} +span.run85 { + background-color: rgb(255, 220, 178); + display: block; +} +span.run86 { + background-color: rgb(255, 218, 178); + display: block; +} +span.run87 { + background-color: rgb(255, 215, 178); + display: block; +} +span.run88 { + background-color: rgb(255, 212, 178); + display: block; +} +span.run89 { + background-color: rgb(255, 210, 178); + display: block; +} +span.run90 { + background-color: rgb(255, 206, 178); + display: block; +} +span.run91 { + background-color: rgb(255, 204, 178); + display: block; +} +span.run92 { + background-color: rgb(255, 201, 178); + display: block; +} +span.run93 { + background-color: rgb(255, 198, 178); + display: block; +} +span.run94 { + background-color: rgb(255, 196, 178); + display: block; +} +span.run95 { + background-color: rgb(255, 192, 178); + display: block; +} +span.run96 { + background-color: rgb(255, 189, 178); + display: block; +} +span.run97 { + background-color: rgb(255, 187, 178); + display: block; +} +span.run98 { + background-color: rgb(255, 184, 178); + display: block; +} +span.run99 { + background-color: rgb(255, 182, 178); + display: block; +} +span.run100 { + background-color: rgb(255, 178, 178); + display: block; +} +pre { + white-space: pre-wrap; /* CSS2.1 compliant */ + white-space: -moz-pre-wrap; /* Mozilla-based browsers */ + white-space: -o-pre-wrap; /* Opera 7+ */ +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/config/routes.rb Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,4 @@ +RedmineApp::Application.routes.draw do + post "/projects/:id/embedded/upload", :to => "redmine_embedded#upload", :as => :upload_embedded + get 'projects/:id/embedded(/*request_path(.:format))', :to => "redmine_embedded#index", :as => :show_embedded +end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/init.rb Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,28 @@ +require 'redmine' +require 'redmine_embedded' + +Redmine::Plugin.register :redmine_embedded do + name 'Redmine Embedded Documentation' + author 'Jean-Philippe Lang, Reuben Mallaby' + description 'Embed various documentations in your projects' + version '0.0.2' + settings :partial => 'settings/redmine_embedded', + :default => { 'path' => '/var/doc/{PROJECT}/html', + 'index' => 'main.html overview-summary.html index.html', + 'extensions' => 'html png gif', + 'template' => '', + 'encoding' => '', + 'menu' => 'Embedded' } + project_module :redmine_embedded do + permission :view_embedded_doc, {:redmine_embedded => :index} + permission :edit_embedded_doc, {:redmine_embedded => :upload} + end + menu :project_menu, :redmine_embedded, + { + :controller => "redmine_embedded", + :action => "index" + }, + :caption => Proc.new { Setting.plugin_redmine_embedded['menu'] }, + :if => Proc.new { !Setting.plugin_redmine_embedded['menu'].blank? } +end +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/redmine_embedded/lib/redmine_embedded.rb Tue Jan 08 14:43:04 2013 +0000 @@ -0,0 +1,69 @@ +# Redmine - project management software +# Copyright (C) 2008 Jean-Philippe Lang +# +# 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 2 +# 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, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +module Redmine + module Plugins + module RedmineEmbedded + class << self + + # Returns an Array of available templates + def available_templates + assets_by_template.keys.sort + end + + # Returns the assets for a given template + def assets(template) + assets_by_template.has_key?(template) ? assets_by_template[template] : [] + end + + def detect_template_from_path(path) + t = path.to_s.split(%r{[/\\]}) & available_templates + t.empty? ? Setting.plugin_redmine_embedded['template'].to_s : t.first + end + + def valid_extension?(path) + extensions = Setting.plugin_redmine_embedded['extensions'].to_s.split.each(&:downcase) + extensions.include?(File.extname(path).downcase[1..-1]) + end + + private + + # A Hash of available assets by template + def assets_by_template + @@assets_by_template ||= scan_assets + end + + # Scans assets directory for templates + # and returns a Hash of available assets by template + def scan_assets + a = Hash.new {|h,k| h[k] = [] } + Dir.glob(File.join(File.dirname(__FILE__), '../assets/*/*.{css,js}')).each do |asset| + asset = File.basename(asset) + template = asset.gsub(%r{\.(js|css)$}, '') + a[template] << asset + end + a + end + end + end + end +end + +class << RedmineApp::Application;self;end.class_eval do + define_method :clear!, lambda {} +end +