active_scaffold_export 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in foo.gemspec
4
+ gemspec
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 MojoTech, LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,65 @@
1
+ active_scaffold_export
2
+ ======================
3
+
4
+ Active Scaffold plugin for CSV exports.
5
+
6
+ Introduction
7
+ ------------
8
+
9
+ This Active Scaffold plugin provides a configurable CSV 'Export'
10
+ action for Active Scaffold controllers.
11
+
12
+ Installation
13
+ ------------
14
+
15
+ You can use active_scaffold_export with the latest Rails 3, but you'll
16
+ need to also install the vhochstein port of active_scaffold.
17
+
18
+ $ rails plugin install git://github.com/vhochstein/active_scaffold.git
19
+
20
+ In your Gemfile:
21
+
22
+ gem "active_scaffold_export"
23
+
24
+ Features
25
+ --------
26
+
27
+ * Uses FasterCSV for CSV generation
28
+ * Works with Rails 3 (thanks vhochstein!)
29
+ * Scales to many, many records (thanks Alexander Malysh!)
30
+ * Let the user pick which columns to export.
31
+ * Download full lists or just a single page.
32
+ * Don't like commas? No problem, uses your favorite delimiter!
33
+ * Don't need no stinkin' headers? Drop 'em.
34
+
35
+ Usage
36
+ -----
37
+
38
+ active_scaffold :users do |config|
39
+ actions.add :export # this is required, all other configuration is optional
40
+
41
+ export.columns = [ :id, :email, :created_at ] # uses list columns by default
42
+ export.allow_full_download = false # defaults to true
43
+ export.show_form = true # whether to show customization form or not, default to true
44
+ export.force_quotes = true # defaults to false
45
+ export.default_deselected_columns = [ :created_at ] # optional
46
+ export.default_delimiter = ';' # defaults to ','
47
+ export.default_skip_header = true # defaults to false
48
+ export.default_full_download = false # defaults to true
49
+ end
50
+
51
+ Note on Patches/Pull Requests
52
+ -----------------------------
53
+
54
+ * Fork the project.
55
+ * Make your feature addition or bug fix.
56
+ * Add tests for it. This is important so I don't break it in a
57
+ future version unintentionally.
58
+ * Commit, do not mess with rakefile, version, or history.
59
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
60
+ * Send me a pull request. Bonus points for topic branches.
61
+
62
+ Copyright
63
+ ---------
64
+
65
+ Copyright (c) 2010 Mojo Tech, LLC. See LICENSE for details.
@@ -0,0 +1,37 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{active_scaffold_export}
3
+ s.version = "0.9.4"
4
+
5
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
+ s.authors = ["Mojo Tech, LLC", "see commits"]
7
+ s.description = %q{This Active Scaffold plugin provides a configurable CSV 'Export' action for Active Scaffold controllers}
8
+ s.email = %q{chris@mojotech.com}
9
+ s.extra_rdoc_files = [
10
+ "README.markdown"
11
+ ]
12
+ s.files = `git ls-files`.split("\n")
13
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
15
+ s.require_paths = ["lib"]
16
+
17
+ s.homepage = %q{http://github.com/mojotech/active_scaffold_export}
18
+ s.rdoc_options = ["--charset=UTF-8"]
19
+ s.require_paths = ["lib"]
20
+ s.rubygems_version = %q{1.3.7}
21
+ s.summary = %q{Active Scaffold plugin for CSV exports}
22
+
23
+ if s.respond_to? :specification_version then
24
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
25
+ s.specification_version = 3
26
+
27
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
28
+ s.add_runtime_dependency(%q<fastercsv>, [">= 0"])
29
+ else
30
+ s.add_dependency(%q<fastercsv>, [">= 0"])
31
+ end
32
+ else
33
+ s.add_dependency(%q<fastercsv>, [">= 0"])
34
+ end
35
+ s.add_dependency("active_scaffold")
36
+ end
37
+
Binary file
@@ -0,0 +1,6 @@
1
+ /* IE hacks
2
+ ==================================== */
3
+ .active-scaffold-header div.actions a.export {
4
+ background-image: none;
5
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/active_scaffold/default/export.png', sizingMethod='crop');
6
+ }
@@ -0,0 +1,27 @@
1
+ .active-scaffold-header div.actions a.show_export {
2
+ background-image: url(../../../images/active_scaffold/default/export.png);
3
+ background-position: 1px 50%;
4
+ background-repeat: no-repeat;
5
+ padding-left: 19px;
6
+ }
7
+ .active-scaffold div.show_export-view h3 {
8
+ font-weight: bold;
9
+ }
10
+ .active-scaffold div.show_export-view div.separator {
11
+ clear: both;
12
+ padding: .5em;
13
+ }
14
+ .active-scaffold div.show_export-view div.options div.separator {
15
+ padding: 0;
16
+ }
17
+ .active-scaffold div.show_export-view div.options div.checkbox-wrapper {
18
+ margin-bottom: .5em;
19
+ }
20
+ .active-scaffold div.show_export-view div div.checkbox-wrapper {
21
+ min-width: 20%;
22
+ margin-bottom: .25em;
23
+ float: left;
24
+ }
25
+ .active-scaffold div.show_export-view label #delimiter {
26
+ font-family: monospace;
27
+ }
@@ -0,0 +1,17 @@
1
+ <%
2
+ fcsv_options = {
3
+ :row_sep => "\n",
4
+ :col_sep => params[:delimiter],
5
+ :force_quotes => @export_config.force_quotes,
6
+ :headers => @export_columns.collect { |column| format_export_column_header_name(column) }
7
+ }
8
+
9
+ data = FasterCSV.generate(fcsv_options) do |csv|
10
+ csv << fcsv_options[:headers] unless params[:skip_header] == 'true'
11
+ @records.each do |record|
12
+ csv << @export_columns.collect { |column|
13
+ get_export_column_value(record, column)
14
+ }
15
+ end
16
+ end
17
+ -%><%= data.html_safe -%>
@@ -0,0 +1,28 @@
1
+ <% export_config = active_scaffold_config.export %>
2
+ <div class="columns checkbox-list">
3
+ <% export_config.columns.each do |column| -%>
4
+ <div class="column checkbox-wrapper">
5
+ <%= content_tag(:label, check_box_tag("export_columns[#{column.name}]", 1, !export_config.default_deselected_columns.include?(column.name)) + "&nbsp;#{column.label}".html_safe) %>
6
+ </div>
7
+ <% end -%>
8
+ &nbsp;
9
+ </div>
10
+ <div class="separator"></div>
11
+ <h3><%=as_('Options')%></h3>
12
+ <div class="options checkbox-list">
13
+ <div class="option checkbox-wrapper">
14
+ <%= content_tag(:label, check_box_tag('skip_header', 1, export_config.default_skip_header) + " #{as_('Omit Header')}".html_safe) %>
15
+ </div>
16
+ <div class="option checkbox-wrapper">
17
+ <%= content_tag(:label, text_field_tag('delimiter', export_config.default_delimiter, :size => 1, :maxlength => 1) + " #{as_('Delimiter')}".html_safe) %>
18
+ </div>
19
+ <div class="separator"></div>
20
+ <div class="option checkbox-wrapper">
21
+ <%= content_tag(:label, radio_button_tag('full_download', false, !export_config.default_full_download) + " #{as_('This Page')}".html_safe) if export_config.allow_full_download %>
22
+ </div>
23
+ <div class="option checkbox-wrapper">
24
+ <%= content_tag(:label, radio_button_tag('full_download', true, export_config.default_full_download) + " #{as_('All Pages')}".html_safe) if export_config.allow_full_download %>
25
+ </div>
26
+ &nbsp;
27
+ </div>
28
+ <div class="separator"></div>
@@ -0,0 +1,7 @@
1
+ <%= render :partial => "base_form", :locals => {:xhr => false,
2
+ :form_action => :export,
3
+ :url_options => params_for(:action => :export, :format => 'csv'),
4
+ :method => :get,
5
+ :cancel_link => true,
6
+ :headline => as_('Columns to Export'),
7
+ :body_partial => 'export_form_body'} %>
@@ -0,0 +1,5 @@
1
+ <div class="active-scaffold">
2
+ <div class="show-export view">
3
+ <%= render :partial => 'show_export' -%>
4
+ </div>
5
+ </div>
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'active_scaffold_export'
data/install.rb ADDED
@@ -0,0 +1,31 @@
1
+ # Workaround a problem with script/plugin and http-based repos.
2
+ # See http://dev.rubyonrails.org/ticket/8189
3
+ Dir.chdir(Dir.getwd.sub(/vendor.*/, '')) do
4
+
5
+ ##
6
+ ## Copy over asset files (javascript/css/images) from the plugin directory to public/
7
+ ##
8
+
9
+ def copy_files(source_path, destination_path, directory)
10
+ source, destination = File.join(directory, source_path), File.join(Rails.root, destination_path)
11
+ FileUtils.mkdir(destination) unless File.exist?(destination)
12
+ FileUtils.cp_r(Dir.glob(source+'/*.*'), destination)
13
+ end
14
+
15
+ directory = File.dirname(__FILE__)
16
+
17
+ copy_files("/public", "/public", directory)
18
+
19
+ available_frontends = Dir[File.join(directory, 'frontends', '*')].collect { |d| File.basename d }
20
+ [ :stylesheets, :javascripts, :images].each do |asset_type|
21
+ path = "/public/#{asset_type}/active_scaffold"
22
+ copy_files(path, path, directory)
23
+
24
+ available_frontends.each do |frontend|
25
+ source = "/frontends/#{frontend}/#{asset_type}/"
26
+ destination = "/public/#{asset_type}/active_scaffold/#{frontend}"
27
+ copy_files(source, destination, directory)
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,114 @@
1
+ module ActiveScaffold::Actions
2
+ module Export
3
+ def self.included(base)
4
+ base.before_filter :export_authorized?, :only => [:export]
5
+ base.before_filter :init_session_var
6
+
7
+ as_export_plugin_path = File.join(ActiveScaffold::Config::Export.plugin_directory, 'frontends', 'default' , 'views')
8
+
9
+ base.add_active_scaffold_path as_export_plugin_path
10
+ end
11
+
12
+ def init_session_var
13
+ session[:search] = params[:search] if !params[:search].nil? || params[:commit] == as_('Search')
14
+ end
15
+
16
+ # display the customization form or skip directly to export
17
+ def show_export
18
+ export_config = active_scaffold_config.export
19
+ respond_to do |wants|
20
+ wants.html do
21
+ render(:partial => 'show_export', :layout => true)
22
+ end
23
+ wants.js do
24
+ render(:partial => 'show_export', :layout => false)
25
+ end
26
+ end
27
+ end
28
+
29
+ # if invoked directly, will use default configuration
30
+ def export
31
+ export_config = active_scaffold_config.export
32
+ if params[:export_columns].nil?
33
+ export_columns = {}
34
+ export_config.columns.each { |col|
35
+ export_columns[col.name.to_sym] = 1
36
+ }
37
+ options = {
38
+ :export_columns => export_columns,
39
+ :full_download => export_config.default_full_download.to_s,
40
+ :delimiter => export_config.default_delimiter,
41
+ :skip_header => export_config.default_skip_header.to_s
42
+ }
43
+ params.merge!(options)
44
+ end
45
+
46
+ # this is required if you want this to work with IE
47
+ if request.env['HTTP_USER_AGENT'] =~ /msie/i
48
+ response.headers['Pragma'] = "public"
49
+ response.headers['Cache-Control'] = "no-cache, must-revalidate, post-check=0, pre-check=0"
50
+ response.headers['Expires'] = "0"
51
+ end
52
+
53
+ response.headers['Content-type'] = 'text/csv'
54
+ response.headers['Content-Disposition'] = "attachment; filename=#{export_file_name}"
55
+
56
+ @export_columns = export_config.columns.reject { |col| params[:export_columns][col.name.to_sym].nil? }
57
+ includes_for_export_columns = @export_columns.collect{ |col| col.includes }.flatten.uniq.compact
58
+ self.active_scaffold_includes.concat includes_for_export_columns
59
+ @export_config = export_config
60
+
61
+ # start streaming output
62
+ self.response_body = proc { |response, output|
63
+ find_items_for_export do |records|
64
+ @records = records
65
+ str = render_to_string :partial => 'export', :layout => false
66
+ output.write(str)
67
+ params[:skip_header] = 'true' # skip header on the next run
68
+ end
69
+ }
70
+ end
71
+
72
+ protected
73
+ # The actual algorithm to do the export
74
+ def find_items_for_export(&block)
75
+ find_options = { :sorting =>
76
+ active_scaffold_config.list.user.sorting.nil? ?
77
+ active_scaffold_config.list.sorting : active_scaffold_config.list.user.sorting,
78
+ :pagination => true
79
+ }
80
+ params[:search] = session[:search]
81
+ do_search rescue nil
82
+ params[:segment_id] = session[:segment_id]
83
+ do_segment_search rescue nil
84
+
85
+ if params[:full_download] == 'true'
86
+ find_options.merge!({
87
+ :per_page => 10000,
88
+ :page => 1
89
+ })
90
+ find_page(find_options).pager.each do |page|
91
+ yield page.items
92
+ end
93
+ else
94
+ find_options.merge!({
95
+ :per_page => active_scaffold_config.list.user.per_page,
96
+ :page => active_scaffold_config.list.user.page
97
+ })
98
+ yield find_page(find_options).items
99
+ end
100
+ end
101
+
102
+ # The default name of the downloaded file.
103
+ # You may override the method to specify your own file name generation.
104
+ def export_file_name
105
+ "#{self.controller_name}.csv"
106
+ end
107
+
108
+ # The default security delegates to ActiveRecordPermissions.
109
+ # You may override the method to customize.
110
+ def export_authorized?
111
+ authorized_for?(:action => :read)
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,76 @@
1
+ module ActiveScaffold::Config
2
+ class Export < ActiveScaffold::Config::Form
3
+ self.crud_type = :read
4
+
5
+ def initialize(core_config)
6
+ @core = core_config
7
+ end
8
+
9
+ # global level configuration
10
+ # --------------------------
11
+ # the ActionLink for this action
12
+ cattr_accessor :link
13
+ @@link = ActiveScaffold::DataStructures::ActionLink.new('show_export', :label => :export, :type => :collection, :security_method => :export_authorized?)
14
+
15
+ # configures where the plugin itself is located. there is no instance version of this.
16
+ cattr_accessor :plugin_directory
17
+ @@plugin_directory = File.expand_path(__FILE__).match(%{(^.*)/lib/active_scaffold/config/export.rb})[1]
18
+
19
+
20
+ # instance-level configuration
21
+ # ----------------------------
22
+
23
+ attr_writer :link
24
+ def link
25
+ @link ||= if show_form
26
+ self.class.link.clone
27
+ else
28
+ ActiveScaffold::DataStructures::ActionLink.new('export', :label => :export, :type => :collection, :inline => false, :security_method => :export_authorized?)
29
+ end
30
+ end
31
+
32
+ attr_writer :show_form, :allow_full_download, :force_quotes, :default_full_download, :default_delimiter, :default_skip_header, :default_deselected_columns
33
+ def show_form
34
+ self.show_form = @core.export_show_form if @show_form.nil?
35
+ @show_form
36
+ end
37
+ def allow_full_download
38
+ self.allow_full_download = @core.export_allow_full_download if @allow_full_download.nil?
39
+ @allow_full_download
40
+ end
41
+ def force_quotes
42
+ self.force_quotes = @core.export_force_quotes if @force_quotes.nil?
43
+ @force_quotes
44
+ end
45
+ def default_full_download
46
+ self.default_full_download = @core.export_default_full_download if @default_full_download.nil?
47
+ @default_full_download
48
+ end
49
+ def default_delimiter
50
+ self.default_delimiter = @core.export_default_delimiter if @default_delimiter.nil?
51
+ @default_delimiter
52
+ end
53
+ def default_skip_header
54
+ self.default_skip_header = @core.export_default_skip_header if @default_skip_header.nil?
55
+ @default_skip_header
56
+ end
57
+ def default_deselected_columns
58
+ self.default_deselected_columns = [] if @default_deselected_columns.nil?
59
+ @default_deselected_columns
60
+ end
61
+
62
+ # provides access to the list of columns specifically meant for this action to use
63
+ def columns
64
+ self.columns = @core.columns._inheritable unless @columns
65
+ @columns
66
+ end
67
+ def columns=(val)
68
+ @columns = ActiveScaffold::DataStructures::ActionColumns.new(*val)
69
+ @columns.action = self
70
+ end
71
+
72
+ def multipart?
73
+ false
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,60 @@
1
+ module ActiveScaffold
2
+ module Helpers
3
+ # Helpers that assist with the rendering of a Export Column
4
+ module ExportHelpers
5
+ ## individual columns can be overridden by defining
6
+ # a helper method <column_name>_export_column(record)
7
+ # You can customize the output of all columns by
8
+ # overriding the following helper methods:
9
+ # format_export_column(raw_value)
10
+ # format_singular_association_export_column(association_record)
11
+ # format_plural_association_export_column(association_records)
12
+ def get_export_column_value(record, column)
13
+ if export_column_override? column
14
+ send(export_column_override(column), record)
15
+ else
16
+ raw_value = record.send(column.name)
17
+
18
+ if column.association.nil? or column_empty?(raw_value)
19
+ format_export_column(raw_value)
20
+ else
21
+ case column.association.macro
22
+ when :has_one, :belongs_to
23
+ format_singular_association_export_column(raw_value)
24
+ when :has_many, :has_and_belongs_to_many
25
+ format_plural_association_export_column(raw_value)
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ def export_column_override(column)
32
+ "#{column.name.to_s.gsub('?', '')}_export_column" # parse out any question marks (see issue 227)
33
+ end
34
+
35
+ def export_column_override?(column)
36
+ respond_to?(export_column_override(column))
37
+ end
38
+
39
+ def format_export_column(raw_value)
40
+ format_value(raw_value)
41
+ end
42
+
43
+ def format_singular_association_export_column(association_record)
44
+ format_value(association_record.to_label)
45
+ end
46
+
47
+ def format_plural_association_export_column(association_records)
48
+ firsts = association_records.first(4).collect { |v| v.to_label }
49
+ firsts[4] = "…" if firsts.length == 4
50
+ format_value(firsts.join(','))
51
+ end
52
+
53
+ ## This helper can be overridden to change the way that the headers
54
+ # are formatted. For instance, you might want column.name.to_s.humanize
55
+ def format_export_column_header_name(column)
56
+ column.name.to_s
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,17 @@
1
+ # Need to open the AS module carefully due to Rails 2.3 lazy loading
2
+ ActiveScaffold::Helpers::ViewHelpers.module_eval do
3
+ # Add the export plugin includes
4
+
5
+ # Provides stylesheets to include with +stylesheet_link_tag+
6
+ def active_scaffold_stylesheets_with_export(frontend = :default)
7
+ active_scaffold_stylesheets_without_export.to_a << ActiveScaffold::Config::Core.asset_path("export-stylesheet.css", frontend)
8
+ end
9
+ alias_method_chain :active_scaffold_stylesheets, :export
10
+
11
+ # Provides stylesheets for IE to include with +stylesheet_link_tag+
12
+ def active_scaffold_ie_stylesheets_with_export(frontend = :default)
13
+ active_scaffold_ie_stylesheets_without_export.to_a << ActiveScaffold::Config::Core.asset_path("export-stylesheet-ie.css", frontend)
14
+ end
15
+ alias_method_chain :active_scaffold_ie_stylesheets, :export
16
+
17
+ end
@@ -0,0 +1,25 @@
1
+ require 'active_scaffold' rescue nil
2
+ # Make sure that ActiveScaffold has already been included
3
+ ActiveScaffold rescue throw "should have included ActiveScaffold plug in first. Please make sure that this plug-in comes alphabetically after the ActiveScaffold plug-in"
4
+
5
+ # Load our overrides
6
+ require "#{File.dirname(__FILE__)}/active_scaffold_export/config/core.rb"
7
+ require "#{File.dirname(__FILE__)}/active_scaffold/config/export.rb"
8
+ require "#{File.dirname(__FILE__)}/active_scaffold/actions/export.rb"
9
+ require "#{File.dirname(__FILE__)}/active_scaffold/helpers/view_helpers_override.rb"
10
+ require "#{File.dirname(__FILE__)}/active_scaffold/helpers/export_helpers.rb"
11
+
12
+ ##
13
+ ## Run the install script, too, just to make sure
14
+ ## But at least rescue the action in production
15
+ ##
16
+ Rails::Application.initializer("active_scaffold_export_install_assets") do
17
+ begin
18
+ require File.dirname(__FILE__) + '/../install'
19
+ rescue
20
+ raise $! unless Rails.env == 'production'
21
+ end
22
+ end
23
+
24
+ # Register our helper methods
25
+ ActionView::Base.send(:include, ActiveScaffold::Helpers::ExportHelpers)
@@ -0,0 +1,17 @@
1
+ # Need to open the AS module carefully due to Rails 2.3 lazy loading
2
+ ActiveScaffold::Config::Core.class_eval do
3
+ # For some unobvious reasons, the class variables need to be defined
4
+ # *before* the cattr !!
5
+ @@export_show_form = true
6
+ @@export_allow_full_download = true
7
+ @@export_default_full_download = true
8
+ @@export_force_quotes = false
9
+ @@export_default_skip_header = false
10
+ @@export_default_delimiter = ','
11
+ cattr_accessor :export_show_form, :export_allow_full_download,
12
+ :export_force_quotes, :export_default_full_download,
13
+ :export_default_delimiter, :export_default_skip_header
14
+
15
+ ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:collection][:show_export] = :get
16
+ ActionDispatch::Routing::ACTIVE_SCAFFOLD_CORE_ROUTING[:collection][:export] = :get
17
+ end
metadata ADDED
@@ -0,0 +1,113 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_scaffold_export
3
+ version: !ruby/object:Gem::Version
4
+ hash: 51
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 4
10
+ version: 0.9.4
11
+ platform: ruby
12
+ authors:
13
+ - Mojo Tech, LLC
14
+ - see commits
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2010-11-18 00:00:00 -05:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: fastercsv
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: active_scaffold
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ description: This Active Scaffold plugin provides a configurable CSV 'Export' action for Active Scaffold controllers
51
+ email: chris@mojotech.com
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ extra_rdoc_files:
57
+ - README.markdown
58
+ files:
59
+ - Gemfile
60
+ - MIT-LICENSE
61
+ - README.markdown
62
+ - active_scaffold_export.gemspec
63
+ - frontends/default/images/export.png
64
+ - frontends/default/stylesheets/export-stylesheet-ie.css
65
+ - frontends/default/stylesheets/export-stylesheet.css
66
+ - frontends/default/views/_export.csv.erb
67
+ - frontends/default/views/_export_form_body.html.erb
68
+ - frontends/default/views/_show_export.html.erb
69
+ - frontends/default/views/show_export.html.erb
70
+ - init.rb
71
+ - install.rb
72
+ - lib/active_scaffold/actions/export.rb
73
+ - lib/active_scaffold/config/export.rb
74
+ - lib/active_scaffold/helpers/export_helpers.rb
75
+ - lib/active_scaffold/helpers/view_helpers_override.rb
76
+ - lib/active_scaffold_export.rb
77
+ - lib/active_scaffold_export/config/core.rb
78
+ has_rdoc: true
79
+ homepage: http://github.com/mojotech/active_scaffold_export
80
+ licenses: []
81
+
82
+ post_install_message:
83
+ rdoc_options:
84
+ - --charset=UTF-8
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ none: false
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ hash: 3
93
+ segments:
94
+ - 0
95
+ version: "0"
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ requirements: []
106
+
107
+ rubyforge_project:
108
+ rubygems_version: 1.3.7
109
+ signing_key:
110
+ specification_version: 3
111
+ summary: Active Scaffold plugin for CSV exports
112
+ test_files: []
113
+