sewing_kit 0.4.6

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 431a33c19363e493c74124b1f416b5d471b36e0a
4
+ data.tar.gz: 61cf9620bea767548234570e668e06e5959bddcc
5
+ SHA512:
6
+ metadata.gz: 0ef8fb8b4705914731c8bf9bd1a5f923ccac21f77b51f334dbde35d53ec79f19c7b7070fb788144e17222869d044775816bbc1ca0a99748072d495ec7c2d4613
7
+ data.tar.gz: ca77a8b18313019c03ed0524688663c13016d3994573288d20a837410fbd35baf1ebdc14c1cf56285cd486418c1c69e90394169b3ac6268310ebdbf301954a1e
data/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # sewing_kit
2
+
3
+ A solid foundation for modern FED stacks in Shopify apps.
4
+
5
+ ## Other repos
6
+
7
+ https://github.com/rails/webpacker
8
+ https://github.com/shakacode/react_on_rails
9
+ https://github.com/mipearson/webpack-rails
@@ -0,0 +1,8 @@
1
+ import * as styles from './App.scss';
2
+
3
+ export default function App() {
4
+ const node = document.createElement('div');
5
+ node.textContent = 'Hello world!';
6
+ node.className = styles.App;
7
+ return node;
8
+ }
@@ -0,0 +1,4 @@
1
+ .App {
2
+ font-size: 4rem;
3
+ font-weight: bold;
4
+ }
@@ -0,0 +1,3 @@
1
+ import App from './App';
2
+
3
+ export default App;
@@ -0,0 +1,5 @@
1
+ import App from './components/App';
2
+
3
+ document.body.appendChild(
4
+ App()
5
+ );
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import {Content, Header} from '@shopify/quilt';
3
+
4
+ export default function App() {
5
+ return (
6
+ <Content header={<Header>TODO</Header>}>
7
+ <div className={styles.App}>Hello world!</div>
8
+ </Content>
9
+ );
10
+ }
@@ -0,0 +1,4 @@
1
+ .App {
2
+ font-size: 4rem;
3
+ font-weight: bold;
4
+ }
@@ -0,0 +1,3 @@
1
+ import App from './App';
2
+
3
+ export default App;
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ import {render} from 'react-dom';
3
+ import App from './components/App';
4
+
5
+ const node = document.getElementById('app');
6
+ render(<App />, node);
@@ -0,0 +1,12 @@
1
+ <%= shebang %>
2
+
3
+ NODE_ENV = ENV["NODE_ENV"] || ENV["RAILS_ENV"] || "development"
4
+ APP_PATH = File.expand_path('../', __dir__)
5
+ VENDOR_PATH = File.expand_path('../vendor', __dir__)
6
+
7
+ WEBPACK_BIN = "./node_modules/.bin/webpack"
8
+ WEBPACK_CONFIG = "#{APP_PATH}/config/sewing-kit.config.js"
9
+
10
+ Dir.chdir(APP_PATH) do
11
+ exec "NODE_ENV=#{NODE_ENV} #{WEBPACK_BIN} --config #{WEBPACK_CONFIG} #{ARGV.join(" ")}"
12
+ end
File without changes
@@ -0,0 +1,73 @@
1
+ module Patchwork
2
+ class InstallGenerator < ::Rails::Generators::Base
3
+ attr_accessor :wants_react
4
+ attr_accessor :wants_typescript
5
+
6
+ source_root File.expand_path("./templates", __FILE__)
7
+
8
+ desc "Install everything you need for a basic Patchwork integration"
9
+
10
+ def add_webpack_rails_to_gemfile
11
+ gem 'webpack-rails'
12
+ end
13
+
14
+ # def ask_about_react
15
+ # wants_react = yes?("Would you like to use React for this project?")
16
+ # wants_typescript = yes?("Would you like to use TypeScript for this project?")
17
+ # end
18
+
19
+ def augment_package_json
20
+ # TODO: linting, tests, build
21
+ end
22
+
23
+ # def copy_webpack_config
24
+ # copy_file "sewing-kit.config.js", "config/sewing-kit.config.js"
25
+ # end
26
+
27
+ # def copy_typescript_config
28
+ # return unless wants_typescript
29
+ # copy_file "tsconfig.json", "tsconfig.json"
30
+ # end
31
+
32
+ def create_entry_point
33
+ empty_directory "app/ui"
34
+
35
+ elsif wants_react
36
+ directory "app/quilt", "app/ui"
37
+ else
38
+ directory "app/basic", "app/ui"
39
+ end
40
+ end
41
+
42
+ # def add_to_gitignore
43
+ # append_to_file ".gitignore" do
44
+ # <<-EOF.strip_heredoc
45
+ # # Added by patchwork
46
+ # /node_modules
47
+ # /public/webpack
48
+ # EOF
49
+ # end
50
+ # end
51
+
52
+ # def install_javascript_dependencies
53
+ # dependencies = ["webpack", "@shopify/patchwork"]
54
+ # dependencies.concat(["react", "react-dom", "@shopify/quilt"]) if wants_react
55
+
56
+ # run "yarn add --dev #{dependencies.join(" ")}"
57
+ # end
58
+
59
+ # def run_bundle_install
60
+ # run "bundle install" if yes?("Would you like us to run 'bundle install' for you?")
61
+ # end
62
+
63
+ # def whats_next
64
+ # puts <<-EOF.strip_heredoc
65
+ # We've set up the basics of a modern FED stack for you, but you'll still
66
+ # need to:
67
+ # 1. Add the 'main' entry point in to your layout, and
68
+ # 2. Run 'foreman start' to run the webpack-dev-server and rails server
69
+ # Thanks for using Patchwork!
70
+ # EOF
71
+ # end
72
+ # end
73
+ end
File without changes
@@ -0,0 +1,5 @@
1
+ module.exports = function() {
2
+ assetDevServerHost: 'localhost',
3
+ assetDevServerPort: 9876,
4
+ assetDevServerPath: 'assets/',
5
+ }
@@ -0,0 +1,101 @@
1
+ TEMPLATE_PATH = File.dirname(__FILE__)
2
+
3
+ # Questions
4
+
5
+ wants_react = true#yes?("Would you like to use React for this project?")
6
+ wants_typescript = true#yes?("Would you like to use TypeScript for this project?")
7
+
8
+ # Entry point
9
+
10
+ if wants_react
11
+ directory "#{TEMPLATE_PATH}/app/quilt", "app/ui"
12
+ else
13
+ directory "#{TEMPLATE_PATH}/app/basic", "app/ui"
14
+ end
15
+
16
+ # Binaries
17
+
18
+ directory "#{TEMPLATE_PATH}/bin", "bin"
19
+ chmod "bin", 0755 & ~File.umask, verbose: false
20
+
21
+ # Other
22
+
23
+ append_to_file ".gitignore", <<-EOS.strip_heredoc
24
+
25
+ # Added by sewing_kit
26
+ /node_modules
27
+ /public/patckwork
28
+ EOS
29
+
30
+ # Configuration
31
+
32
+ ## package.json
33
+
34
+ package_json_path = File.expand_path "./package.json", destination_root
35
+ package_json = File.exists?(package_json_path) ? JSON.parse(File.read(package_json_path)) : Hash.new
36
+ scripts = package_json.fetch("scripts", Hash.new)
37
+
38
+ unless scripts.key?("lint")
39
+ scripts["lint"] = wants_typescript ? "tslint ./app" : "eslint ./app --max-warnings 0"
40
+ end
41
+
42
+ unless scripts.key?("test")
43
+ scripts["test"] = ""
44
+ end
45
+
46
+ unless scripts.key?("check")
47
+ scripts["check"] = "yarn run lint && yarn run test"
48
+ end
49
+
50
+ unless wants_typescript
51
+ scripts["eslintConfig"] = {
52
+ "extends": [
53
+ wants_react ? "plugin:shopify/react" : "plugin:shopify/esnext"
54
+ ]
55
+ }
56
+ end
57
+
58
+ package_json["scripts"] = scripts
59
+ create_file package_json_path, JSON.pretty_generate(package_json, indent: " ")
60
+
61
+ ## other
62
+
63
+ copy_file "#{TEMPLATE_PATH}/sewing-kit.config.js", "config/sewing-kit.config.js"
64
+
65
+ if wants_typescript
66
+ copy_file "#{TEMPLATE_PATH}/tsconfig.json", "tsconfig.json"
67
+ copy_file "#{TEMPLATE_PATH}/tslint.json", "tslint.json"
68
+ empty_directory "config/typescript/modules"
69
+ else
70
+ copy_file "#{TEMPLATE_PATH}/.eslintignore", ".eslintignore"
71
+ end
72
+
73
+ # Dependencies
74
+
75
+ dev_dependencies = %w(webpack@2.2.0 file:../../sewing-kit)
76
+
77
+ if wants_typescript
78
+ # dev_dependencies.concat(["typescript", "tslint", "tslint-config-shopify"])
79
+ dev_dependencies.concat %w(typescript tslint)
80
+ else
81
+ dev_dependencies.concat %w(eslint eslint-plugin-shopify)
82
+ end
83
+
84
+ run "yarn add --dev #{dev_dependencies.join(" ")}"
85
+
86
+ dependencies = []
87
+ dependencies.concat %w(react react-dom file:../../quilt) if wants_react
88
+
89
+ run "yarn add #{dependencies.join(" ")}"
90
+
91
+ # Finishing up
92
+
93
+ puts <<-EOS.strip_heredoc
94
+ We've set up the basics of a modern FED stack for you, but you'll still
95
+ need to:
96
+
97
+ 1. Add the 'main' entry point in to your layout, and
98
+ 2. Run 'foreman start' to run the webpack-dev-server and rails server
99
+
100
+ Thanks for using Sewing Kit!
101
+ EOS
@@ -0,0 +1,35 @@
1
+ {
2
+ "compilerOptions": {
3
+ "baseUrl": ".",
4
+ "rootDir": ".",
5
+ "target": "es6",
6
+ "module": "es2015",
7
+ "moduleResolution": "node",
8
+ "jsx": "react",
9
+ "strictNullChecks": true,
10
+ "noImplicitAny": true,
11
+ "experimentalDecorators": true,
12
+ "typeRoots": [
13
+ "./node_modules/@types"
14
+ ],
15
+ "paths": {
16
+ "*": [
17
+ "*",
18
+ "app/ui/*"
19
+ ]
20
+ },
21
+ "lib": [
22
+ "dom",
23
+ "es2015",
24
+ "es2016",
25
+ "es2017",
26
+ "dom.iterable",
27
+ "scripthost"
28
+ ]
29
+ },
30
+ "include": [
31
+ "node_modules/@shopify/patchwork/typescript",
32
+ "config/typescript/**/*",
33
+ "app/**/*"
34
+ ]
35
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": ["tslint-config-shopify"]
3
+ }
data/lib/sewing_kit.rb ADDED
@@ -0,0 +1,5 @@
1
+ module SewingKit
2
+ end
3
+
4
+ require "sewing_kit/version"
5
+ require "sewing_kit/rails"
@@ -0,0 +1 @@
1
+ require "sewing_kit/railtie" if defined? Rails
@@ -0,0 +1,32 @@
1
+ require 'rails'
2
+ require 'rails/railtie'
3
+ require 'sewing_kit/webpack/compiler'
4
+ require 'sewing_kit/webpack/helper'
5
+ require 'sewing_kit/webpack/dev'
6
+
7
+ module SewingKit
8
+ class Railtie < ::Rails::Railtie
9
+ initializer "sewing_kit.initialize_webpack" do
10
+ if Rails.env.development? && Rails.const_defined?(:Server)
11
+ webpack_dev = SewingKit::Webpack::Dev.new
12
+ webpack_dev.start
13
+ end
14
+ end
15
+
16
+ config.after_initialize do
17
+ ActiveSupport.on_load(:action_view) do
18
+ include SewingKit::Webpack::Helper
19
+ end
20
+ end
21
+
22
+ config.sewing_kit = ActiveSupport::OrderedOptions.new
23
+ config.sewing_kit.webpack = ActiveSupport::OrderedOptions.new
24
+ config.sewing_kit.webpack.manifest_dir = 'tmp/sewing-kit'
25
+ config.sewing_kit.webpack.manifest_filename = 'sewing-kit-manifest.json'
26
+ config.sewing_kit.webpack.verbose = false
27
+
28
+ rake_tasks do
29
+ load "tasks/sewing_kit.rake"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ module SewingKit
2
+ VERSION = "0.4.6"
3
+ end
@@ -0,0 +1,41 @@
1
+ module SewingKit
2
+ module Webpack
3
+ class Compiler
4
+ def compile
5
+ result = Kernel.system(
6
+ { 'NODE_ENV' => node_env },
7
+ *command,
8
+ chdir: Rails.root.to_s,
9
+ out: $stdout,
10
+ err: $stderr,
11
+ )
12
+
13
+ if !result
14
+ puts "sewing-kit compile failed with error code #{$?}"
15
+ exit(1)
16
+ end
17
+ result
18
+ end
19
+
20
+ private
21
+
22
+ def command
23
+ [
24
+ 'node_modules/.bin/sewing-kit',
25
+ 'compile',
26
+ '--config-file',
27
+ 'config/sewing-kit.config.js',
28
+ '--target',
29
+ 'client',
30
+ '--env',
31
+ node_env,
32
+ ].reject(&:empty?)
33
+ end
34
+
35
+ private
36
+ def node_env
37
+ ENV['NODE_ENV'] || Rails.env.to_s
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,72 @@
1
+ module SewingKit
2
+ module Webpack
3
+ class Dev
4
+ attr_accessor :pid
5
+
6
+ def start
7
+ @pid = spawn
8
+ detach
9
+ end
10
+
11
+ private
12
+
13
+ def command
14
+ cmd = [
15
+ 'node_modules/.bin/sewing-kit',
16
+ 'dev',
17
+ '--config-file',
18
+ 'config/sewing-kit.config.js',
19
+ '--target',
20
+ 'client',
21
+ '--env',
22
+ node_env
23
+ ]
24
+
25
+ if hmr?
26
+ cmd += ['--hot', '--hot-host', hot_host]
27
+ else
28
+ cmd += ['--lazy', '--super-speed']
29
+ end
30
+
31
+ cmd += ['--verbose'] if ::Rails.configuration.sewing_kit.webpack.verbose
32
+
33
+ cmd
34
+ end
35
+
36
+ def spawn
37
+ Kernel.spawn(
38
+ { 'NODE_ENV' => node_env },
39
+ *command,
40
+ chdir: Rails.root.to_s,
41
+ out: $stdout,
42
+ err: $stderr,
43
+ ) || exit(1)
44
+ end
45
+
46
+ def detach
47
+ Process.detach pid
48
+ end
49
+
50
+ def hmr?
51
+ @hmr ||= ENV['SK_DISABLE_HMR'] != 'true'
52
+ end
53
+
54
+ def hot_host
55
+ if host = ::Rails.configuration.sewing_kit.webpack.asset_host
56
+ if host.is_a?(Proc) || host.respond_to?(:call)
57
+ host.call(nil, nil)
58
+ else
59
+ host
60
+ end
61
+ else
62
+ "/"
63
+ end
64
+ end
65
+
66
+ private
67
+ def node_env
68
+ ENV['NODE_ENV'] || Rails.env.to_s
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,76 @@
1
+ require 'base64'
2
+ require 'action_view/helpers'
3
+ require 'sewing_kit/webpack/manifest'
4
+
5
+ module SewingKit
6
+ module Webpack
7
+ module Helper
8
+ include ActionView::Helpers
9
+
10
+ def webpack_asset_paths(source, extension: 'js')
11
+ return '' unless source.present?
12
+
13
+ paths = SewingKit::Webpack::Manifest.asset_paths(source)
14
+
15
+ return '' unless paths[extension]
16
+
17
+ [paths[extension]].flatten.reject { |path| path =~ /.*\.map$/ }
18
+ end
19
+
20
+ def sewing_kit_link_tag(*paths)
21
+ return '' if Rails.env.development?
22
+
23
+ options = paths.extract_options!
24
+
25
+ tags = paths.uniq.map { |path|
26
+ create_asset_tag(:link, path, options)
27
+ }
28
+
29
+ safe_join(tags, "\n")
30
+ end
31
+
32
+ def sewing_kit_script_tag(*paths)
33
+ options = paths.extract_options!
34
+
35
+ tags = paths.uniq.map { |path|
36
+ create_asset_tag(:script, path, options)
37
+ }
38
+
39
+ safe_join(tags, "\n")
40
+ end
41
+
42
+ private
43
+
44
+ def create_asset_tag(tag_type, path, tag_options)
45
+ raise ArgumentError, "Invalid tag type: #{tag_type}" unless [:script, :link].include? tag_type
46
+
47
+ options = tag_options.clone
48
+
49
+ if tag_options[:integrity]
50
+ file_hash = extract_hash(path)
51
+ options[:integrity] = file_hash ? encode_hash(file_hash) : nil
52
+ end
53
+
54
+ case tag_type
55
+ when :script
56
+ content_tag(:script, '', options.reverse_merge(src: path))
57
+ when :link
58
+ tag(:link, options.reverse_merge(href: path, rel: 'stylesheet'))
59
+ end
60
+ end
61
+
62
+ def encode_hash(hash)
63
+ # sewing-kit's default config places a sha256 hash in the filename. Browsers expect integrity
64
+ # to be the Base64 encoded version of the binary hash prefixed with the hashing algorithm
65
+ binary_hash = Array(hash).pack('H*')
66
+ "sha256-#{Base64.strict_encode64(binary_hash)}"
67
+ end
68
+
69
+ def extract_hash(path)
70
+ # Consumes sewing-kit's [name]-[chunkhash].[ext] format
71
+ return unless path =~ /.*-[A-Za-z0-9]{64}\.(js|css)/
72
+ path.rpartition('-').last.split('.').first
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,65 @@
1
+ require 'uri'
2
+
3
+ module SewingKit
4
+ module Webpack
5
+ # Webpack manifest loading, caching & entry point retrieval
6
+ class Manifest
7
+ # Raised if we can't read our webpack manifest for whatever reason
8
+ class ManifestLoadError < StandardError
9
+ def initialize(message, orig)
10
+ super "#{message} (original error #{orig})"
11
+ end
12
+ end
13
+
14
+ # Raised if a supplied entry point does not exist in the webpack manifest
15
+ class EntryPointMissingError < StandardError
16
+ end
17
+
18
+ class << self
19
+ # :nodoc:
20
+ def asset_paths(source)
21
+ paths = manifest[source]
22
+ if paths
23
+ paths
24
+ else
25
+ raise EntryPointMissingError, "Can't find entry point '#{source}' in webpack manifest"
26
+ end
27
+ end
28
+
29
+ def manifest
30
+ if ::Rails.env.production?
31
+ # Cache at class level, as JSON loading/parsing can be expensive.
32
+ @manifest ||= load_manifest
33
+ else
34
+ # Cache if we're outside of production; manifest may change.
35
+ load_manifest
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def manifest_bundled?
42
+ !manifest["errors"].any? { |error| error.include? "Module build failed" }
43
+ end
44
+
45
+ def load_manifest
46
+ data = load_static_manifest
47
+ JSON.parse(data)
48
+ end
49
+
50
+ def load_static_manifest
51
+ File.read(static_manifest_path)
52
+ rescue => e
53
+ raise ManifestLoadError.new("Could not load compiled manifest from #{static_manifest_path} - have you run `rake sewing_kit:compile`?", e)
54
+ end
55
+
56
+ def static_manifest_path
57
+ ::Rails.root.join(
58
+ ::Rails.configuration.sewing_kit.webpack.manifest_dir,
59
+ ::Rails.configuration.sewing_kit.webpack.manifest_filename
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,20 @@
1
+ TEMPLATE_PATH = File.expand_path("../install/template.rb", File.dirname(__FILE__))
2
+
3
+ namespace :sewing_kit do
4
+ desc "Install all of Shopify’s modern FED tooling"
5
+ task :install do
6
+ exec "./bin/rails app:template LOCATION=#{TEMPLATE_PATH}"
7
+ end
8
+
9
+ desc "Build webpack asset bundles"
10
+ task :compile => :environment do
11
+ compiler = SewingKit::Webpack::Compiler.new
12
+ compiler.compile
13
+ end
14
+ end
15
+
16
+ if Rake::Task.task_defined?('assets:precompile')
17
+ Rake::Task['assets:precompile'].enhance do
18
+ Rake::Task['sewing_kit:compile'].invoke
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sewing_kit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.6
5
+ platform: ruby
6
+ authors:
7
+ - Chris Sauve
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-07-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 3.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rails
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 3.2.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.2.0
41
+ description:
42
+ email:
43
+ - chris.sauve@shopify.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - README.md
49
+ - lib/install/app/basic/components/App/App.js
50
+ - lib/install/app/basic/components/App/App.scss
51
+ - lib/install/app/basic/components/App/index.js
52
+ - lib/install/app/basic/index.js
53
+ - lib/install/app/quilt/components/App/App.js
54
+ - lib/install/app/quilt/components/App/App.scss
55
+ - lib/install/app/quilt/components/App/index.js
56
+ - lib/install/app/quilt/index.js
57
+ - lib/install/bin/webpack.tt
58
+ - lib/install/patchwork/component_generator.rb
59
+ - lib/install/patchwork/install_generator.rb
60
+ - lib/install/patchwork/section_generator.rb
61
+ - lib/install/sewing-kit.config.js
62
+ - lib/install/template.rb
63
+ - lib/install/tsconfig.json
64
+ - lib/install/tslint.json
65
+ - lib/sewing_kit.rb
66
+ - lib/sewing_kit/rails.rb
67
+ - lib/sewing_kit/railtie.rb
68
+ - lib/sewing_kit/version.rb
69
+ - lib/sewing_kit/webpack/compiler.rb
70
+ - lib/sewing_kit/webpack/dev.rb
71
+ - lib/sewing_kit/webpack/helper.rb
72
+ - lib/sewing_kit/webpack/manifest.rb
73
+ - lib/tasks/sewing_kit.rake
74
+ homepage:
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 2.0.0
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.5.2
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: Shopify’s modern front-end tooling, nicely packaged for Rails
98
+ test_files: []