prelands_rails 0.1.0 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.ci/dver.rb +5 -0
  3. data/.dockerignore +17 -0
  4. data/.gitignore +2 -1
  5. data/.gitlab-ci.yml +29 -0
  6. data/.rspec +0 -1
  7. data/Dockerfile +27 -0
  8. data/Gemfile.lock +609 -601
  9. data/Makefile +11 -0
  10. data/README.md +6 -0
  11. data/build_and_push.sh +4 -0
  12. data/docker-compose.local.yml +9 -0
  13. data/lib/prelands_rails/concerns/base.rb +11 -3
  14. data/lib/prelands_rails/create_simple_source/check_zip_files/extract_files.rb +2 -2
  15. data/lib/prelands_rails/create_simple_source/check_zip_files.rb +4 -0
  16. data/lib/prelands_rails/create_simple_source/upload.rb +1 -1
  17. data/lib/prelands_rails/create_simple_source/validate_zip_content/validate_css/css.rb +60 -0
  18. data/lib/prelands_rails/create_simple_source/validate_zip_content/validate_css.rb +35 -0
  19. data/lib/prelands_rails/create_simple_source/validate_zip_content/validate_html/html.rb +3 -3
  20. data/lib/prelands_rails/create_simple_source/validate_zip_content/validate_incoming_files/zip_archive.rb +88 -0
  21. data/lib/prelands_rails/create_simple_source/validate_zip_content/validate_incoming_files.rb +31 -0
  22. data/lib/prelands_rails/create_simple_source/validate_zip_content/validate_js.rb +5 -1
  23. data/lib/prelands_rails/create_simple_source/validate_zip_content.rb +2 -2
  24. data/lib/prelands_rails/create_simple_source.rb +1 -0
  25. data/lib/prelands_rails/recompile_simple_source/download_zip.rb +39 -0
  26. data/lib/prelands_rails/recompile_simple_source/upload.rb +39 -0
  27. data/lib/prelands_rails/recompile_simple_source.rb +58 -0
  28. data/lib/prelands_rails/update_simple_source/validate_zip_content.rb +4 -6
  29. data/lib/prelands_rails/update_simple_source.rb +1 -0
  30. data/lib/prelands_rails/validate_simple_source.rb +1 -0
  31. data/lib/prelands_rails.rb +8 -2
  32. data/prelands_rails.gemspec +10 -7
  33. metadata +63 -24
  34. data/.travis.yml +0 -6
  35. data/lib/prelands_rails/version.rb +0 -3
data/Makefile CHANGED
@@ -1,4 +1,15 @@
1
+ .PHONY: test all
2
+
1
3
  DIR = $(shell pwd)
2
4
 
3
5
  setup_local_gem:
4
6
  bundle config local.prelands_rails $(DIR)
7
+
8
+ all:
9
+ @docker-compose -f docker-compose.local.yml build
10
+
11
+ test:
12
+ @docker-compose -f docker-compose.local.yml run runner rspec
13
+
14
+ build_and_push_docker:
15
+ ./build_and_push.sh
data/README.md CHANGED
@@ -2,3 +2,9 @@
2
2
 
3
3
  Код, занимающийся валидацией и публикацией прелендов V4.
4
4
 
5
+ # How to publish gem
6
+
7
+ 1. Bump version inside `prelands_rails.gemspec`.
8
+ 2. Make commit & push to `master` branch.
9
+ 3. Then checkout `tags` branch and `git rebase master` (accept theirs if there are any conflicts).
10
+ 4. Then `git push` - and Gitlab CI publish the new version of the gem.
data/build_and_push.sh ADDED
@@ -0,0 +1,4 @@
1
+ #!/bin/sh
2
+
3
+ docker build -t registry.gitlab.com/c80609a/prelands_rails .
4
+ docker push registry.gitlab.com/c80609a/prelands_rails
@@ -0,0 +1,9 @@
1
+ version: '3.4'
2
+
3
+ services:
4
+ runner:
5
+ image: prelands_rails:runner
6
+ build:
7
+ context: .
8
+ dockerfile: Dockerfile
9
+ target: runner
@@ -5,8 +5,11 @@ module PrelandsRails
5
5
 
6
6
  private
7
7
 
