datashift 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/README.markdown +91 -55
  3. data/VERSION +1 -1
  4. data/datashift.gemspec +8 -23
  5. data/lib/applications/jexcel_file.rb +1 -2
  6. data/lib/datashift.rb +34 -15
  7. data/lib/datashift/column_packer.rb +98 -34
  8. data/lib/datashift/data_transforms.rb +83 -0
  9. data/lib/datashift/delimiters.rb +58 -10
  10. data/lib/datashift/excel_base.rb +123 -0
  11. data/lib/datashift/exceptions.rb +45 -7
  12. data/lib/datashift/load_object.rb +25 -0
  13. data/lib/datashift/mapping_service.rb +91 -0
  14. data/lib/datashift/method_detail.rb +40 -62
  15. data/lib/datashift/method_details_manager.rb +18 -2
  16. data/lib/datashift/method_dictionary.rb +27 -10
  17. data/lib/datashift/method_mapper.rb +49 -41
  18. data/lib/datashift/model_mapper.rb +42 -22
  19. data/lib/datashift/populator.rb +258 -143
  20. data/lib/datashift/thor_base.rb +38 -0
  21. data/lib/exporters/csv_exporter.rb +57 -145
  22. data/lib/exporters/excel_exporter.rb +73 -60
  23. data/lib/generators/csv_generator.rb +65 -5
  24. data/lib/generators/generator_base.rb +69 -3
  25. data/lib/generators/mapping_generator.rb +112 -0
  26. data/lib/helpers/core_ext/csv_file.rb +33 -0
  27. data/lib/loaders/csv_loader.rb +41 -39
  28. data/lib/loaders/excel_loader.rb +130 -116
  29. data/lib/loaders/loader_base.rb +190 -146
  30. data/lib/loaders/paperclip/attachment_loader.rb +4 -4
  31. data/lib/loaders/paperclip/datashift_paperclip.rb +5 -3
  32. data/lib/loaders/paperclip/image_loading.rb +9 -7
  33. data/lib/loaders/reporter.rb +17 -8
  34. data/lib/thor/export.thor +12 -13
  35. data/lib/thor/generate.thor +1 -9
  36. data/lib/thor/import.thor +13 -24
  37. data/lib/thor/mapping.thor +65 -0
  38. data/spec/Gemfile +13 -11
  39. data/spec/Gemfile.lock +98 -93
  40. data/spec/csv_exporter_spec.rb +104 -99
  41. data/spec/csv_generator_spec.rb +159 -0
  42. data/spec/csv_loader_spec.rb +197 -16
  43. data/spec/datashift_spec.rb +9 -0
  44. data/spec/excel_exporter_spec.rb +149 -58
  45. data/spec/excel_generator_spec.rb +35 -44
  46. data/spec/excel_loader_spec.rb +196 -178
  47. data/spec/excel_spec.rb +8 -5
  48. data/spec/loader_base_spec.rb +47 -7
  49. data/spec/mapping_spec.rb +117 -0
  50. data/spec/method_dictionary_spec.rb +24 -11
  51. data/spec/method_mapper_spec.rb +5 -7
  52. data/spec/model_mapper_spec.rb +41 -0
  53. data/spec/paperclip_loader_spec.rb +3 -6
  54. data/spec/populator_spec.rb +48 -14
  55. data/spec/spec_helper.rb +85 -73
  56. data/spec/thor_spec.rb +40 -5
  57. metadata +93 -86
  58. data/lib/applications/excel_base.rb +0 -63
@@ -50,11 +50,11 @@ module DataShift
50
50
  # :attach_to_field => avatar : User.avatar = attachment
51
51
  #
52
52
  #
53
- def initialize(attachment_klazz, find_operators = true, attachment = nil, options = {})
53
+ def initialize(attachment_klazz, attachment = nil, options = {})
54
54
 
55
55
  init_from_options( options )
56
56
 
