datashift 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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