komponent 2.2.0 → 3.0.0.beta1

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 +5 -5
  2. data/.editorconfig +14 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +10 -7
  5. data/.travis.yml +4 -5
  6. data/Appraisals +15 -0
  7. data/CHANGELOG.md +19 -1
  8. data/Gemfile +1 -0
  9. data/README.md +75 -25
  10. data/app/controllers/komponent/styleguide_controller.rb +20 -0
  11. data/app/views/komponent/styleguide/index.html.erb +9 -0
  12. data/app/views/komponent/styleguide/missing_template.html.erb +3 -0
  13. data/app/views/komponent/styleguide/show.html.erb +1 -0
  14. data/app/views/layouts/komponent.html.erb +17 -0
  15. data/config/routes.rb +5 -0
  16. data/komponent.gemspec +6 -5
  17. data/lib/generators/component/component_generator.rb +19 -3
  18. data/lib/generators/component/templates/examples.html.erb.erb +3 -0
  19. data/lib/generators/component/templates/examples.html.haml.erb +3 -0
  20. data/lib/generators/component/templates/examples.html.slim.erb +3 -0
  21. data/lib/generators/component/templates/stimulus_view.html.haml.erb +1 -1
  22. data/lib/generators/component/templates/view.html.haml.erb +1 -1
  23. data/lib/generators/komponent/examples_generator.rb +40 -0
  24. data/lib/generators/komponent/install_generator.rb +37 -41
  25. data/lib/generators/komponent/styleguide_generator.rb +41 -0
  26. data/lib/generators/komponent/templates/styleguide/components/container/_komponent_container.html.erb +3 -0
  27. data/lib/generators/komponent/templates/styleguide/components/container/komponent_container.css +17 -0
  28. data/lib/generators/komponent/templates/styleguide/components/container/komponent_container.js +1 -0
  29. data/lib/generators/komponent/templates/styleguide/components/container/komponent_container_component.rb +5 -0
  30. data/lib/generators/komponent/templates/styleguide/components/footer/_komponent_footer.html.erb +3 -0
  31. data/lib/generators/komponent/templates/styleguide/components/footer/komponent_footer.css +27 -0
  32. data/lib/generators/komponent/templates/styleguide/components/footer/komponent_footer.js +1 -0
  33. data/lib/generators/komponent/templates/styleguide/components/footer/komponent_footer_component.rb +5 -0
  34. data/lib/generators/komponent/templates/styleguide/components/header/_komponent_header.html.erb +3 -0
  35. data/lib/generators/komponent/templates/styleguide/components/header/komponent_header.css +15 -0
  36. data/lib/generators/komponent/templates/styleguide/components/header/komponent_header.js +1 -0
  37. data/lib/generators/komponent/templates/styleguide/components/header/komponent_header_component.rb +5 -0
  38. data/lib/generators/komponent/templates/styleguide/components/index.js +4 -0
  39. data/lib/generators/komponent/templates/styleguide/components/sidebar/_komponent_sidebar.html.erb +10 -0
  40. data/lib/generators/komponent/templates/styleguide/components/sidebar/komponent_sidebar.css +43 -0
  41. data/lib/generators/komponent/templates/styleguide/components/sidebar/komponent_sidebar.js +1 -0
  42. data/lib/generators/komponent/templates/styleguide/components/sidebar/komponent_sidebar_component.rb +5 -0
  43. data/lib/generators/komponent/templates/styleguide/packs/komponent.js +2 -0
  44. data/lib/generators/komponent/utils.rb +49 -0
  45. data/lib/komponent.rb +2 -2
  46. data/lib/komponent/component.rb +55 -0
  47. data/lib/komponent/component_path_resolver.rb +6 -6
  48. data/lib/komponent/component_renderer.rb +3 -1
  49. data/lib/komponent/{railtie.rb → engine.rb} +21 -1
  50. data/lib/komponent/komponent_helper.rb +29 -0
  51. data/lib/komponent/rails/tasks/komponent.rake +12 -0
  52. data/lib/komponent/translation.rb +15 -3
  53. data/lib/komponent/version.rb +1 -1
  54. metadata +62 -18
  55. data/gemfiles/Gemfile-rails.4.2.x +0 -8
  56. data/gemfiles/Gemfile-rails.5.0.x +0 -8
  57. data/gemfiles/Gemfile-rails.5.1.x +0 -8
  58. data/gemfiles/Gemfile-rails.5.2.x +0 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3e2bae47fbc3e0bfcce014af0c87f14a34ab714c