8
- RX_HTML_FILE = /\.html/
9
- NAME_RX = /index_(\w{2})\.html/
8
+ RX_HTML_FILE = /\.html/
9
+ RX_CSS_FILE = /\.css/.freeze
10
+ NAME_RX = /index_(\w{2})\.html/
11
+ # DIST_FOLDER = 'dist'
12
+ # KNOWN_FILES_EXTENSIONS = /\.(gif|jpe?g|tiff?|png|webp|bmp|mov|avi|wmv|flv|3gp|mp4|mpg|css|js|ico|icon)/.freeze
10
13
 
11
14
  # извлекаем входящие html файлы из контекста
12
15
  def incoming_html_files
@@ -18,8 +21,13 @@ module PrelandsRails
18
21
  context.compiled_htmls.select { |key| key =~ RX_HTML_FILE }
19
22
  end
20
23
 
24
+ # извлекаем входящие css файлы из контекста
25
+ def incoming_css_files
26
+ context.files_content.select { |key| key =~ RX_CSS_FILE }
27
+ end
28
+
21
29
  def make_tmp_path
22
- 'tmp/cache/%s' % SecureRandom.uuid
30
+ '/tmp/%s' % SecureRandom.uuid
23
31
  end
24
32
  end
25
33
  end
@@ -12,14 +12,14 @@ module PrelandsRails
12
12
  next unless expected_files.find_index { |efile| efile.name == entry.name }.present?
13
13
 
14
14
  # Extract
15
- tmp_path = Rails.root.join make_tmp_path
15
+ tmp_path = make_tmp_path
16
16
  entry.extract tmp_path
17
17
 
18
18
  # Read into memory
19
19
  content = entry.get_input_stream.read
20
20
 
21
21
  # Remove tmp file
22
- File.delete(tmp_path) if File.exist?(tmp_path)
22
+ # File.delete(tmp_path) if File.exist?(tmp_path)
23
23
 
24
24
  [entry.name, content]
25
25
  end.compact.to_h
@@ -27,6 +27,7 @@ module PrelandsRails
27
27
 
28
28
  assures do
29
29
  required(:files_content).value(type?: Hash) # js,html,css: { file_name => file_content, ... }
30
+ required(:incoming_files).value(type?: Array) # список всех файлов архива { ftype, name }
30
31
  end
31
32
 
32
33
  before do
@@ -56,6 +57,9 @@ module PrelandsRails
56
57
  rx1 = /\.(css|js|html)/
57
58
  files = @expected_files.select { |file| file.ftype == :file && file.name =~ rx1 }
58
59
  context.files_content, context.tmp_paths = read_into_memory files, context.archive.tempfile
60
+
61
+ # фиксируем список всех файлов из архива
62
+ context.incoming_files = incoming_files
59
63
  end
60
64
 
61
65
  def incoming_files
@@ -64,7 +64,7 @@ module PrelandsRails
64
64
  zipfile.map do |entry|
65
65
  next if entry.name.index(IMAGES) != 0
66
66
 
67
- tmp_path = Rails.root.join make_tmp_path
67
+ tmp_path = make_tmp_path
68
68
  entry.extract tmp_path
69
69
  @tmp_paths << tmp_path
