rails_blocks 0.5.4.pre.alpha.pre.2

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 (66) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +15 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +10 -0
  5. data/Gemfile +10 -0
  6. data/Guardfile +43 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +31 -0
  9. data/Rakefile +12 -0
  10. data/app/assets/javascripts/block.coffee +98 -0
  11. data/app/assets/javascripts/jblocks.coffee +95 -0
  12. data/app/assets/javascripts/jquery_bem.coffee +4 -0
  13. data/app/assets/javascripts/jquery_bem_copy.coffee +486 -0
  14. data/app/assets/javascripts/main.coffee +10 -0
  15. data/app/assets/javascripts/rails_blocks.js +5 -0
  16. data/app/assets/stylesheets/rails_blocks.sass +94 -0
  17. data/app/helpers/block_helper.rb +122 -0
  18. data/app/views/rails_blocks/element.slim +2 -0
  19. data/coffeelint.json +12 -0
  20. data/config/spring.rb +1 -0
  21. data/config.ru +7 -0
  22. data/lib/rails_blocks/blocks/block.rb +28 -0
  23. data/lib/rails_blocks/blocks/element.rb +6 -0
  24. data/lib/rails_blocks/blocks/renderer.rb +13 -0
  25. data/lib/rails_blocks/configuration.rb +27 -0
  26. data/lib/rails_blocks/engine.rb +29 -0
  27. data/lib/rails_blocks/exceptions.rb +4 -0
  28. data/lib/rails_blocks/initializers/rails_blocks.rb +0 -0
  29. data/lib/rails_blocks/levels.rb +7 -0
  30. data/lib/rails_blocks/names.rb +60 -0
  31. data/lib/rails_blocks/path.rb +108 -0
  32. data/lib/rails_blocks/version.rb +3 -0
  33. data/lib/rails_blocks.rb +24 -0
  34. data/lib/tasks/rails_blocks.rake +8 -0
  35. data/rails_blocks.gemspec +39 -0
  36. data/spec/helpers/block_helper_spec.rb +58 -0
  37. data/spec/internal/app/blocks/app/block3/_mod1.slim +0 -0
  38. data/spec/internal/app/blocks/app/block3/_mod2_value2.slim +0 -0
  39. data/spec/internal/app/blocks/app/block3/block3.slim +0 -0
  40. data/spec/internal/app/blocks/common/block1/_mod1.slim +0 -0
  41. data/spec/internal/app/blocks/common/block1/_mod2_value2.slim +0 -0
  42. data/spec/internal/app/blocks/common/block1/block1.slim +2 -0
  43. data/spec/internal/app/blocks/common/block2/__elem1.slim +0 -0
  44. data/spec/internal/app/blocks/common/block2/__elem1_mod1.slim +0 -0
  45. data/spec/internal/app/blocks/common/block2/__elem1_mod2_val2.slim +0 -0
  46. data/spec/internal/app/blocks/common/block2/block2.slim +0 -0
  47. data/spec/internal/app/blocks/common/block3/_mod1.slim +0 -0
  48. data/spec/internal/app/blocks/common/block3/_mod2_value2.slim +0 -0
  49. data/spec/internal/app/blocks/common/block3/block3.slim +0 -0
  50. data/spec/internal/app/controllers/admin/admin_test_controller.rb +2 -0
  51. data/spec/internal/app/controllers/admin_controller.rb +2 -0
  52. data/spec/internal/app/controllers/application_controller.rb +2 -0
  53. data/spec/internal/config/database.yml +3 -0
  54. data/spec/internal/config/initializers/rails_blocks.rb +7 -0
  55. data/spec/internal/config/routes.rb +3 -0
  56. data/spec/internal/db/schema.rb +3 -0
  57. data/spec/internal/log/.gitignore +1 -0
  58. data/spec/internal/log/test.log +8 -0
  59. data/spec/internal/public/favicon.ico +0 -0
  60. data/spec/rails_blocks/blocks/block_spec.rb +11 -0
  61. data/spec/rails_blocks/configuration_spec.rb +29 -0
  62. data/spec/rails_blocks/names_spec.rb +66 -0
  63. data/spec/rails_blocks/path_spec.rb +70 -0
  64. data/spec/rails_blocks_spec.rb +104 -0
  65. data/spec/spec_helper.rb +112 -0
  66. metadata +368 -0