4
- data.tar.gz: 8ccf2d57342494ecfb6e45eb4db627b70fde7f7a
2
+ SHA256:
3
+ metadata.gz: 771cfe13a6b0819f90aa68ca915ab8ae03103d24059e78b80daf4a8aeb8d04bd
4
+ data.tar.gz: 470dd7ad644217fd257f30d0e267951e8520041cf0e9acbf274a7377fcd52fc1
5
5
  SHA512:
6
- metadata.gz: a77641b9e00d24bcf7ca35a5c7788abcfde90564864c8020840d9a49a73437fa8af1f9904f2dea2623243c4b53ef115f25239612f2fa0fa0aabbddfb20d66094
7
- data.tar.gz: a50699a3015564a76b88665aeef7e8b45e3f928e1cdb8547754141cd800ca755ddf7b944705f8fe55808528c75d7049a765cd16ff67595a20db76a27c7cb943f
6
+ metadata.gz: ec526ec6e340a674101e894944ad486155a77db9516e2f45b9778ed925c8cc9e05193f3b5d4e11144c30f9b33376de07960053b8020ed532a4ee4d1d773cac8f
7
+ data.tar.gz: c74cb8685aeb47b9ee9275e22fc9f5dafe56bc5b58644207954ab5fecd9e192464859908d55cc878f3afd42e349a739fcbc6c7b2622165e086d37f03ff4eebad
@@ -0,0 +1,14 @@
1
+ ; top-most EditorConfig file
2
+ root = true
3
+
4
+ ; Unix-style newlines
5
+ [*]
6
+ end_of_line = LF
7
+ indent_style = space
8
+ indent_size = 2
9
+ charset = utf-8
10
+ trim_trailing_whitespace = true
11
+ insert_final_newline = true
12
+
13
+ [*.md]
14
+ trim_trailing_whitespace = false
data/.gitignore CHANGED
@@ -7,6 +7,8 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ /test/tmp
10
11
 
11
12
  /fixtures/my_app/tmp
12
13
  /fixtures/my_app/log
14
+
@@ -2,10 +2,13 @@ AllCops:
2
2
  TargetRubyVersion: 2.2
3
3
  DisabledByDefault: true
4
4
  Exclude:
5
- - 'node_modules/**/*'
6
- - 'vendor/**/*'
7
- - 'tmp/**/*'
8
- - 'fixtures/**/*'
5
+ - node_modules/**/*
6
+ - vendor/**/*
7
+ - tmp/**/*
8
+ - fixtures/**/*
9
+ - Appraisals
10
+ - gemfiles/**/*
11
+ - test/tmp/**/*
9
12
 
10
13
  Gemspec/OrderedDependencies:
11
14
  Enabled: true
@@ -52,9 +55,6 @@ Naming/PredicateName:
52
55
  Naming/VariableName:
53
56
  Enabled: true
54
57
 
55
- Lint/DeprecatedClassMethods:
56
- Enabled: true
57
-
58
58
  Layout/AlignParameters:
59
59
  Enabled: true
60
60
 
@@ -115,3 +115,6 @@ Layout/SpaceInsideParens:
115
115
 
116
116
  Layout/TrailingWhitespace:
117
117
  Enabled: true
118
+
119
+ Lint/DeprecatedClassMethods:
120
+ Enabled: true
@@ -5,23 +5,22 @@ before_install:
5
5
  - gem update --system
6
6
 
7
7
  rvm:
8
- - 2.2
9
8
  - 2.3
10
9
  - 2.4
11
10
  - 2.5
12
11
  - ruby-head
13
12
 
14
13
  gemfile:
15
- - Gemfile-rails.4.2.x
16
- - Gemfile-rails.5.0.x
17
- - Gemfile-rails.5.1.x
18
- - Gemfile-rails.5.2.x
14
+ - gemfiles/rails_5.0.x.gemfile
15
+ - gemfiles/rails_5.1.x.gemfile
16
+ - gemfiles/rails_5.2.x.gemfile
19
17
 
20
18
  cache:
21
19
  bundler: true
22
20
  yarn: true
23
21
 
24
22
  install:
23
+ - gem install bundler
25
24
  - bundle install
26
25
  - nvm install node
27
26
  - node -v
@@ -0,0 +1,15 @@
1
+ appraise "rails-5.0.x" do
2
+ gem "rails", "~> 5.0"
3
+ end
4
+
5
+ appraise "rails-5.1.x" do
6
+ gem "rails", "~> 5.1"
7
+ end
8
+
9
+ appraise "rails-5.2.x" do
10
+ gem "rails", "~> 5.2"
11
+ end
12
+
13
+ appraise "rails-6.0.x" do
14
+ gem "rails", "~> 6.0.0.beta1"
15
+ end
@@ -2,13 +2,31 @@
2
2
 
