actioncomponent 0.1.1

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
+ SHA256:
3
+ metadata.gz: 76be070b5053ecc8da9c380f2e13946d9955b2dd3eeaa76f08d3dfe48031ea80
4
+ data.tar.gz: 48545e6160b1667d4af0fa0686bb60bb11130ee67d67a46686d1988ef25c7242
5
+ SHA512:
6
+ metadata.gz: d04b7b700b5cb1a6fae38baa9a7bcaa5e4a7f1b65690de597ab599c8b3e514122f83830f0bc41bd985c7fea459e59f010e6b2a571bdcf4e935d155c03fb7ca29
7
+ data.tar.gz: 4b7a9dbc8c5f30951c1c1d2bd110cb277d291f591dc46dad8704f35c36b7f09f8d067e10b7fcd9ace15b441d45a42958ed4b3683c81d4781f2384fd8f4b12680
data/.codeclimate ADDED
@@ -0,0 +1,23 @@
1
+ engines:
2
+ rubocop:
3
+ enabled: true
4
+ #checks:
5
+ # Rubocop/Metrics/ClassLength:
6
+ # enabled: false
7
+ brakeman:
8
+ enabled: false
9
+ eslint:
10
+ enabled: false
11
+ csslint:
12
+ enabled: false
13
+ duplication:
14
+ enabled: true
15
+ config:
16
+ languages:
17
+ - ruby:
18
+ - javascript:
19
+ ratings:
20
+ paths:
21
+ - lib/**
22
+ exclude_paths:
23
+ - spec/**/*
data/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /spec/support/rails_app/log/*
10
+ /tmp/
11
+ .DS_Store
12
+ .byebug_history
13
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,21 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ Documentation:
4
+ Enabled: false
5
+
6
+ Style/ClassAndModuleChildren:
7
+ Enabled: false
8
+
9
+ Style/FrozenStringLiteralComment:
10
+ Enabled: false
11
+
12
+ Metrics/LineLength:
13
+ Max: 150
14
+ IgnoredPatterns: ['\A#']
15
+
16
+ AllCops:
17
+ Exclude:
18
+ - actioncomponent.gemspec
19
+ - 'exe/**/*'
20
+ - 'bin/**/*'
21
+ - 'spec/**/*'
data/.rubocop_todo.yml ADDED
File without changes
data/.travis.yml ADDED
@@ -0,0 +1,26 @@
1
+ env:
2
+ global:
3
+ - CC_TEST_REPORTER_ID=3155042648b3cc74c8af8a1713df60818092046d8b395fdf29b4b1c00db7c792
4
+ - GIT_COMMITTED_AT=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then git log -1 --pretty=format:%ct; else git log -1 --skip 1 --pretty=format:%ct; fi)
5
+
6
+ language: ruby
7
+
8
+ cache:
9
+ bundler: true
10
+
11
+ rvm:
12
+ - "2.4.1"
13
+
14
+ bundler_args: "--binstubs --standalone --without documentation --path ../bundle"
15
+
16
+ before_script:
17
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
18
+ - chmod +x ./cc-test-reporter
19
+
20
+ script:
21
+ - bundle exec rubocop -c .rubocop.yml
22
+ - bundle exec rspec
23
+ - if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT; fi
24
+
25
+ notifications:
26
+ email: false
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --no-private
2
+ --markup markdown
3
+ --default-return void
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'yard', '~> 0.9.9', require: false
4
+
5
+ # Specify your gem's dependencies in rabbitmq-spec.gemspec
6
+ gemspec
data/README.md ADDED
@@ -0,0 +1,262 @@
1
+ # Welcome to actioncomponent gem
2
+
3
+ [![Travis](https://travis-ci.org/viniciusoyama/action_component.svg?branch=master)](https://travis-ci.org/viniciusoyama/action_component)
4
+ [![Code Climate](https://codeclimate.com/github/viniciusoyama/action_component/badges/gpa.svg)](https://codeclimate.com/github/viniciusoyama/action_component)
5
+ [![Test Coverage](https://codeclimate.com/github/viniciusoyama/action_component/badges/coverage.svg)](https://codeclimate.com/github/viniciusoyama/action_component)
6
+
7
+ Frontend components for Ruby on Rails: group your view logic, html, css and javascript files in components to be used in views or directly rendered from controllers.
8
+
9
+ # How to use?
10
+
11
+ **Gemfile**
12
+ ```ruby
13
+ gem 'actioncomponent'
14
+ ```
15
+
16
+ # What do you get?
17
+
18
+ ## Organize your frontend code
19
+ Your can group your frontend stuff by domain and organize the UI of your Rails app like this:
20
+
21
+ ```
22
+ app
23
+ ├── components
24
+ │ └── user
25
+ │ └── filter
26
+ │ └── template.html.erb
27
+ │ └── list
28
+ │ └── template.html.erb
29
+ ```
30
+
31
+
32
+ And, in your views, or in your components, your can render it!
33
+
34
+ **app/view/users/index.html.erb**
35
+
36
+ ```html
37
+ <%
38
+ import_action_component 'Filter', path: 'user/filter'
39
+ import_action_component 'List', path: 'user/list'
40
+ %>
41
+
42
+ <%= Filter() %>
43
+
44
+ <%= List(users: @users) %>
45
+ ```
46
+
47
+ Or, you can completely drop your view and tell your controller to render a User Index Compoment
48
+
49
+ ```
50
+ app
51
+ ├── components
52
+ │ └── user
53
+ │ └── filter
54
+ │ └── template.html.erb
55
+ │ └── list
56
+ │ └── template.html.erb
57
+ │ └── index
58
+ │ └── template.html.erb
59
+ ```
60
+
61
+
62
+ **app/components/user/index/template.html.erb**
63
+
64
+ ```html
65
+ <%
66
+ import_action_component 'Filter', path: 'user/filter'
67
+ import_action_component 'List', path: 'user/list'
68
+ %>
69
+
70
+ <%= Filter() %>
71
+
72
+ <%= List(users: @users) %>
73
+ ```
74
+
75
+ **app/controllers/users_controller.rb**
76
+
77
+ ```ruby
78
+
79
+ # ...
80
+ # TODO
81
+ # ...
82
+
83
+ ```
84
+
85
+ ## Pass data to your components
86
+
87
+ When rendering your can pass data in a hash/named parameters format. The data will be exposed in your template through a view model.
88
+
89
+ Supose that you have a header component
90
+
91
+ ```
92
+ app
93
+ ├── components
94
+ │ └── header
95
+ │ └── template.html.erb
96
+ ```
97
+
98
+ And you want to render this component in your layout file.
99
+
100
+ **app/views/layouts/application.html.erb**
101
+
102
+ ```html
103
+
104
+ <%
105
+ import_action_component 'Header', path: 'header'
106
+ %>
107
+
108
+ <%= Header(my_user: current_user) %>
109
+ ```
110
+
111
+ You can access the user attribute in your template like this:
112
+
113
+ **app/components/header/template.html.erb**
114
+
115
+ ```html
116
+ <header>
117
+ Hi, <%= my_user.name %>
118
+ </header>
119
+ ```
120
+
121
+ ## View Models
122
+
123
+ The methods available inside the template will be those defined in your view model. If no view model is defined for your component then our ActionComponent::Component::ViewModel will be used. The view model is instantiated with the arguments that you provide when calling your component.
124
+
125
+ ### ActionComponent::Component::ViewModel
126
+
127
+ It takes all the constructor arguments (it must be a hash/named args) and creates a getter for each one of them. Example:
128
+
129
+ ```ruby
130
+ vm = ActionComponent::Component::ViewModel.new(name: 'John', age: 12)
131
+ vm.name # John
132
+ vm.age # 12
133
+ ```
134
+
135
+ ### Create your own ViewModel: handle complex view logic
136
+
137
+ We only use our own view model if there is no view_model.rb file inside your component's folder. This file should declare a class following all the Rails naming conventions.
138
+
139
+ So, imagine that we want our vm to have a random_greeting method. We can can create a view model like this:
140
+
141
+
142
+ ## Use helpers inside your components
143
+
144
+ When initializing the view model we also provide two additionals parameters (:h and :helper) so you can have access to rails helpers.
145
+
146
+ As all view model methods are available to your template your will have access to a `h` or `helper` like this:
147
+
148
+ **Example of a component's templatefile**
149
+
150
+ ```
151
+ <div class="child">
152
+ <div class="date">
153
+ <%= helper.l(Date.new(2019, 01, 03)) %>
154
+ </div>
155
+
156
+ <div class="routes">
157
+ <%= h.users_path %>
158
+ </div>
159
+
160
+ <div class="translation">
161
+ <%= h.t('hello')%>
162
+ </div>
163
+ </div>
164
+ ```
165
+
166
+ Your can create custom view models that inherits from ours
167
+
168
+ **app/components/header/view_model.rb**
169
+
170
+ ```ruby
171
+ class Header::ViewModel < ActionComponent::Component::ViewModel
172
+ def random_greeting
173
+ hi_text = ['Hi', 'Yo'].sample
174
+ "#{hi_text}, #{user.name}"
175
+ end
176
+ end
177
+ ```
178
+
179
+ Now the template can access the method like this:
180
+
181
+ **app/components/header/template.html.erb**
182
+ ```html
183
+ <header>
184
+ <%= random_greeting %>
185
+ </header>
186
+ ```
187
+
188
+ ### Use helpers inside a ViewModel
189
+
190
+ A `helper` and `h` attribute are passed when instantiating a ViewModel.
191
+
192
+ ```ruby
193
+ class Header::ViewModel < ActionComponent::Component::ViewModel
194
+ def random_greeting
195
+ hi_text = ['Hi', 'Yo'].sample
196
+ "#{hi_text}, #{user.name}."
197
+ end
198
+
199
+ def formated_date
200
+ h.l(Date.today)
201
+ end
202
+ end
203
+ ```
204
+
205
+ **app/components/header/template.html.erb**
206
+ ```html
207
+ <header>
208
+ <%= random_greeting %> Today is <%= formated_date %>
209
+ </header>
210
+ ```
211
+
212
+
213
+ ## Access your controller in your VM or Template
214
+
215
+ When rendering a component, a `c` or `controller` parameter is passed through so you can have access to all your request data inside your VM or template.
216
+
217
+ **view_model**
218
+
219
+ ```ruby
220
+ class ControllerData::ViewModel < ActionComponent::Component::ViewModel
221
+
222
+ def formated_page
223
+ "Current page: #{c.params[:page]}"
224
+ end
225
+
226
+ def formated_search
227
+ "Searching for: #{controller.params[:search]}"
228
+ end
229
+
230
+ end
231
+ ```
232
+
233
+ **template.erb**
234
+
235
+ ```html
236
+ <%= formated_search %>
237
+
238
+ <%= formated_page %>
239
+ ```
240
+
241
+
242
+ # Configuration
243
+
244
+ You can change some parameters by creating a initializer on your app
245
+
246
+ **config/initializers/action_component.rb**
247
+
248
+
249
+ ```ruby
250
+
251
+ ActionComponent.configure do |config|
252
+ # Folder path to look for components
253
+ config.components_path = 'app/components'
254
+
255
+ # Default name for the html/erb/slim/etc template file inside the component folder
256
+ config.template_file_name = 'template'
257
+
258
+ # Default name for the view model file inside the component folder
259
+ config.view_model_file_name = 'view_model'
260
+ end
261
+
262
+ ```
@@ -0,0 +1,33 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'actioncomponent'
3
+ s.version = '0.1.1'
4
+ s.date = '2019-03-21'
5
+ s.summary = 'Stop using views: frontend components architecture for Ruby on Rails'
6
+ s.description = 'Stop using views: frontend components architecture for Ruby on Rails'
7
+ s.authors = ['Vinícius Oyama']
8
+ s.email = 'contact@viniciusoyama.com'
9
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
10
+ s.homepage =
11
+ 'http://rubygems.org/gems/actioncomponent'
12
+ s.license = 'MIT'
13
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
14
+
15
+ s.add_dependency 'rails', '>= 4.0.0'
16
+
17
+ # Quality Control
18
+ s.add_development_dependency 'rspec'
19
+ s.add_development_dependency 'rubocop'
20
+ s.add_development_dependency 'simplecov'
21
+
22
+ # Debugging
23
+ s.add_development_dependency 'awesome_print'
24
+ s.add_development_dependency 'pry-byebug'
25
+
26
+ # for testing a gem with a rails app (controller specs)
27
+ # https://codingdaily.wordpress.com/2011/01/14/test-a-gem-with-the-rails-3-stack/
28
+ s.add_development_dependency 'bundler'
29
+ s.add_development_dependency 'capybara'
30
+ s.add_development_dependency 'rails', '> 4.0'
31
+ s.add_development_dependency 'rspec-rails'
32
+ s.add_development_dependency 'sqlite3'
33
+ end
@@ -0,0 +1,24 @@
1
+ module ActionComponent
2
+ # Renders a given component
3
+ class Component
4
+ class Renderer < ActionView::Renderer
5
+ class ComponentTemplateFileNotFound < StandardError; end
6
+
7
+ attr_reader :view_model
8
+
9
+ def initialize(lookup_context, view_model)
10
+ @lookup_context = lookup_context
11
+ @view_model = view_model
12
+ end
13
+
14
+ def render(component_path:)
15
+ file_path = template_path_from_component_path(component_path)
16
+ super(view_model, file: file_path)
17
+ end
18
+
19
+ def template_path_from_component_path(component_path, template_file_name: ActionComponent.configuration.template_file_name)
20
+ File.join(component_path, template_file_name).to_s
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,22 @@
1
+ module ActionComponent
2
+ # Renders a given component
3
+ class Component
4
+ class ViewModel
5
+ include ActionComponent::ImporterHelper
6
+
7
+ def initialize(**args)
8
+ generate_methods_from_hash(args)
9
+ end
10
+
11
+ private
12
+
13
+ def generate_methods_from_hash(hash)
14
+ hash.each do |key, val|
15
+ define_singleton_method key.to_sym do
16
+ val
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,81 @@
1
+ module ActionComponent
2
+ # Represents a component with a template, style and javascript file
3
+ class Component
4
+ class InvalidVMError < StandardError; end
5
+ class << self
6
+ def helper_object
7
+ @helper_object = Class.new(ActionView::Base) do
8
+ include ::Rails.application.routes.url_helpers
9
+ include ::Rails.application.routes.mounted_helpers
10
+ end.new
11
+ end
12
+
13
+ def helper_vm_params
14
+ {
15
+ h: helper_object,
16
+ helper: helper_object
17
+ }
18
+ end
19
+ end
20
+
21
+ attr_reader :view_model_data, :component_path
22
+
23
+ def initialize(component_path:, lookup_context: nil, view_model_data: {})
24
+ @component_path = component_path.to_s.gsub(%r{^/}, '')
25
+ @lookup_context = lookup_context
26
+ @view_model_data = view_model_data
27
+ end
28
+
29
+ def render
30
+ renderer.render(component_path: @component_path)
31
+ end
32
+
33
+ def renderer
34
+ ActionComponent::Component::Renderer.new(lookup_context, create_view_model)
35
+ end
36
+
37
+ def lookup_context
38
+ @lookup_context ||= ActionView::LookupContext.new(
39
+ [
40
+ full_component_path
41
+ ]
42
+ )
43
+ end
44
+
45
+ def create_view_model
46
+ vm_class = ActionComponent::Component::ViewModel
47
+
48
+ begin
49
+ vm_class = find_custom_vm_class!
50
+ rescue NameError
51
+ vm_class = ActionComponent::Component::ViewModel
52
+ end
53
+
54
+ vm_class.new(**view_model_data.merge(view_model_default_data))
55
+ end
56
+
57
+ def view_model_default_data
58
+ # lookup_context is necessary for when there is an exception in our template
59
+ # this is used in order to better describe the error stack
60
+ self.class.helper_vm_params.merge(lookup_context: lookup_context)
61
+ end
62
+
63
+ def full_component_path
64
+ Rails.root.join(ActionComponent.configuration.components_path)
65
+ end
66
+
67
+ private
68
+
69
+ def find_custom_vm_class!
70
+ vm_file_path = Pathname.new(component_path).join(ActionComponent.configuration.view_model_file_name)
71
+ vm_class = ActiveSupport::Inflector.camelize(vm_file_path).constantize
72
+
73
+ unless vm_class.ancestors.include?(ActionComponent::Component::ViewModel)
74
+ error_msg = "#{vm_class} cannot be used as a ViewModel. Make sure that it inherits from ActionComponent::Component::ViewModel."
75
+ raise ActionComponent::Component::InvalidVMError, error_msg
76
+ end
77
+
78
+ vm_class
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,25 @@
1
+ module ActionComponent
2
+ # Exposes component rendering methods to Rails views
3
+
4
+ module ImporterHelper
5
+ # Description of #import_action_component
6
+ #
7
+ # @param local_component_name [String] Local's component name (in the view scope)
8
+ # @param opts [Hash] default: {} Options.
9
+ # @example
10
+ def import_action_component(local_component_name, opts = {})
11
+ raise "No path informed when importing component #{local_component_name}" if opts[:path].blank?
12
+
13
+ define_singleton_method(local_component_name) do |**args|
14
+ create_component(opts[:path], args).render
15
+ end
16
+ end
17
+
18
+ def create_component(component_path, view_model_data)
19
+ ActionComponent::Component.new(
20
+ component_path: component_path,
21
+ view_model_data: view_model_data.merge(c: controller, controller: controller)
22
+ )
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails/railtie'
2
+
3
+ class ViewComponent
4
+ class Rails < Rails::Railtie
5
+ config.view_component = ActiveSupport::OrderedOptions.new
6
+
7
+ initializer 'view_component' do
8
+ ::ActionView::Base.send(:include, ActionComponent::ImporterHelper)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ require 'actioncomponent/importer_helper'
2
+ require 'actioncomponent/component'
3
+ require 'actioncomponent/component/view_model'
4
+ require 'actioncomponent/component/renderer'
5
+ require 'actioncomponent/railtie'
6
+
7
+ module ActionComponent
8
+ # Configuration class for ActionComponent
9
+ # @attr components_path [String] Components folder path (defaults to 'app/components')
10
+ # @attr components_path [String] Component's template file name (defaults to 'template')
11
+ class Configuration
12
+ attr_accessor :components_path
13
+ attr_accessor :template_file_name
14
+ attr_accessor :view_model_file_name
15
+
16
+ def initialize
17
+ @components_path = 'app/components'
18
+ @template_file_name = 'template'
19
+ @view_model_file_name = 'view_model'
20
+ end
21
+ end
22
+
23
+ def self.configuration
24
+ @configuration ||= Configuration.new
25
+ end
26
+
27
+ def self.configure
28
+ yield(configuration)
29
+ end
30
+ end
metadata ADDED
@@ -0,0 +1,213 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: actioncomponent
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Vinícius Oyama
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: awesome_print
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: bundler
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: capybara
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">"
130
+ - !ruby/object:Gem::Version
131
+ version: '4.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">"
137
+ - !ruby/object:Gem::Version
138
+ version: '4.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec-rails
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: sqlite3
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: 'Stop using views: frontend components architecture for Ruby on Rails'
168
+ email: contact@viniciusoyama.com
169
+ executables: []
170
+ extensions: []
171
+ extra_rdoc_files: []
172
+ files:
173
+ - ".codeclimate"
174
+ - ".gitignore"
175
+ - ".rspec"
176
+ - ".rubocop.yml"
177
+ - ".rubocop_todo.yml"
178
+ - ".travis.yml"
179
+ - ".yardopts"
180
+ - Gemfile
181
+ - README.md
182
+ - actioncomponent.gemspec
183
+ - lib/actioncomponent.rb
184
+ - lib/actioncomponent/component.rb
185
+ - lib/actioncomponent/component/renderer.rb
186
+ - lib/actioncomponent/component/view_model.rb
187
+ - lib/actioncomponent/importer_helper.rb
188
+ - lib/actioncomponent/railtie.rb
189
+ homepage: http://rubygems.org/gems/actioncomponent
190
+ licenses:
191
+ - MIT
192
+ metadata: {}
193
+ post_install_message:
194
+ rdoc_options: []
195
+ require_paths:
196
+ - lib
197
+ required_ruby_version: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ required_rubygems_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ requirements: []
208
+ rubyforge_project:
209
+ rubygems_version: 2.7.8
210
+ signing_key:
211
+ specification_version: 4
212
+ summary: 'Stop using views: frontend components architecture for Ruby on Rails'
213
+ test_files: []