data/coffeelint.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "indentation" : {
3
+ "level" : "ignore"
4
+ },
5
+ "line_endings" : {
6
+ "value" : "unix",
7
+ "level" : "error"
8
+ },
9
+ "no_tabs" : {
10
+ "level" : "ignore"
11
+ }
12
+ }
data/config/spring.rb ADDED
@@ -0,0 +1 @@
1
+ Spring.application_root = './spec/dummy'
data/config.ru ADDED
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require :default, :development
5
+
6
+ Combustion.initialize! :all
7
+ run Combustion::Application
@@ -0,0 +1,28 @@
1
+ require 'rails_blocks/blocks/renderer'
2
+ module RailsBlocks
3
+ module Blocks
4
+ class Block
5
+ include Blocks::Renderer
6
+ attr_accessor :name
7
+ attr_accessor :options
8
+ attr_accessor :content
9
+
10
+ def initialize(name)
11
+ @name = name
12
+ end
13
+
14
+ def render
15
+ ".#{klass}\n\t#{render_content}"
16
+ end
17
+
18
+ def render_content
19
+ instance_eval &content
20
+ end
21
+
22
+
23
+ def klass
24
+ RailsBlocks.config.prefix + @name
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,6 @@
1
+ module RailsBlocks
2
+ module Blocks
3
+ class Element
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ module RailsBlocks
2
+ module Blocks
3
+ module Renderer
4
+ def b(b_name, options={}, &content)
5
+ "b_name"
6
+ end
7
+
8
+ def e(e_name, options={}, &content)
9
+ "e_name"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ module RailsBlocks
2
+ class Configuration
3
+ attr_accessor :prefix
4
+ attr_accessor :blocks_dir
5
+ attr_accessor :levels
6
+ attr_accessor :template_engine
7
+ attr_accessor :element_separator
8
+ attr_accessor :modifier_separator
9
+ attr_accessor :js_class
10
+
11
+ def ns(name)
12
+ @ns ||= {}
13
+ ns_config = @ns[name] ||= Configuration.new
14
+ yield ns_config
15
+ end
16
+
17
+ def initialize
18
+ @prefix = 'b-'
19
+ @blocks_dir = 'app/blocks'
20
+ @levels = []
21
+ @template_engine = '.slim'
22
+ @element_separator = '__'
23
+ @modifier_separator = '--'
24
+ @js_class = 'js_bem'
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ require 'rails_blocks/levels'
2
+ module RailsBlocks
3
+ class Engine < Rails::Engine
4
+ #isolate_namespace RailsBlocks
5
+ config.autoload_paths << File.expand_path("../rails_blocks", __FILE__)
6
+
7
+ initializer 'rails_blocks.configure_rails_initialization' do
8
+ require 'rails_blocks/initializers/rails_blocks'
9
+ end
10
+
11
+ initializer 'rails_blocks.precompile', :group => :all do |app|
12
+ app.config.assets.precompile += %w( rails_blocks.js )
13
+ end
14
+
15
+ config.to_prepare do
16
+ ActionView::Base.send :include, BlockHelper
17
+ #ApplicationController.helper(BlockHelper)
18
+ end
19
+
20
+ ActiveSupport.on_load :action_controller do
21
+ include RailsBlocks::Levels
22
+ before_filter :add_view_paths
23
+ end
24
+
25
+ rake_tasks do
26
+ load "tasks/rails_blocks.rake"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,4 @@
1
+ module RailsBlocks
2
+ class NoBlockContextError < StandardError; end
3
+ class BadMixError < StandardError; end
4
+ end
File without changes
@@ -0,0 +1,7 @@
1
+ module RailsBlocks
2
+ module Levels
3
+ def add_view_paths
4
+ prepend_view_path RailsBlocks::Path.blocks_dir
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,60 @@
1
+ module RailsBlocks
2
+ module Names
3
+ def element_classes(b_name, e_name, options = {})
4
+ base_class = element_class b_name, e_name
5
+ classes(base_class, options)
6
+ end
7
+
8
+ def block_classes(b_name, options = {})
9
+ base_class = block_class b_name
10
+ classes(base_class, options)
11
+ end
12
+
13
+ private
14
+ def classes(base_class, options = {})
15
+ classes = [base_class]
16
+ classes |= mods_classes(base_class, options[:mods]) unless options[:mods].nil?
17
+ classes |= mix_classes(options[:mix], options[:parent_block]) if options[:mix]
18
+ classes |= Array(options[:class]) if options[:class]
19
+ classes << RailsBlocks.config.js_class if options[:js]
20
+ classes
21
+ end
22
+
23
+ def mix_classes(mixes, context_block = nil)
24
+ mixes = [mixes] unless mixes.is_a? Array
25
+ mixes.map do |mix|
26
+ if mix[:e]
27
+ raise RailsBlocks::BadMixError if context_block.nil? && !mix[:b]
28
+ if mix[:b]
29
+ element_classes(mix[:b].to_s, mix[:e].to_s, mix)
30
+ else
31
+ element_classes(context_block, mix[:e].to_s, mix)
32
+ end
33
+ else
34
+ raise RailsBlocks::BadMixError if mix[:b].nil?
35
+ block_classes(mix[:b].to_s, mix)
36
+ end
37
+ end.inject(&:|)
38
+ end
39
+
40
+ def mods_classes(base_class, mods)
41
+ mods.map do |key, value|
42
+ next('') unless value
43
+ mod = mod_class(key, value)
44
+ base_class + RailsBlocks.config.modifier_separator + mod
45
+ end
46
+ end
47
+
48
+ def mod_class(key, value)
49
+ value == true ? key.to_s : key.to_s + '_' + value.to_s
50
+ end
51
+
52
+ def block_class(b_name)
53
+ RailsBlocks.config.prefix + b_name.to_s
54
+ end
55
+
56
+ def element_class(b_name, e_name)
57
+ block_class(b_name) + RailsBlocks.config.element_separator + e_name.to_s
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,108 @@
1
+ require 'rails_blocks/names'
2
+ module RailsBlocks
3
+ module Path
4
+ include RailsBlocks::Names
5
+ ELEMENT_FILE_PREFIX = '__'
6
+ MOD_FILE_PREFIX = '_'
7
+
8
+ class << self
9
+ attr_writer :tree
10
+ end
11
+
12
+ def self.tree
13
+ #so slow, переделать на оновление при запросе, а не каждый раз
14
+ #return build_tree if Rails.env.development?
15
+ @tree ||= (
16
+ build_tree
17
+ )
18
+ end
19
+
20
+ def self.blocks_dir
21
+ Rails.root.join RailsBlocks.config.blocks_dir
22
+ end
23
+
24
+ def block_template(b_name, options = {})
25
+ options[:levels].reverse.each do |level|
26
+ next unless Path.tree[level][b_name]
27
+ return Path.tree[level][b_name][mod(options)] || Path.tree[level][b_name]['']
28
+ end
29
+ nil
30
+ end
31
+
32
+ def element_template(b_name, e_name, options = {})
33
+ options[:levels].reverse.each do |level|
34
+ next unless Path.tree[level][b_name]
35
+ next unless Path.tree[level][b_name][:elements][e_name]
36
+ return Path.tree[level][b_name][:elements][e_name][mod(options)] || Path.tree[level][b_name][:elements][e_name]['']
37
+ end
38
+ nil
39
+ end
40
+
41
+ private
42
+
43
+ def mod(options)
44
+ return '' unless options[:mods] && !options[:mods].empty?
45
+ mod_class(*options[:mods].first)
46
+ end
47
+
48
+ def get_block_dir(b_name, levels)
49
+ levels.reverse.each do |level|
50
+ block_dir = File.join(self.blocks_dir, level, b_name)
51
+ if Dir.exists? block_dir
52
+ return block_dir
53
+ end
54
+ end
55
+ nil
56
+ end
57
+
58
+ def self.build_tree
59
+ file_tree
60
+ end
61
+
62
+ def self.file_tree
63
+ t = {}
64
+ files = Dir["#{blocks_dir}/**/*#{RailsBlocks.config.template_engine}"]
65
+ files.each do |file|
66
+ file.sub! blocks_dir.to_s + '/', ''
67
+ parts = file.split('/')
68
+ filename = parts[2].sub RailsBlocks.config.template_engine, ''
69
+ template = {
70
+ level: parts[0],
71
+ block: parts[1],
72
+ file: filename
73
+ }
74
+ t[template[:level]] ||= {}
75
+ t[template[:level]][template[:block]] ||= {elements: {}}
76
+
77
+ if is_e_file(filename)
78
+ t[template[:level]][template[:block]][:elements][get_e_name(filename)] ||= {}
79
+ t[template[:level]][template[:block]][:elements][get_e_name(filename)][get_e_mod(filename)] = file
80
+ else
81
+ t[template[:level]][template[:block]][get_b_mod(filename)] = file
82
+ end
83
+ end
84
+ t.with_indifferent_access.freeze
85
+ end
86
+
87
+ def self.is_e_file(file)
88
+ file.start_with? ELEMENT_FILE_PREFIX
89
+ end
90
+
91
+ def self.get_e_name(file)
92
+ file.match(/\A__([^_]*)/)
93
+ $1
94
+ end
95
+
96
+ def self.get_e_mod(file)
97
+ return '' unless file.match(/__\w+#{MOD_FILE_PREFIX}\w/)
98
+ file.match(/\A__(?:[^_]*)_(.*)/)
99
+ $1
100
+ end
101
+
102
+ def self.get_b_mod(file)
103
+ return '' unless file.start_with? MOD_FILE_PREFIX
104
+ file.match(/^_(.*)/)
105
+ $1
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,3 @@
1
+ module RailsBlocks
2
+ VERSION = "0.5.4".freeze
3
+ end
@@ -0,0 +1,24 @@
1
+ require 'rails_blocks/version'
2
+ require 'rails_blocks/blocks/block'
3
+ require 'rails_blocks/configuration'
4
+ require 'rails_blocks/exceptions'
5
+ require 'rails_blocks/path'
6
+ require 'rails_blocks/engine' if defined?(Rails)
7
+
8
+ module RailsBlocks
9
+ class << self
10
+ attr_writer :config
11
+ end
12
+
13
+ def self.config
14
+ @config ||= Configuration.new
15
+ end
16
+
17
+ def self.configure
18
+ yield config
19
+ end
20
+
21
+ def self.reset
22
+ @config = Configuration.new
23
+ end
24
+ end
@@ -0,0 +1,8 @@
1
+ namespace :rails_blocks do
2
+ desc "Rename block(only in blocks folder)"
3
+ task :rename_b, :old_name, :new_name do |_, args|
4
+ puts args
5
+ levels = Dir[RailsBlocks.blocks_dir + '*'].select {|d| File.directory? d}
6
+
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rails_blocks/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rails_blocks'
8
+ spec.version = RailsBlocks::VERSION
9
+ spec.version = "#{spec.version}-alpha-#{ENV['TRAVIS_BUILD_NUMBER']}" if ENV['TRAVIS']
10
+ spec.authors = ['Andrey Potetiurin']
11
+ spec.email = ['potetiurin@gmail.com']
12
+ spec.summary = 'Rails plugin for work with some modification of BEM methodology'
13
+ spec.description = 'Gem helps build UI with blocks approach'
14
+ spec.homepage = ''
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0")
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_dependency 'rails', '~> 4.2', '>= 4.2.3'
23
+ #testing
24
+ spec.add_development_dependency 'combustion', '~> 0.5.3'
25
+ spec.add_development_dependency 'bundler', '~> 1.7'
26
+ spec.add_development_dependency 'rspec', '~> 3.3'
27
+ spec.add_development_dependency 'rspec-nc'
28
+ spec.add_development_dependency 'capybara'
29
+ spec.add_development_dependency 'rspec-rails', '~> 3.0'
30
+ spec.add_development_dependency 'memfs'
31
+ spec.add_development_dependency 'spring'
32
+ spec.add_development_dependency 'guard'
33
+ spec.add_development_dependency 'guard-rspec'
34
+ spec.add_development_dependency 'pry'
35
+ spec.add_development_dependency 'pry-remote'
36
+ spec.add_development_dependency 'pry-nav'
37
+ spec.add_development_dependency 'terminal-notifier'
38
+ spec.add_development_dependency 'terminal-notifier-guard'
39
+ end
@@ -0,0 +1,58 @@
1
+ describe BlockHelper, type: :helper do
2
+ before do
3
+ controller.add_view_paths
4
+ end
5
+
6
+ context ".b" do
7
+ it "renders empty div with class when called without options" do
8
+ result = b :test
9
+ expect(result).to eq '<div class="b-test"></div>'
10
+ end
11
+
12
+ it "renders div with content when called with block" do
13
+ result = b 'test-block' do
14
+ 'test-content'
15
+ end
16
+ expect(result).to eq '<div class="b-test-block">test-content</div>'
17
+ end
18
+
19
+ it "renders empty div with mods class when called with mods" do
20
+ result = b 'test-block', mods: {test: :one}
21
+ expect(result).to eq '<div class="b-test-block b-test-block--test_one"></div>'
22
+ end
23
+
24
+ it 'renders file when one exists' do
25
+ result = b 'block1'
26
+ expect(result).to eq '<div class="b-block1">block1</div>'
27
+ end
28
+ end
29
+
30
+ context ".e" do
31
+ it "raise error when called outside block" do
32
+ expect{ e 'test-element' }.to raise_error RailsBlocks::NoBlockContextError
33
+ end
34
+
35
+ it "renders empty element with class when called without options" do
36
+ b 'test' do
37
+ result = e :element
38
+ expect(result).to eq '<div class="b-test__element"></div>'
39
+ end
40
+ end
41
+
42
+ it "renders element with mods class when called with mods" do
43
+ b 'test' do
44
+ result = e 'element', mods: {test: :boo, test2: true}
45
+ expect(result).to eq '<div class="b-test__element b-test__element--test_boo b-test__element--test2"></div>'
46
+ end
47
+ end
48
+
49
+ it "renders element with class & content when called with block" do
50
+ b 'test' do
51
+ result = e 'element' do
52
+ "content"
53
+ end
54
+ expect(result).to eq '<div class="b-test__element">content</div>'
55
+ end
56
+ end
57
+ end
58
+ end
File without changes
File without changes
File without changes
@@ -0,0 +1,2 @@
1
+ *bem_attrs
2
+ |block1
File without changes
@@ -0,0 +1,2 @@
1
+ class Admin::AdminTestController < AdminController
2
+ end
@@ -0,0 +1,2 @@
1
+ class AdminController < ActionController::Base
2
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationController < ActionController::Base
2
+ end
@@ -0,0 +1,3 @@
1
+ test:
2
+ adapter: sqlite3
3
+ database: db/combustion_test.sqlite
@@ -0,0 +1,7 @@
1
+ RailsBlocks.configure do |config|
2
+ config.levels = [:common, :app]
3
+
4
+ config.ns :admin do |ns_config|
5
+ ns_config.levels = [:common, :admin]
6
+ end
7
+ end
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ #
3
+ end
@@ -0,0 +1,3 @@
1
+ ActiveRecord::Schema.define do
2
+ #
3
+ end
@@ -0,0 +1 @@
1
+ *.log
@@ -0,0 +1,8 @@
1
+ Rendered app/blocks/common/block1/block1.slim (0.6ms)
2
+ Rendered app/blocks/common/block1/block1.slim (0.5ms)
3
+ Rendered app/blocks/common/block1/block1.slim (16.8ms)
4
+ Rendered app/blocks/common/block1/block1.slim (29.1ms)
5
+ Rendered app/blocks/common/block1/block1.slim (14.3ms)
6
+ Rendered app/blocks/common/block1/block1.slim (17.0ms)
7
+ Rendered app/blocks/common/block1/block1.slim (16.0ms)
8
+ Rendered app/blocks/common/block1/block1.slim (20.0ms)
File without changes
@@ -0,0 +1,11 @@
1
+ require 'rails_blocks/blocks/block'
2
+
3
+ describe RailsBlocks::Blocks::Block do
4
+ xit 'render empty div with block class if block isn\'t defined' do
5
+ b_name = 'test-block'
6
+ block = RailsBlocks.get_block b_name
7
+ result = block.render
8
+ klass = RailsBlocks.config.prefix + b_name
9
+ expect(result).to match(/<div.*\/div>/) & match(/class=\"#{klass}\"/)
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ describe RailsBlocks::Configuration do
2
+ subject { RailsBlocks::Configuration.new }
3
+ describe "#prefix" do
4
+ it "default value is 'b-'" do
5
+ expect(subject.prefix).to eq 'b-'
6
+ end
7
+ end
8
+
9
+ describe "#prefix=" do
10
+ it "can set value" do
11
+ subject.prefix = 't-'
12
+ expect(subject.prefix).to eq 't-'
13
+ end
14
+ end
15
+
16
+ describe "#ns" do
17
+ it 'yield new Configuration' do
18
+ subject.ns :admin do |config|
19
+ expect(config).to be_a RailsBlocks::Configuration
20
+ end
21
+ end
22
+
23
+ xit 'creates new namespace' do
24
+ subject.ns :admin do |config|
25
+ expect(config.nss).not_to be_empty
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,66 @@
1
+ require 'rails_blocks/names'
2
+
3
+ describe RailsBlocks::Names do
4
+ include RailsBlocks::Names
5
+ context '.element_classes' do
6
+ it 'returns simple element_classes without options' do
7
+ classes = element_classes 'block', 'element'
8
+ expect(classes).to contain_exactly 'b-block__element'
9
+ end
10
+
11
+ it 'returns element_class & mods with options[:mods]' do
12
+ classes = element_classes 'block', 'element', mods: {test: :one}
13
+ expect(classes).to contain_exactly 'b-block__element', 'b-block__element--test_one'
14
+ end
15
+ end
16
+
17
+ context '.block_classes' do
18
+ it 'returns simple block_class without options' do
19
+ classes = block_classes 'block'
20
+ expect(classes).to contain_exactly 'b-block'
21
+ end
22
+
23
+ it 'returns block_class & mods with options[:mods]' do
24
+ classes = block_classes 'block', mods: {test: :one}
25
+ expect(classes).to contain_exactly 'b-block', 'b-block--test_one'
26
+ end
27
+ end
28
+
29
+ context '.mods_classes' do
30
+ it 'returns mods classes' do
31
+ classes = mods_classes 'b-base', {test: :one, boo: :two}
32
+ expect(classes).to contain_exactly 'b-base--test_one', 'b-base--boo_two'
33
+ end
34
+ end
35
+
36
+ context '.mix_classes' do
37
+ it 'returns element class when one :b & :e exists' do
38
+ classes = mix_classes b: :block, e: :element
39
+ expect(classes).to contain_exactly 'b-block__element'
40
+ end
41
+
42
+ it 'returns element classes when array :b & :e exists' do
43
+ classes = mix_classes [{b: :block, e: :element}, {b: 'block2', e: 'element2'}]
44
+ expect(classes).to contain_exactly 'b-block__element', 'b-block2__element2'
45
+ end
46
+
47
+ it 'returns blocks classes when only :b exists' do
48
+ classes = mix_classes b: :block
49
+ expect(classes).to contain_exactly 'b-block'
50
+ end
51
+
52
+ it 'returns blocks classes when array of :b exists' do
53
+ classes = mix_classes [{b: :block}, {b: :test}]
54
+ expect(classes).to contain_exactly 'b-block', 'b-test'
55
+ end
56
+
57
+ it 'returns blocks classes & element classes when array of :b, :b & :e exists' do
58
+ classes = mix_classes [{b: :block}, {b: :test, e: :boo}]
59
+ expect(classes).to contain_exactly 'b-block', 'b-test__boo'
60
+ end
61
+
62
+ it 'raise error if :b not exists' do
63
+ expect { mix_classes(e: :boo) }.to raise_error RailsBlocks::BadMixError
64
+ end
65
+ end
66
+ end