3
3
  ## Upcoming release
4
4
 
5
+ ## v3.0.0.beta1 (2019-02-28)
6
+
7
+ **Breaking changes:**
8
+ - Dropped support for Rails 4.2
9
+ - Dropped support for Ruby 2.2
10
+
11
+ **Enhancements:**
12
+ - Komponent now reports component stats when you run `bin/rails stats`
13
+ - Komponent now includes a styleguide engine that you can mount to your project
14
+ to document your components, and 2 new generators:
15
+ - `rails g komponent:styleguide` to set it up
16
+ - `rails g komponent:examples` to generate an `examples` file for each existing component
17
+
18
+ **Bug fixes:**
19
+ - Removed redundant `class` attribute in HAML templates
20
+ - Fix `content_for` / `yield` which was no longer working across components, since `v2.0.0`
21
+ - Fix translation key lookup in partials (helper method `t`)
22
+
5
23
  ## v2.2.0 (2018-07-03)
6
24
 
7
25
  **Enhancements:**
8
26
  - Component generator: use `component_name` instead of `module_name` in templates,
9
27
  so when we create a `button` component, by default it contains `button` instead
10
28
  of `button_component`
11
-
29
+
12
30
  **Bug fixes:**
13
31
  - Component generator: fix error when the single-quotes are used in `import`s
14
32
 
data/Gemfile CHANGED
@@ -10,6 +10,7 @@ gemspec
10
10
  gem "rails"
11
11
  gem "rake", ">= 11.1"
12
12
  gem "rubocop", require: false
13
+ gem "webpacker"
13
14
 
14
15
  group :test do
15
16
  gem "aruba"