70
70
 
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrelandsRails
4
+ class CreateSimpleSource
5
+ class ValidateZipContent
6
+ class ValidateCss
7
+ #
8
+ # Принимает строку с css и валидирует её.
9
+ # Правила, обязательные для всех css файлов.
10
+ #
11
+ class Css
12
+ attr_reader :errors
13
+
14
+ CUSTOM_FONTS = /\.(eot|woff|woff2|ttf)/.freeze
15
+ SVG_LINKS_DETECTED = /\.svg/.freeze
16
+ IMAGES_BAD_PATH = /\/images/.freeze
17
+
18
+ # @param [String] string Содержимое css файла.
19
+ def initialize(string)
20
+ @errors = []
21
+ @string = string
22
+ end
23
+
24
+ def valid?
25
+ @errors = [
26
+ check_svg_links,
27
+ check_images_relative_paths,
28
+ check_custom_fonts_absence
29
+ ].compact
30
+
31
+ @errors.none?
32
+ end
33
+
34
+ private
35
+
36
+ # @return [nil] Если всё ОК
37
+ # @return [String] Иначе - вернёт сообщение об ошибке
38
+
39
+ def check_svg_links
40
+ return unless @string =~ SVG_LINKS_DETECTED
41
+
42
+ 'Links to svg detected inside css file. Please, use inline variant of svg.'
43
+ end
44
+
45
+ def check_images_relative_paths
46
+ return unless @string =~ IMAGES_BAD_PATH
47
+
48
+ 'Images urls in css files must be relative.'
49
+ end
50
+
51
+ def check_custom_fonts_absence
52
+ return unless @string =~ CUSTOM_FONTS
53
+
54
+ 'Custom fonts detected in css files. Please, use Google fonts.'
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrelandsRails
4
+ class CreateSimpleSource
5
+ class ValidateZipContent
6
+ #
7
+ # Валидирует все css файлы.
8
+ #
9
+ class ValidateCss
10
+ include ::PrelandsRails::AbstractInteractor
11
+ include ::Interactor
12
+ include ::Interactor::Contracts
13
+ include ::PrelandsRails::Base
14
+
15
+ expects do
16
+ required(:files_content).value(type?: Hash) # { file_name => file_content, ... }
17
+ end
18
+
19
+ assures do
20
+
21
+ end
22
+
23
+ def act
24
+ errors =
25
+ incoming_css_files.map do |key, content|
26
+ content = Css.new(content)
27
+ next if content.valid?
28
+ [key, content.errors]
29
+ end.compact.to_h
30
+ fail! errors: errors if errors.any?
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -86,7 +86,7 @@ module PrelandsRails
86
86
  title_rx = /<title>[^<]+<\/title>/
87
87
  return if @string[title_rx]
88
88
 
89
- 'Tag <title> not found.'
89
+ 'Tag `title` not found.'
90
90
  end
91
91
 
92
92
  def check_a_hrefs
@@ -97,10 +97,10 @@ module PrelandsRails
97
97
  end
98
98
 
99
99
  def check_favicon
100
- favicon_rx = '<link rel="shortcut icon" href="icon.ico">'
100
+ favicon_rx = /<link.+href="icon.ico">/
101
101
  return if @string[favicon_rx]
102
102
 
103
- '<link rel="shortcut icon" href="icon.ico"> not found.'
103
+ '`link href="icon.ico"` not found.'
104
104
  end
105
105
 
106
106
  protected
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrelandsRails
4
+ class CreateSimpleSource
5
+ class ValidateZipContent
6
+ class ValidateIncomingFiles
7
+ class ZipArchive
8
+ attr_reader :errors
9
+
10
+ # @param [Array<{ftype, name}>] incoming_files
11
+ def initialize(incoming_files)
12
+ @errors = []
13
+ @incoming_files = incoming_files
14
+ end
15
+
16
+ def valid?
17
+ @errors = [
18
+ check_app_js,
19
+ check_app_css,
20
+ check_favicon,
21
+ check_svg_absence
22
+ ].compact
23
+
24
+ @errors.none?
25
+ end
26
+
27
+ private
28
+
29
+ # @return [nil] Если `index.js` находится в корне zip-архива.
30
+ # @return [String] Иначе - вернёт сообщение об ошибке
31
+ def check_app_js
32
+ check 'index.js', 'index.js',
33
+ 'The «index.js» JAVASCRIPT file is not found in the zip-archive',
34
+ 'The «index.js» JAVASCRIPT file is not in root of the zip-archive: expected «index.js», got «%s»'
35
+ end
36
+
37
+ def check_app_css
38
+ check 'index.css', 'index.css',
39
+ 'The «index.css» STYLES file is not found in the zip-archive',
40
+ 'The «index.css» STYLES file is not in root of the zip-archive: expected «index.css», got «%s»'
41
+ end
42
+
43
+ def check_favicon
44
+ check 'icon.ico', /icon\.ico/,
45
+ 'favicon file is not found in the zip-archive',
46
+ 'favicon file is not in root of the zip-archive: got «%s»'
47
+ end
48
+
49
+ def check_svg_absence
50
+ checka /\.svg/, 'svg files detected, move inside css'
51
+ end
52
+
53
+ protected
54
+
55
+ def check(pattern, name, absent_error, wrong_place_error)
56
+ error = absent_error
57
+
58
+ @incoming_files.each do |file|
59
+ if file.name[pattern]
60
+ error = nil
61
+ unless file.name.index(name)&.zero?
62
+ error = wrong_place_error % file.name
63
+ end
64
+ break
65
+ end
66
+ end
67
+
68
+ error
69
+ end
70
+
71
+ # check absence
72
+ def checka(pattern, present_error)
73
+ error = nil
74
+
75
+ @incoming_files.each do |file|
76
+ if file.name[pattern]
77
+ error = present_error
78
+ break
79
+ end
80
+ end
81
+
82
+ error
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrelandsRails
4
+ class CreateSimpleSource
5
+ class ValidateZipContent
6
+ #
7
+ # Проверит наличие файлов в zip-архиве и их требуемую вложенность.
8
+ #
9
+ class ValidateIncomingFiles
10
+ include ::PrelandsRails::AbstractInteractor
11
+ include ::Interactor
12
+ include ::Interactor::Contracts
13
+ include ::PrelandsRails::Base
14
+
15
+ expects do
16
+ required(:incoming_files).value(type?: Array) # список всех файлов архива { ftype, name }
17
+ end
18
+
19
+ assures do
20
+ end
21
+
22
+ def act
23
+ zip_archive = ZipArchive.new context.incoming_files
24
+ unless zip_archive.valid?
25
+ fail! errors: zip_archive.errors.join('; ')
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -16,13 +16,17 @@ module PrelandsRails
16
16
  end