57
- super( attachment_klazz, find_operators, attachment, options.dup )
57
+ super( attachment_klazz, attachment, options.dup )
58
58
 
59
59
  puts "Attachment Class is #{load_object_class}" if(@verbose)
60
60
 
@@ -153,8 +153,8 @@ module DataShift
153
153
  # Check if attachment must have an associated record
154
154
  if(record)
155
155
  reset()
156
-
157
- create_attachment(@load_object_class, file_name, record, attach_to_field, options)
156
+
157
+ create_paperclip_attachment(@load_object_class, file_name, record, attach_to_field, options)
158
158
 
159
159
  puts "Added Attachment #{File.basename(file_name)} to #{record.send(attach_to_find_by_field)}(id : #{record.id})" if(@verbose)
160
160
  end
@@ -72,7 +72,9 @@ module DataShift
72
72
  #
73
73
  # Give : { :has_attached_file_attribute => :icon }
74
74
  #
75
- def create_attachment(klass, attachment_path, record = nil, attach_to_record_field = nil, options = {})
75
+ def create_paperclip_attachment(klass, attachment_path, record = nil, attach_to_record_field = nil, options = {})
76
+
77
+ logger.info("Paperclip::create_paperclip_attachment on Class #{klass}")
76
78
 
77
79
  has_attached_file_attribute = options[:has_attached_file_name] ? options[:has_attached_file_name].to_sym : :attachment
78
80
 
@@ -87,7 +89,7 @@ module DataShift
87
89
  @attachment = klass.new(paperclip_attributes, :without_protection => true)
88
90
  rescue => e
89
91
  logger.error( e.backtrace)
90
- logger.error("Failed to create PaperClip Attachment : #{e.inspect}")
92
+ logger.error("Failed to create PaperClip Attachment for cl;ass #{klass} : #{e.inspect}")
91
93
  raise CreateAttachmentFailed.new("Failed to create PaperClip Attachment from : #{attachment_path}")
92
94
  ensure
93
95
  attachment_file.close unless attachment_file.closed?
@@ -99,7 +101,7 @@ module DataShift
99
101
  puts "Success: Created Attachment #{@attachment.id} : #{@attachment.attachment_file_name}"
100
102
 
101
103
  if(attach_to_record_field.is_a? MethodDetail)
102
- DataShift::Populator.new().assign(attach_to_record_field, record, @attachment)
104
+ DataShift::Populator.new().prepare_and_assign(attach_to_record_field, record, @attachment)
103
105
  else
104
106
  # assume its not a has_many and try basic send
105
107
  record.send("#{attach_to_record_field}=", @attachment)
@@ -11,17 +11,17 @@ require 'attachment_loader'
11
11
  module DataShift
12
12
 
13
13
  module ImageLoading
14
-
14
+
15
+ include DataShift::Logging
15
16
  include DataShift::Paperclip
16
17
 
17
-
18
18
  # Note the paperclip attachment model defines the storage path via something like :
19
19
  #
20
20
  # => :path => ":rails_root/public/blah/blahs/:id/:style/:basename.:extension"
21
21
  #
22
22
  # Options
23
23
  #
24
- # See also DataShift::paperclip create_attachment for more options
24
+ # See also DataShift::paperclip create_paperclip_attachment for more options
25
25
  #
26
26
  # Example: Image is a model class with an attachment.
27
27
  # Image table contains a viewable field which can contain other models,
@@ -30,7 +30,9 @@ module DataShift
30
30
  # :viewable_record
31
31
  #
32
32
  def create_attachment(klass, attachment_path, record = nil, attach_to_record_field = nil, options = {})