data/README.md CHANGED
@@ -34,6 +34,7 @@ This gem has been inspired by our Rails development practices at [Ouvrages](http
34
34
  - [Stimulus integration](#stimulus-integration)
35
35
  - [Internationalization](#internationalization)
36
36
  - [Available locales configuration](#available-locales-configuration)
37
+ - [Styleguide](#styleguide)
37
38
  - [Configuration](#configuration)
38
39
  - [Change default root path](#change-default-root-path)
39
40
  - [Default options for the generators](#default-options-for-the-generators)
@@ -41,13 +42,14 @@ This gem has been inspired by our Rails development practices at [Ouvrages](http
41
42
  - [Force default templating engine](#force-default-templating-engine)
42
43
  - [Additional paths](#additional-paths)
43
44
  - [Contributing](#contributing)
45
+ - [Releasing a new version](#releasing-a-new-version)
44
46
  - [License](#license)
45
47
  </details>
46
48
 
47
49
  ## Compatibility
48
50
 
49
51
  - Ruby 2.2+
50
- - Rails 4.2+
52
+ - Rails 5.0+
51
53
  - Webpacker 3.0.0+
52
54
 
53
55
  ## Getting started
@@ -55,7 +57,7 @@ This gem has been inspired by our Rails development practices at [Ouvrages](http
55
57
  ```ruby
56
58
  # Gemfile
57
59
 
58
- gem "komponent"
60
+ gem 'komponent'
59
61
  ```
60
62
 
61
63
  Run the following command to set up your project instantly:
@@ -84,8 +86,8 @@ Then, render it in your views with the `component` helper (or its alias `c`).
84
86
  ```slim
85
87
  / app/views/pages/home.html.slim
86
88
 
87
- = component "button"
88
- = c "button"
89
+ = component 'button'
90
+ = c 'button'
89
91
  ```
90
92
 
91
93
  Or, directly from your controllers:
@@ -94,7 +96,7 @@ Or, directly from your controllers:
94
96
  # app/controllers/pages_controller.rb
95
97
 
96
98
  def home
97
- render html: helpers.component("home")
99
+ render html: helpers.component('home')
98
100
  end
99
101
  ```
100
102
 
@@ -106,11 +108,11 @@ Make sure to include javascript pack tag and stylesheet pack tag in your applica
106
108
  doctype html
107
109
  html
108
110
  head
109
- = stylesheet_pack_tag "application"
111
+ = stylesheet_pack_tag 'application'
110
112
 
111
113
  body
112
114
  = yield
113
- = javascript_pack_tag "application"
115
+ = javascript_pack_tag 'application'
114
116
  ```
115
117
 
116
118
  Check [Webpacker documentation](https://github.com/rails/webpacker) for further information.
@@ -122,7 +124,7 @@ You can pass `locals` to the helper. They are accessible within the component pa
122
124
  ```slim
123
125
  / app/views/pages/home.html.slim
124
126
 
125
- = component "button", text: "My button"
127
+ = component 'button', text: 'My button'
126
128
  ```
127
129
 
128
130
  ```slim
@@ -145,10 +147,10 @@ If you want better control of the cache expiration, you can provide a custom `ca
145
147
  / app/views/pages/home.html.slim
146
148
 
147
149
  / Cache the component based on its locals
148
- = component "button", { text: "Click here" }, cached: true
150
+ = component "button", { text: 'Click here' }, cached: true
149
151
 
150
152
  / or cache the component with a specific key, such as the last update of a model
151
- = component "button", { text: "Click here" }, cached: true, cache_key: @product.updated_at
153
+ = component "button", { text: 'Click here' }, cached: true, cache_key: @product.updated_at
152
154
  ```
153
155
 
154
156
  ### Passing a block
@@ -158,8 +160,8 @@ The component also accepts a `block`. To render the block, just use the standard
158
160
  ```slim
159
161
  / app/views/pages/home.html.slim
160
162
 
161
- = component "button"
162
- span= "My button"
163
+ = component 'button'
164
+ span= 'My button'
163
165
  ```
164
166
 
165
167
  ```slim
@@ -180,7 +182,7 @@ Each component comes with a Ruby `module`. You can use it to set properties:
180
182
 
181
183
  module ButtonComponent
182
184
  property :href, required: true
183
- property :text, default: "My button"
185
+ property :text, default: 'My button'
184
186
  end
185
187
  ```
186
188
 
@@ -200,10 +202,10 @@ If your partial becomes too complex and you want to extract logic from it, you m
200
202
 
201
203
  module ButtonComponent
202
204
  property :href, required: true
203
- property :text, default: "My button"
205
+ property :text, default: 'My button'
204
206
 
205
207
  def external_link?
206
- @href.starts_with? "http"
208
+ @href.starts_with? 'http'
207
209
  end
208
210
  end
209
211
  ```
@@ -213,7 +215,7 @@ end
213
215
 
214
216
  a.button(href=@href)
215
217
  = @text
216
- = " (external link)" if external_link?
218
+ = ' (external link)' if external_link?
217
219
  ```
218
220
 
219
221
  ```slim
@@ -232,7 +234,7 @@ You can also choose to split your component into partials. In this case, we can
232
234
  a.button(href=@href)
233
235
  = @text
234
236
  - if external_link?
235
- = render "suffix", text: "external link"
237
+ = render 'suffix', text: 'external link'
236
238
  ```
237
239
 
238
240
  ```slim
@@ -253,7 +255,7 @@ This will create the component in an `admin` folder, and name its Ruby module `A
253
255
 
254
256
  ### Stimulus integration
255
257
 
256
- Komponent supports [stimulus](https://github.com/stimulusjs/stimulus) 1.0.
258
+ Komponent supports [Stimulus](https://github.com/stimulusjs/stimulus) >= 1.0.
257
259
 
258
260
  You can pass `--stimulus` to both generators to use Stimulus in your components.
259
261
 
@@ -261,7 +263,7 @@ You can pass `--stimulus` to both generators to use Stimulus in your components.
261
263
  rails generate komponent:install --stimulus
262
264
  ```
263
265
 
264
- This will yarn `stimulus` package, and create a `stimulus_application.js` in the `frontend` folder.
266
+ This will `yarn add stimulus` and create a `stimulus_application.js` in the `frontend` folder.
265
267
 
266
268
  ```sh
267
269
  rails generate component button --stimulus
@@ -284,7 +286,7 @@ This will create a `yml` file for each locale (using `I18n.available_locales`).
284
286
 
285
287
  = a.button(href=@href)
286
288
  = @text
287
- = render("suffix", text: t(".external_link")) if external_link?
289
+ = render('suffix', text: t(".external_link")) if external_link?
288
290
  ```
289
291
 
290
292
  ```yml
@@ -292,7 +294,7 @@ This will create a `yml` file for each locale (using `I18n.available_locales`).
292
294
 
293
295
  en:
294
296
  button_component:
295
- external_link: "external link"
297
+ external_link: external link
296
298
  ```
297
299
 
298
300
  ```yml
@@ -300,7 +302,7 @@ en:
300
302
 
301
303
  fr:
302
304
  button_component:
303
- external_link: "lien externe"
305
+ external_link: lien externe
304
306
  ```
305
307
 
306
308
  #### Available locales configuration
@@ -313,6 +315,34 @@ I18n.available_locales = [:en, :fr]
313
315
  > If you have the `rails-i18n` gem in your `Gemfile`, you should whitelist locales to prevent creating a lot of
314
316
  > locale files when you generate a new component.
315
317
 
318
+ ### Styleguide
319
+
320
+ Komponent includes a basic styleguide engine that you can use in your project to document your components.
321
+
322
+ ![Komponent styleguide UI](https://user-images.githubusercontent.com/38524/41193700-45909330-6c10-11e8-87b7-59e628529200.png)
323
+
324
+ To set it up, you can use the generator:
325
+
326
+ ```sh
327
+ rails generate komponent:styleguide
328
+ ```
329
+
330
+ This command will:
331
+
332
+ * copy the styleguide components (`komponent/container`, `komponent/footer`, `komponent/header` and `komponent/sidebar`) to your components folder, so you can customize them
333
+ * add a new `komponent.js` pack to your packs folder
334
+ * mount the engine in your routes
335
+
336
+ Then, for each component, you can describe it and render examples for each state in the `_example.html.slim` file from the component folder. The engine will then render it on the component page.
337
+
338
+ If you have existing components, you can generate all their example files at once with:
339
+
340
+ ```sh
341
+ rails generate komponent:examples
342
+ ```
343
+
344
+ Finally, visit `http://localhost:3000/styleguide` to access your styleguide.
345
+
316
346
  ### Configuration
317
347
 
318
348
  #### Change default root path
@@ -320,7 +350,7 @@ I18n.available_locales = [:en, :fr]
320
350
  You can change the default root path (`frontend`) to another path where Komponent should be installed and components generated. You need to change `komponent.root` in an initializer.
321
351
 
322
352
  ```rb
323
- Rails.application.config.komponent.root = Rails.root.join("app/frontend")
353
+ Rails.application.config.komponent.root = Rails.root.join('app/frontend')
324
354
  ```
325
355
 
326
356
  #### Default options for the generators
@@ -393,14 +423,14 @@ module MyEngine
393
423
  app.config.komponent.component_paths.append(MyEngine::Engine.root.join("frontend/components"))
394
424
  end
395
425
 
396
- initializer "my_engine.action_dispatch" do |app|
426
+ initializer 'my_engine.action_dispatch' do |app|
397
427
  ActiveSupport.on_load :action_controller do
398
428
  ActionController::Base.prepend_view_path MyEngine::Engine.root.join("frontend")
399
429
  end
400
430
  end
401
431
 
402
432
  initializer 'my_engine.autoload', before: :set_autoload_paths do |app|
403
- app.config.autoload_paths << MyEngine::Engine.root.join("frontend")
433
+ app.config.autoload_paths << MyEngine::Engine.root.join('frontend')
404
434
  end
405
435
  end
406
436
  end
@@ -425,10 +455,30 @@ resolved_paths:
425
455
  - engine/frontend
426
456
  ```
427
457
 
458
+ ## Running tests
459
+
460
+ Run all Cucumber features and unit tests with `bundle exec appraisal rake test`
461
+
462
+ Run the full test matrix with `bundle exec appraisal rake test`
463
+
428
464
  ## Contributing
429
465
 
430
466
  Bug reports and pull requests are welcome on GitHub at https://github.com/komposable/komponent.
431
467
 
468
+ ## Releasing a new version
469
+
470
+ - Update the CHANGELOG (add a title and a date for the new version)
471
+ - Update the version number in `lib/komponent/version`
472
+ - Install the `gem-release` gem if you haven't already
473
+ - Run `gem release --tag --push`
474
+ - Create or update the release on Github with the same version number and copy-paste the description from the CHANGELOG
475
+
476
+ Please note:
477
+
478
+ If you're releasing a patch version (eg. from 2.0.1 to 2.0.2) you can run `gem bump patch --release --tag --push --sign` so you don't have to manually change the version number.
479
+
480
+ If you want to release a specific version (eg. beta, RC...), you can run `gem bump 3.0.0.beta1 --release --tag --push --sign`
481
+
432
482
  ## License
433
483
 
434
484
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Komponent
4
+ class StyleguideController < ::ApplicationController
5
+ layout 'komponent'
6
+ rescue_from ActionView::MissingTemplate, with: :missing_template
7
+
8
+ def index; end
9
+
10
+ def show
11
+ @component = Komponent::Component.find(params[:id])
12
+ end
13
+
14
+ private
15
+
16
+ def missing_template
17
+ render 'komponent/styleguide/missing_template', status: :not_found
18
+ end
19
+ end
20
+ end