17
17
 
18
18
  assures do
19
+ optional(:warnings).maybe(type?: Array)
20
+ end
19
21
 
22
+ before do
23
+ context.warnings ||= []
20
24
  end
21
25
 
22
26
  def act
23
27
  content = context[:files_content]['index.js']
24
28
  content = Js.new(content)
25
- fail! errors: {'index.js' => content.errors} unless content.valid?
29
+ context.warnings += content.errors unless content.valid?
26
30
  end
27
31
 
28
32
  on_breach { |breaches| bad_expects breaches }
@@ -15,10 +15,10 @@ module PrelandsRails
15
15
  end
16
16
 
17
17
  assures do
18
-
18
+ optional(:warnings).maybe(type?: Array)
19
19
  end
20
20
 
21
- organize ValidateHtml, ValidateJs#, ValidateCss
21
+ organize ValidateIncomingFiles, ValidateHtml, ValidateJs, ValidateCss
22
22
 
23
23
  on_breach { |breaches| bad_expects breaches }
24
24
  end
@@ -34,6 +34,7 @@ module PrelandsRails
34
34
  required(:files_content).value(type?: Hash) # распакованные файлы из архива { file_name[String] => file_content[String], ... }
35
35
  required(:compiled_htmls).value(type?: Hash) # скомпилированные исходники { file_name[String] => compiled_content[String], ... }
36
36
  required(:preland_simple_source).filled
37
+ optional(:warnings).maybe(type?: Array)
37
38
  end
38
39
 