33
-
33
+
34
+ logger.debug("ImageLoading::create_attachment on Class #{klass}")
35
+
34
36
  image_attributes = { :attributes =>
35
37
  { :alt => (options[:alt] || ""),
36
38
  :position => (!options[:position] && record and record.respond_to?(:images)) ? record.images.length : 0
@@ -39,9 +41,9 @@ module DataShift
39
41
 
40
42
  attachment_options = options.dup.merge(image_attributes)
41
43
 
42
- #puts "DEBUG : create_attachment options : #{attachment_options.inspect}"
43
-
44
- super(klass, attachment_path, record, attach_to_record_field, attachment_options)
44
+ logger.debug("Adding Attachment for #{klass.inspect}")
45
+
46
+ create_paperclip_attachment(klass, attachment_path, record, attach_to_record_field, attachment_options)
45
47
  end
46
48
 
47
49
  # Set of file extensions ImageMagik can process so default glob
@@ -11,10 +11,17 @@ module DataShift
11
11
  class Reporter
12
12
 
13
13
  include DataShift::Logging
14
-
15
- attr_accessor :processed_object_count, :loaded_objects, :failed_objects
16
14
 
17
-
15
+ # actual data rows/objects inbound
16
+ attr_accessor :processed_object_count
17
+ alias_method :processed_inbound_count, :processed_object_count
18
+
19
+ # DB objects created, updated etc
20
+ attr_accessor :loaded_objects, :failed_objects
21
+
22
+ # actual data rows/objects inbound
23
+ attr_accessor :success_inbound_count, :failed_inbound_count
24
+
18
25
  def initialize()
19
26
  reset
20
27
  end
@@ -22,10 +29,11 @@ module DataShift
22
29
  def reset()
23
30
  @processed_object_count = 0
24
31
  @loaded_objects, @failed_objects = [], []
32
+ @success_inbound_count, @failed_inbound_count = 0,0
25
33
  end
26
34
 
27
35
  def add_loaded_object(object)
28
- @loaded_objects << object unless(object.nil? || @loaded_objects.include?(object))
36
+ @loaded_objects << object.id unless(object.nil? || @loaded_objects.include?(object))
29
37
  end
30
38
 
31
39
  def add_failed_object(object)
@@ -37,12 +45,13 @@ module DataShift
37
45
 
38
46
  puts "\nProcessing Summary Report"
39
47
  puts ">>>>>>>>>>>>>>>>>>>>>>>>>\n"
40
- puts "Processed total of #{processed_object_count} #{processed_object_count > 1 ? 'entries' : 'entry'}"
41
- puts "#{loaded_objects.size} objects were succesfully processed."
42
-
48
+ puts "Processed total of #{processed_object_count} inbound #{processed_object_count > 1 ? 'entries' : 'entry'}"
49
+ puts "#{loaded_objects.size}\tdatabase objects were successfully processed."
50
+ puts "#{success_inbound_count}\tinbound rows were successfully processed."
51
+
43
52
  puts "There were NO failures." if failed_objects.empty?
44
53
 
45
- puts "WARNING : Check logs : #{failed_objects.size} rows contained errors and #{failed_objects.size} records NOT created." unless failed_objects.empty?
54
+ puts "WARNING : Check logs : #{failed_objects.size} rows contained errors" unless failed_objects.empty?
46
55
  end
47
56
 
48
57
  end
@@ -15,16 +15,17 @@
15
15
  #
16
16
  # => bundle exec thor datashift:export:excel -m <active record class> -r <output_template.xls> -a
17
17
  #
18
+ require 'thor_base'
19
+
20
+
18
21
  require 'datashift'
19
-
20
- # Note, not DataShift, case sensitive, create namespace for command line : datashift
22
+
23
+ # Note, for thor not DataShift, case sensitive, want namespace for cmd line to be : datashift
21
24
  module Datashift
22
25
 
23
26
 
24
- class Export < Thor
25
-
26
- include DataShift::Logging
27
-
27
+ class Export < DataShift::DSThorBase
28
+
28
29
  desc "excel", "export any active record model (with optional associations)"
29
30
  method_option :model, :aliases => '-m', :required => true, :desc => "The active record model to export"
30
31
  method_option :result, :aliases => '-r', :required => true, :desc => "Create template of model in supplied file"
@@ -32,11 +33,9 @@ module Datashift
32
33
  method_option :exclude, :aliases => '-e', :type => :array, :desc => "Use with -a : Exclude association types. Any from #{DataShift::MethodDetail::supported_types_enum.to_a.inspect}"
33
34
 
34
35
  def excel()
35
-
36
- # TODO - We're assuming run from a rails app/top level dir...
37
- # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
38
- require File.expand_path('config/environment.rb')
39
-
36
+
37
+ start_connections
38
+
40
39
  require 'excel_exporter'
41
40
 
42
41
  model = options[:model]
@@ -44,7 +43,7 @@ module Datashift
44
43
 
45
44
  logger.info "Datashift: Start Excel export to #{result}"
46
45
 
47
- klass = ModelMapper::class_from_string(model) #Kernel.const_get(model)
46
+ klass = DataShift::ModelMapper::class_from_string(model) #Kernel.const_get(model)
48
47
 
49
48
  raise "ERROR: No such Model [#{model}] found - check valid model supplied via -model <Class>" if(klass.nil?)
50
49
 
@@ -86,7 +85,7 @@ module Datashift
86
85
 
87
86
  logger.info "Datashift: Start CSV export to #{result}"
88
87
 
89
- klass = ModelMapper::class_from_string(model) #Kernel.const_get(model)
88
+ klass = DataShift::ModelMapper::class_from_string(model) #Kernel.const_get(model)
90
89
 
91
90
  raise "ERROR: No such Model [#{model}] found - check valid model supplied via -model <Class>" if(klass.nil?)
92
91
 
@@ -46,16 +46,8 @@ module Datashift
46
46
  result = options[:result]
47
47
 
48
48
  logger.info "Datashift: Start Excel template generation in #{result}"
49
-
50
- begin
51
- # support modules e.g "Spree::Property")
52
- klass = ModelMapper::class_from_string(model) #Kernel.const_get(model)
53
- rescue NameError => e
54
- puts e
55
- raise Thor::Error.new("ERROR: No such Model [#{model}] found - check valid model supplied")
56
- end
57
49
 
58
- raise Thor::Error.new("ERROR: No such Model [#{model}] found - check valid model supplied") unless(klass)
50
+ klass = DataShift::ModelMapper.class_from_string_or_raise( model )
59
51
 
60
52
  begin
61
53
  gen = DataShift::ExcelGenerator.new(result)
@@ -44,38 +44,33 @@ module Datashift
44
44
  require 'excel_loader'
45
45
 
46
46
  model = options[:model]
47
- begin
48
- # support modules e.g "Spree::Property")
49
- klass = ModelMapper::class_from_string(model)
50
- rescue NameError
51
- raise "ERROR: No such AR Model found - check valid model supplied with -m <Class>"
52
- end
53
47
 
54
- raise "ERROR: No such AR Model found - check valid model supplied with -m <Class>" if(klass.nil?)
55
-
48
+ klass = DataShift::ModelMapper.class_from_string_or_raise( model )
49
+
50
+ loader_options = { :instance_methods => true }
51
+
56
52
  if(options[:loader])
57
53
  begin
58
54
 
59
- loader_klass = ModelMapper::class_from_string(options[:loader])
55
+ loader_klass = DataShift::ModelMapper::class_from_string(options[:loader])
60
56
 
61
57
  loader = loader_klass.new(klass)
62
58
 
63
59
  logger.info("INFO: Using loader : #{loader.class}")
64
60
  rescue
65
61
  logger.error("INFO: No specific #{model}Loader found - using generic ExcelLoader")
66
- loader = DataShift::ExcelLoader.new(klass, true)
62
+ loader = DataShift::ExcelLoader.new(klass, nil, loader_options)
67
63
  end
68
64
  else
69
65
  logger.info("No Loader specified - using generic ExcelLoader")
70
- loader = DataShift::ExcelLoader.new(klass, true)
66
+ loader = DataShift::ExcelLoader.new(klass, nil, loader_options)
71
67
  end
72
68
 
73
- logger.info("ARGS #{options.inspect}")
74
- loader.logger.verbose if(options['verbose'])
69
+ #TOFIX - multi loggers to file + STDOUT
70
+ # loader.logger.verbose if(options['verbose'])
75
71
 
76
72
  loader.configure_from( options[:config] ) if(options[:config])
77
73
 
78
-
79
74
  loader.perform_load(options[:input])
80
75
  end
81
76
 
@@ -96,19 +91,13 @@ module Datashift
96
91
  require 'csv_loader'
97
92
 
98
93
  model = options[:model]
99
- begin
100
- # support modules e.g "Spree::Property")
101
- klass = ModelMapper::class_from_string(model)
102
- rescue NameError
103
- raise "ERROR: No such AR Model found - check valid model supplied with -m <Class>"
104
- end
105
94
 
106
- raise "ERROR: No such AR Model found - check valid model supplied with -m <Class>" if(klass.nil?)
107
-
95
+ klass = DataShift::ModelMapper.class_from_string_or_raise( model )
108
96
 
109
97
  loader = DataShift::CsvLoader.new(klass)
110
-
111
- loader.logger.verbose if(options['verbose'])
98
+
99
+ #TOFIX - multi loggers to file + STDOUT
100
+ # loader.logger.verbose if(options['verbose'])
112
101
 
113
102
  loader.configure_from( options[:config] ) if(options[:config])
114
103
 
@@ -0,0 +1,65 @@
1
+ # Copyright:: (c) Autotelik Media Ltd 2015
2
+ # Author :: Tom Statter
3
+ # Date :: Mar 2015
4
+ # License:: MIT.
5
+ #
6
+ # Usage::
7
+ #
8
+ # To pull Datashift commands into your main application :
9
+ #
10
+ # require 'datashift'
11
+ #
12
+ # DataShift::load_commands
13
+ #
14
+ require 'datashift'
15
+
16
+ # Note, not DataShift, case sensitive, create namespace for command line : datashift
17
+ module Datashift
18
+
19
+
20
+ class Mapping < Thor
21
+
22
+ include DataShift::Logging
23
+
24
+ desc "template", "Generate a simple mappings template\nInput is treated as the *source* unless otherwise directed"
25
+
26
+ method_option :model, :aliases => '-m', :desc => "The active record model to use for mappings"
27
+ method_option :model_as_dest, :aliases => '-d', :type=> :boolean, :desc => "Set model attributes as destination"
28
+
29
+ method_option :excel, :aliases => '-e', :desc => "The excel spreadsheet to use for mappings"
30
+ method_option :excel_as_dest, :aliases => '-a', :type=> :boolean, :desc => "Set excel headers as destination"
31
+
32
+ method_option :result, :aliases => '-r', :required => true, :desc => "Create template of model in supplied file"
33
+
34
+ def template()
35
+
36
+ # TODO - We're assuming run from a rails app/top level dir...
37
+ # ...can we make this more robust ? e.g what about when using active record but not in Rails app,
38
+ require File.expand_path('config/environment.rb')
39
+
40
+ result = options[:result]
41
+
42
+ if(File.directory?(result))
43
+ result = File.join(result, "mapping_template.yaml")
44
+ puts "Output generated in #{result}"
45
+ end
46
+
47
+ logger.info "Datashift: Starting mapping template generation in #{result}"
48
+
49
+ mapper = DataShift::MappingGenerator.new(result)
50
+
51
+ model = options[:model]
52
+
53
+ mappings = String.new
54
+
55
+ mappings += mapper.generate(model, options) unless(model.nil? && options[:excel])
56
+
57
+ mappings += mapper.generate_from_excel(options[:excel], options) if(options[:excel])
58
+
59
+ File.open(result, 'w') { |f| f << mappings }
60
+
61
+ end
62
+
63
+ end
64
+
65
+ end
@@ -1,21 +1,23 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
-
3
+
4
4
  # DEFINE WHICH VERSIONS ON VITAL GEMS WE WANT TO TEST WITH
5
5
 
6
- gem 'rails', '4.0.4'
6
+ gem 'rails', '4.1.8'
7
7
 
8
- gem 'spreadsheet'
8
+ gem 'spreadsheet', '1.0.0'
9
9
  gem 'paperclip'
10
+ gem 'activesupport'
10
11
 
12
+ gem 'database_cleaner'
11
13
 
12
- gem 'rspec' # Behavior Driven Development (BDD) for Ruby
13
- gem 'rspec-core' # RSpec runner and example groups.
14
- gem 'rspec-expectations' # RSpec matchers for should and should_not.
15
- gem 'rspec-mocks' # RSpec test double framework with stubbing and mocking.
16
- gem 'rspec-rails' # RSpec version 2.x for Rails version 3.x.
14
+ gem 'factory_girl_rails'
17
15
 
18
- gem 'sqlite3'
16
+ gem 'rspec'
17
+ gem 'rspec-core'
18
+ gem 'rspec-expectations' # RSpec matchers for should and should_not.
19
+ gem 'rspec-mocks' # RSpec test double framework with stubbing and mocking.
20
+ gem 'rspec-rails' # RSpec version 2.x for Rails version 3.x.
19
21
 
20
22
  # we need both, for JRuby testing of Excel and non JRuby csv
21
23
  platform :jruby do
@@ -23,7 +25,7 @@ platform :jruby do
23
25
  gem 'activerecord-jdbcsqlite3-adapter'
24
26
  end
25
27
 
26
- platform :ruby do
27
- #gem 'activerecord-sqlite3-adapter'
28
+ platform :ruby do
29
+ gem 'sqlite3'
28
30
  end
29
31
 
@@ -1,129 +1,134 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- actionmailer (4.0.4)
5
- actionpack (= 4.0.4)
6
- mail (~> 2.5.4)
7
- actionpack (4.0.4)
8
- activesupport (= 4.0.4)
9
- builder (~> 3.1.0)
10
- erubis (~> 2.7.0)
4
+ actionmailer (4.1.8)
5
+ actionpack (= 4.1.8)
6
+ actionview (= 4.1.8)
7
+ mail (~> 2.5, >= 2.5.4)
8
+ actionpack (4.1.8)
9
+ actionview (= 4.1.8)
10
+ activesupport (= 4.1.8)
11
11
  rack (~> 1.5.2)
12
12
  rack-test (~> 0.6.2)
13
- activemodel (4.0.4)
14
- activesupport (= 4.0.4)
15
- builder (~> 3.1.0)
16
- activerecord (4.0.4)
17
- activemodel (= 4.0.4)
18
- activerecord-deprecated_finders (~> 1.0.2)
19
- activesupport (= 4.0.4)
20
- arel (~> 4.0.0)
21
- activerecord-deprecated_finders (1.0.3)
22
- activerecord-jdbc-adapter (1.3.7)
23
- activerecord (>= 2.2)
24
- activerecord-jdbcsqlite3-adapter (1.3.7)
25
- activerecord-jdbc-adapter (~> 1.3.7)
26
- jdbc-sqlite3 (~> 3.7.2)
27
- activesupport (4.0.4)
13
+ actionview (4.1.8)
14
+ activesupport (= 4.1.8)
15
+ builder (~> 3.1)
16
+ erubis (~> 2.7.0)
17
+ activemodel (4.1.8)
18
+ activesupport (= 4.1.8)
19
+ builder (~> 3.1)
20
+ activerecord (4.1.8)
21
+ activemodel (= 4.1.8)
22
+ activesupport (= 4.1.8)
23
+ arel (~> 5.0.0)
24
+ activesupport (4.1.8)
28
25
  i18n (~> 0.6, >= 0.6.9)
29
- minitest (~> 4.2)
30
- multi_json (~> 1.3)
26
+ json (~> 1.7, >= 1.7.7)
27
+ minitest (~> 5.1)
31
28
  thread_safe (~> 0.1)
32
- tzinfo (~> 0.3.37)
33
- arel (4.0.2)
34
- bouncy-castle-java (1.5.0147)
35
- builder (3.1.4)
29
+ tzinfo (~> 1.1)
30
+ arel (5.0.1.20140414130214)
31
+ builder (3.2.2)
36
32
  climate_control (0.0.3)
37
33
  activesupport (>= 3.0)
38
- cocaine (0.5.4)
34
+ cocaine (0.5.8)
39
35
  climate_control (>= 0.0.3, < 1.0)
36
+ concurrent-ruby (1.0.1)
37
+ database_cleaner (1.5.1)
40
38
  diff-lcs (1.2.5)
41
39
  erubis (2.7.0)
42
- hike (1.2.3)
43
- i18n (0.6.9)
44
- jdbc-sqlite3 (3.7.2.1)
45
- jruby-openssl (0.9.4)
46
- bouncy-castle-java (>= 1.5.0147)
47
- mail (2.5.4)
48
- mime-types (~> 1.16)
49
- treetop (~> 1.4.8)
50
- mime-types (1.25.1)
51
- minitest (4.7.5)
52
- multi_json (1.10.0)
53
- paperclip (4.1.1)
54
- activemodel (>= 3.0.0)
40
+ factory_girl (4.5.0)
55
41
  activesupport (>= 3.0.0)
56
- cocaine (~> 0.5.3)
42
+ factory_girl_rails (4.6.0)
43
+ factory_girl (~> 4.5.0)
44
+ railties (>= 3.0.0)
45
+ i18n (0.7.0)
46
+ json (1.8.3)
47
+ mail (2.6.3)
48
+ mime-types (>= 1.16, < 3)
49
+ mime-types (2.99.1)
50
+ mimemagic (0.3.0)
51
+ minitest (5.8.4)
52
+ paperclip (4.3.5)
53
+ activemodel (>= 3.2.0)
54
+ activesupport (>= 3.2.0)
55
+ cocaine (~> 0.5.5)
57
56
  mime-types
58
- polyglot (0.3.4)
59
- rack (1.5.2)
60
- rack-test (0.6.2)
57
+ mimemagic (= 0.3.0)
58
+ rack (1.5.5)
59
+ rack-test (0.6.3)
61
60
  rack (>= 1.0)
62
- rails (4.0.4)
63
- actionmailer (= 4.0.4)
64
- actionpack (= 4.0.4)
65
- activerecord (= 4.0.4)
66
- activesupport (= 4.0.4)
61
+ rails (4.1.8)
62
+ actionmailer (= 4.1.8)
63
+ actionpack (= 4.1.8)
64
+ actionview (= 4.1.8)
65
+ activemodel (= 4.1.8)
66
+ activerecord (= 4.1.8)
67
+ activesupport (= 4.1.8)
67
68
  bundler (>= 1.3.0, < 2.0)
68
- railties (= 4.0.4)
69
- sprockets-rails (~> 2.0.0)
70
- railties (4.0.4)
71
- actionpack (= 4.0.4)
72
- activesupport (= 4.0.4)
69
+ railties (= 4.1.8)
70
+ sprockets-rails (~> 2.0)
71
+ railties (4.1.8)
72
+ actionpack (= 4.1.8)
73
+ activesupport (= 4.1.8)
73
74
  rake (>= 0.8.7)
74
75
  thor (>= 0.18.1, < 2.0)
75
- rake (10.3.2)
76
- rspec (2.14.1)
77
- rspec-core (~> 2.14.0)
78
- rspec-expectations (~> 2.14.0)
79
- rspec-mocks (~> 2.14.0)
80
- rspec-core (2.14.8)
81
- rspec-expectations (2.14.5)
82
- diff-lcs (>= 1.1.3, < 2.0)
83
- rspec-mocks (2.14.6)
84
- rspec-rails (2.14.2)
85
- actionpack (>= 3.0)
86
- activemodel (>= 3.0)
87
- activesupport (>= 3.0)
88
- railties (>= 3.0)
89
- rspec-core (~> 2.14.0)
90
- rspec-expectations (~> 2.14.0)
91
- rspec-mocks (~> 2.14.0)
92
- ruby-ole (1.2.11.7)
93
- spreadsheet (0.9.7)
76
+ rake (11.0.1)
77
+ rspec (3.4.0)
78
+ rspec-core (~> 3.4.0)
79
+ rspec-expectations (~> 3.4.0)
80
+ rspec-mocks (~> 3.4.0)
81
+ rspec-core (3.4.4)
82
+ rspec-support (~> 3.4.0)
83
+ rspec-expectations (3.4.0)
84
+ diff-lcs (>= 1.2.0, < 2.0)
85
+ rspec-support (~> 3.4.0)
86
+ rspec-mocks (3.4.1)
87
+ diff-lcs (>= 1.2.0, < 2.0)
88
+ rspec-support (~> 3.4.0)
89
+ rspec-rails (3.4.2)
90
+ actionpack (>= 3.0, < 4.3)
91
+ activesupport (>= 3.0, < 4.3)
92
+ railties (>= 3.0, < 4.3)
93
+ rspec-core (~> 3.4.0)
94
+ rspec-expectations (~> 3.4.0)
95
+ rspec-mocks (~> 3.4.0)
96
+ rspec-support (~> 3.4.0)
97
+ rspec-support (3.4.1)
98
+ ruby-ole (1.2.12)
99
+ spreadsheet (1.0.0)
94
100
  ruby-ole (>= 1.0)
95
- sprockets (2.12.1)
96
- hike (~> 1.2)
97
- multi_json (~> 1.0)
98
- rack (~> 1.0)
99
- tilt (~> 1.1, != 1.3.0)
100
- sprockets-rails (2.0.1)
101
+ sprockets (3.5.2)
102
+ concurrent-ruby (~> 1.0)
103
+ rack (> 1, < 3)
104
+ sprockets-rails (2.3.3)
101
105
  actionpack (>= 3.0)
102
106
  activesupport (>= 3.0)
103
- sprockets (~> 2.8)
104
- sqlite3 (1.3.9)
107
+ sprockets (>= 2.8, < 4.0)
108
+ sqlite3 (1.3.11)
105
109
  thor (0.19.1)
106
- thread_safe (0.3.3)
107
- thread_safe (0.3.3-java)
108
- tilt (1.4.1)
109
- treetop (1.4.15)
110
- polyglot
111
- polyglot (>= 0.3.1)
112
- tzinfo (0.3.39)
110
+ thread_safe (0.3.5)
111
+ tzinfo (1.2.2)
112
+ thread_safe (~> 0.1)
113
113
 
114
114
  PLATFORMS
115
- java
116
115
  ruby
117
116
 
118
117
  DEPENDENCIES
119
118
  activerecord-jdbcsqlite3-adapter
119
+ activesupport
120
+ database_cleaner
121
+ factory_girl_rails
120
122
  jruby-openssl
121
123
  paperclip
122
- rails (= 4.0.4)
124
+ rails (= 4.1.8)
123
125
  rspec
124
126
  rspec-core
125
127
  rspec-expectations
126
128
  rspec-mocks
127
129
  rspec-rails
128
- spreadsheet
130
+ spreadsheet (= 1.0.0)
129
131
  sqlite3
132
+
133
+ BUNDLED WITH
134
+ 1.11.2