39
40
  organize DetectIncomingLocales,
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrelandsRails
4
+ class RecompileSimpleSource
5
+ #
6
+ # Скачает и разместит в cache-директории zip-архив с исходником лендинга.
7
+ #
8
+ class DownloadZip
9
+ include ::PrelandsRails::AbstractInteractor
10
+ include ::Interactor
11
+ include ::Interactor::Contracts
12
+ include ::PrelandsRails::Base
13
+
14
+ expects do
15
+ required(:prelanding).filled #.value(type?: ::Preland)
16
+ end
17
+
18
+ assures do
19
+ required(:archive).filled # Rack::Test::UploadedFile | ActionDispatch::Http::UploadedFile
20
+ required(:tmp_dest).value(type?: String) # путь к временному файлу
21
+ end
22
+
23
+ def act
24
+ archive_url = prelanding.preland_simple_source.archive.url
25
+ destination = make_tmp_path
26
+
27
+ IO.copy_stream(Kernel.open(archive_url), destination)
28
+
29
+ context.archive = ActionDispatch::Http::UploadedFile.new(tempfile: destination)
30
+ context.tmp_dest = destination
31
+ end
32
+
33
+ on_breach { |breaches| bad_expects breaches }
34
+
35
+ delegate :prelanding,
36
+ :to => :context
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrelandsRails
4
+ class RecompileSimpleSource
5
+ #
6
+ # Сначала удалить файлы преленда из директории +aws_prefix+, затем загрузить.
7
+ #
8
+ class Upload
9
+ include ::PrelandsRails::AbstractInteractor
10
+ include ::Interactor
11
+ include ::Interactor::Contracts
12
+ include ::PrelandsRails::UpdateSimpleSource::Upload::DeleteCompiledFiles
13
+
14
+ expects do
15
+ required(:archive).filled # Входящий архив с исходниками от фрилансера. Rack::Test::UploadedFile | ActionDispatch::Http::UploadedFile
16
+ required(:compiled_htmls).value(type?: Hash) # скомпилированные исходники { file_name[String] => compiled_content[String], ... }
17
+ required(:s3_credentials).schema do
18
+ required(:access_key).filled(:str?)
19
+ required(:secret_key).filled(:str?)
20
+ required(:region).filled(:str?)
21
+ end
22
+ required(:bucket_names).value(type?: Array)
23
+ required(:aws_prefix).value(type?: String)
24
+ required(:files_content).value(type?: Hash) # { file_name => file_content, ... }
25
+ end
26
+
27
+ assures do
28
+ end
29
+
30
+ def act
31
+ delete_compiled_files
32
+ result = ::PrelandsRails::CreateSimpleSource::Upload.call context
33
+ fail! errors: result.errors unless result.success?
34
+ end
35
+
36
+ on_breach { |breaches| bad_expects breaches }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PrelandsRails
4
+ #
5
+ # Перекомпилировать преленд на основе уже загруженного в aws архива.
6
+ #
7
+ class RecompileSimpleSource
8
+ include ::PrelandsRails::AbstractInteractor
9
+ include ::Interactor::Organizer
10
+ include ::Interactor::Contracts
11
+
12
+ expects do
13
+ required(:prelanding).filled#.value(type?: ::Preland)
14
+ required(:static_js_path).value(type?: String)
15
+ required(:s3_credentials).schema do
16
+ required(:access_key).filled(:str?)
17
+ required(:secret_key).filled(:str?)
18
+ required(:region).filled(:str?)
19
+ end
20
+ required(:bucket_names).value(type?: Array)
21
+ end
22
+
23
+ before do
24
+ context.expected_locales = context.prelanding.locales.map(&:short_name)
25
+ context.aws_prefix = context.prelanding.preland_simple_source.aws_prefix
26
+ end
27
+
28
+ assures do
29
+ required(:expected_locales).filled(type?: Array)
30
+ required(:aws_prefix).value(type?: String)
31
+ required(:archive).filled
32
+ required(:tmp_dest).value(type?: String)
33
+ required(:incoming_locales).filled(type?: Array)
34
+ required(:files_content).value(type?: Hash)
35
+ required(:compiled_htmls).value(type?: Hash)
36
+ end
37
+
38
+ after do
39
+ clear_tmp_dest
40
+ context.prelanding.preland_simple_source.update_columns updated_at: Time.now
41
+ end
42
+
43
+ organize DownloadZip,
44
+ ::PrelandsRails::CreateSimpleSource::DetectIncomingLocales,
45
+ ::PrelandsRails::CreateSimpleSource::CheckZipFiles,
46
+ ::PrelandsRails::CreateSimpleSource::Compile,
47
+ Upload
48
+
49
+ on_breach { |breaches| bad_expects breaches }
50
+
51
+ private
52
+
53
+ def clear_tmp_dest
54
+ td = context.tmp_dest
55
+ File.delete(td) if File.exist?(td)
56
+ end
57
+ end
58
+ end
@@ -13,17 +13,15 @@ module PrelandsRails
13
13
  end
14
14
 
15
15
  assures do
16
-
17
- end
18
-
19
- before do
20
-
16
+ optional(:warnings).maybe(type?: Array)
21
17
  end
22
18
 
23
19
  def act
24
20
  if context.files_content
25
21
  result = ::PrelandsRails::CreateSimpleSource::ValidateZipContent.call context
26
- unless result.success?
22
+ if result.success?
23
+ context.warnings = result.warnings
24
+ else
27
25
  fail!(errors: result.errors)
28
26
  end
29
27
  end
@@ -34,6 +34,7 @@ module PrelandsRails
34
34
  optional(:files_content).maybe(type?: Hash) # распакованные файлы из архива { file_name[String] => file_content[String], ... }
35
35
  optional(:compiled_htmls).value(type?: Hash) # скомпилированные исходники { file_name[String] => compiled_content[String], ... }
36
36
  required(:preland_simple_source).filled
37
+ optional(:warnings).maybe(type?: Array)
37
38
  end
38
39
 
39
40
  organize ::PrelandsRails::CreateSimpleSource::DetectIncomingLocales,
@@ -15,6 +15,7 @@ module PrelandsRails
15
15
  end
16
16
 
17
17
  assures do
18
+ optional(:warnings).maybe(type?: Array)
18
19
  end
19
20
 
20
21
  organize ::PrelandsRails::CreateSimpleSource::DetectIncomingLocales,
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'prelands_rails/version'
4
-
5
3
  require 'zip'
6
4
  require 'interactor'
7
5
  require 'interactor/contracts'
@@ -18,7 +16,11 @@ require 'prelands_rails/create_simple_source/check_zip_files'
18
16
  require 'prelands_rails/create_simple_source/validate_zip_content/validate_html/html'
19
17
  require 'prelands_rails/create_simple_source/validate_zip_content/validate_html'
20
18
  require 'prelands_rails/create_simple_source/validate_zip_content/validate_js/js'
19
+ require 'prelands_rails/create_simple_source/validate_zip_content/validate_css/css'
20
+ require 'prelands_rails/create_simple_source/validate_zip_content/validate_incoming_files/zip_archive'
21
21
  require 'prelands_rails/create_simple_source/validate_zip_content/validate_js'
22
+ require 'prelands_rails/create_simple_source/validate_zip_content/validate_css'
23
+ require 'prelands_rails/create_simple_source/validate_zip_content/validate_incoming_files'
22
24
  require 'prelands_rails/create_simple_source/validate_zip_content'
23
25
  require 'prelands_rails/create_simple_source/compile/html_compiler'
24
26
  require 'prelands_rails/create_simple_source/compile'
@@ -37,5 +39,9 @@ require 'prelands_rails/update_simple_source'
37
39
 
38
40
  require 'prelands_rails/validate_simple_source'
39
41
 
42
+ require 'prelands_rails/recompile_simple_source/upload'
43
+ require 'prelands_rails/recompile_simple_source/download_zip'
44
+ require 'prelands_rails/recompile_simple_source'
45
+
40
46
  module PrelandsRails
41
47
  end
@@ -1,10 +1,11 @@
1
- lib = File.expand_path("lib", __dir__)
2
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require_relative 'lib/prelands_rails/version'
1
+ if File.exist?('lib/prelands_rails/version')
2
+ lib = File.expand_path("lib", __dir__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ end
4
5
 
5
6
  Gem::Specification.new do |spec|
6
7
  spec.name = "prelands_rails"
7
- spec.version = PrelandsRails::VERSION
8
+ spec.version = "0.1.4"
8
9
  spec.authors = ["C80609A"]
9
10
  spec.email = ["c080609a@gmail.com"]
10
11
 
@@ -34,15 +35,17 @@ Gem::Specification.new do |spec|
34
35
  spec.add_dependency 'aws-sdk'
35
36
 
36
37
  spec.add_development_dependency 'bundler', '~> 2.0'
38
+ spec.add_development_dependency 'mimemagic'
39
+ spec.add_development_dependency 'sqlite3'
40
+ spec.add_development_dependency 'rake', '~> 12.0'
37
41
  spec.add_development_dependency 'rails', '6.0.2.1'
38
42
  spec.add_development_dependency 'byebug'
39
43
  spec.add_development_dependency 'awesome_print'
40
44
  spec.add_development_dependency 'factory_bot_rails'
41
45
  spec.add_development_dependency 'database_cleaner'
42
- spec.add_development_dependency 'rake', '~> 12.0'
46
+ spec.add_development_dependency 'rspec'
43
47
  spec.add_development_dependency 'rspec-rails', '~> 4.0'
44
48
  spec.add_development_dependency 'rails-controller-testing'
45
49
  spec.add_development_dependency 'paperclip', '5.0.0'
46
- spec.add_development_dependency 'mimemagic'
47
- spec.add_development_dependency 'sqlite3'
50
+ spec.add_development_dependency 'tzinfo-data'
48
51
  end