hexx 7.1.0 → 8.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +2 -0
  3. data/.gitignore +9 -0
  4. data/.metrics +5 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +2 -63
  7. data/.travis.yml +5 -0
  8. data/.yardopts +2 -0
  9. data/Gemfile +3 -0
  10. data/Guardfile +16 -0
  11. data/{LICENSE.rdoc → LICENSE} +2 -2
  12. data/README.md +138 -0
  13. data/Rakefile +8 -14
  14. data/config/initializer.rb +5 -0
  15. data/config/initializers/capture.rb +19 -0
  16. data/config/initializers/sandbox.rb +16 -0
  17. data/config/initializers/sandbox/helpers.rb +38 -0
  18. data/config/initializers/sandbox/matchers.rb +19 -0
  19. data/config/metrics/STYLEGUIDE +230 -0
  20. data/config/metrics/cane.yml +5 -0
  21. data/config/metrics/churn.yml +6 -0
  22. data/config/metrics/flay.yml +2 -0
  23. data/config/metrics/metric_fu.yml +15 -0
  24. data/config/metrics/pippi.yml +3 -0
  25. data/config/metrics/reek.yml +1 -0
  26. data/config/metrics/roodi.yml +24 -0
  27. data/config/metrics/rubocop.yml +79 -0
  28. data/config/metrics/saikuro.yml +3 -0
  29. data/config/metrics/simplecov.yml +6 -0
  30. data/config/metrics/yardstick.yml +37 -0
  31. data/hexx.gemspec +24 -0
  32. data/lib/hexx.rb +8 -15
  33. data/lib/hexx/generator.rb +71 -0
  34. data/lib/hexx/generator/file.rb +83 -0
  35. data/lib/hexx/generator/folder.rb +68 -0
  36. data/lib/hexx/name.rb +122 -46
  37. data/lib/hexx/version.rb +6 -5
  38. data/spec/fixtures/root/_.beta +1 -0
  39. data/spec/fixtures/root/__omega +0 -0
  40. data/spec/fixtures/root/delta.erb.erb +0 -0
  41. data/spec/fixtures/root/gamma.rb.erb +1 -0
  42. data/spec/fixtures/root/subfolder/alfa.yml +0 -0
  43. data/spec/spec_helper.rb +5 -10
  44. data/spec/tests/lib/generator_spec.rb +126 -0
  45. data/spec/tests/lib/name_spec.rb +113 -0
  46. metadata +54 -168
  47. data/README.rdoc +0 -371
  48. data/lib/hexx/coercible.rb +0 -43
  49. data/lib/hexx/configurable.rb +0 -101
  50. data/lib/hexx/creators/base.rb +0 -103
  51. data/lib/hexx/creators/coercion.rb +0 -82
  52. data/lib/hexx/creators/dependency.rb +0 -87
  53. data/lib/hexx/creators/module_dependency.rb +0 -57
  54. data/lib/hexx/creators/parameter.rb +0 -40
  55. data/lib/hexx/dependable.rb +0 -51
  56. data/lib/hexx/helpers/exceptions.rb +0 -53
  57. data/lib/hexx/helpers/messages.rb +0 -26
  58. data/lib/hexx/helpers/parameters.rb +0 -47
  59. data/lib/hexx/helpers/validations.rb +0 -21
  60. data/lib/hexx/message.rb +0 -79
  61. data/lib/hexx/null.rb +0 -218
  62. data/lib/hexx/service.rb +0 -388
  63. data/lib/hexx/service/with_callbacks.rb +0 -104
  64. data/lib/hexx/service_invalid.rb +0 -73
  65. data/spec/hexx/coercible_spec.rb +0 -72
  66. data/spec/hexx/configurable_spec.rb +0 -93
  67. data/spec/hexx/dependable_spec.rb +0 -125
  68. data/spec/hexx/helpers/exceptions_spec.rb +0 -96
  69. data/spec/hexx/helpers/messages_spec.rb +0 -48
  70. data/spec/hexx/helpers/parameters_spec.rb +0 -96
  71. data/spec/hexx/helpers/validations_spec.rb +0 -32
  72. data/spec/hexx/message_spec.rb +0 -83
  73. data/spec/hexx/name_spec.rb +0 -80
  74. data/spec/hexx/null_spec.rb +0 -152
  75. data/spec/hexx/service_invalid_spec.rb +0 -46
  76. data/spec/hexx/service_spec.rb +0 -89
  77. data/spec/support/initializers/focus.rb +0 -5
  78. data/spec/support/initializers/garbage_collection.rb +0 -11
  79. data/spec/support/initializers/i18n.rb +0 -3
  80. data/spec/support/initializers/random_order.rb +0 -4
  81. data/spec/support/initializers/rspec.rb +0 -5
  82. data/spec/support/matchers/methods.rb +0 -11
@@ -1,43 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Hexx
4
-
5
- # Declares the +attr_coerced+ private class method.
6
- #
7
- # @example
8
- #
9
- # require "hexx"
10
- # require_relative "attributes/string"
11
- #
12
- # class User
13
- # extend Hexx::Coercible
14
- # attr_coerced :name, type: ActiveSupport::Multibyte::Chars
15
- # end
16
- #
17
- # # This will coerce user name with mb chars:
18
- # user = User.new name: "Иоанн"
19
- # user.name
20
- # # => #<ActiveSupport::Multibyte::Chars @wrapped_string = "Иоанн">
21
- module Coercible
22
-
23
- private
24
-
25
- # @!method attr_coerced(*names, options)
26
- # Coerced the attribute(s) with given type.
27
- # @example (see Hexx::Coercible)
28
- # @param [Array<Symbol, String>] names The list of attributes to be coerced.
29
- # @param [Hash] options The coercion options.
30
- # @option options [Class] :type The class for coercion.
31
- def attr_coerced(*names, type:)
32
- names.flatten.each { |name| coercion.add self, name, type }
33
- end
34
-
35
- # @api hide
36
- # The method returns a coercion creator for PORO object only.
37
- # To be reloaded for ActiveRecord models
38
- # @return [Class] attribute coercion (Hexx::Creators::Coercion by default)
39
- def coercion
40
- Hexx::Creators::Coercion
41
- end
42
- end
43
- end
@@ -1,101 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Hexx
4
-
5
- # Contains methods to declare and inject module dependencies.
6
- #
7
- # Allows to provide DJ framework for the gem.
8
- #
9
- # @example
10
- # # Declare the dependencies for the gem root module
11
- #
12
- # # lib/my_gem.rb
13
- # module MyGem
14
- # extend Hexx::Configurable
15
- # self.depends_on :get_item, :add_item
16
- # self.depends_on :delete_item, default: DeleteItem
17
- # end
18
- #
19
- # # Inject dependencies (as a constant or its name)
20
- #
21
- # # config/my_gem.rb
22
- # MyGem.configure do |config|
23
- # config.get_item = AnotherGem::Services::Get
24
- # config.add_item
25
- # end
26
- #
27
- # # Use dependency in the module code (models, services, etc.)
28
- # # When the dependency hasn't been set, fails with +NotImplementedError+
29
- #
30
- # MyGem.get_item # => AnotherGem::Services::Get
31
- # MyGem.get_item # => DeleteItem
32
- # MyGem.add_item # fails with a NotImplementedError
33
- module Configurable
34
-
35
- # Yields a block and gives it self
36
- #
37
- # @example
38
- # module MyGem
39
- # extend Hexx::Configurable
40
- # end
41
- #
42
- # MyGem.configure do |config|
43
- # c # => MyGem
44
- # end
45
- #
46
- # @yield The block.
47
- # @yieldparam [Hexx::Configurable] +self+.
48
- def configure
49
- yield(self)
50
- end
51
-
52
- # @!method depends_on(*names, options)
53
- # Declares a dependency getter and setter.
54
- #
55
- # @example
56
- # module MyGem
57
- # extend Hexx::Configurable
58
- # self.depends_on :some_class
59
- # end
60
- #
61
- # MyGem.some_class = String
62
- # # => "String"
63
- # MyGem.some_class # => String
64
- #
65
- # MyGem.some_class = "String"
66
- # # => "String"
67
- # MyGem.some_class # => String
68
- #
69
- # MyGem.some_class = :String
70
- # # => "String"
71
- # MyGem.some_class # => String
72
- #
73
- # @example Dependencies can be declared by a plain list of names
74
- # module MyGem
75
- # extend Hexx::Configurable
76
- # self.depends_on :some_class, "another_class"
77
- # end
78
- #
79
- # @example Dependencies can be declared by an array of names
80
- # module MyGem
81
- # extend Hexx::Configurable
82
- # self.depends_on %w(some_class another_class)
83
- # end
84
- #
85
- # @example A dependency can have default implementation
86
- # module MyGem
87
- # extend Hexx::Configurable
88
- # self.depends_on :item, default: Item
89
- # end
90
- #
91
- # @param [Array<String, Symbol>] names The list of names for dependencies.
92
- # @param [Hash] options The list of options for dependency declaration.
93
- # @option options [Module, nil] :default (nil) The default implementation
94
- # for the dependency.
95
- def depends_on(*names, default: nil)
96
- names.flatten.each do |name|
97
- Creators::ModuleDependency.add self, name, default
98
- end
99
- end
100
- end
101
- end
@@ -1,103 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Hexx
4
-
5
- # @api hide
6
- # The module contains classes that adds specific attributes
7
- # to given classes or modules.
8
- module Creators
9
-
10
- # @api hide
11
- # @abstract
12
- # The base class for attribute injection.
13
- #
14
- # The objects of the class validates its parameters and adds
15
- # attribute's getter and setter into the target class or module.
16
- class Base < Struct.new(:target, :name)
17
-
18
- # @api hide
19
- # @!method add(target, name)
20
- # Injects an attribute to the target class.
21
- #
22
- # @param [Module] target The class or module to inject the attribute to.
23
- # @param [String, Symbol] name The name of the attribute.
24
- # @raise (see Hexx::Creators::Base#validate)
25
- # @return [Hexx::Creators::Base] the base class object.
26
- def self.add(*args)
27
- new(*args).validate.add_getter.add_setter
28
- end
29
-
30
- # @api hide
31
- # @!attribute target
32
- # The class to inject the attribute to
33
- # @return [Class] the target for the injection
34
-
35
- # @api hide
36
- # @!attribute name
37
- # The name of the attribute to be created in a target class
38
- # @return [Class] the name of the attribute
39
-
40
- # @api hide
41
- # Validates parameters of the dependency declaration.
42
- #
43
- # @raise (see Hexx::Creators::Base#check_target)
44
- # @raise (see Hexx::Creators::Base#check_name_type)
45
- # @raise (see Hexx::Creators::Base#check_name_value)
46
- # @return [Hexx::Creators::Base] +self+
47
- def validate
48
- check_target
49
- check_name_type
50
- check_name_value
51
- self
52
- end
53
-
54
- # @api hide
55
- # Adds the parameter getter to the +target+ instance
56
- # @return [Hexx::Creators::Base] +self+
57
- def add_getter
58
- target.class_eval getter
59
- self
60
- end
61
-
62
- # @api hide
63
- # Adds the parameter setter to the +target+ instance
64
- # @return [Hexx::Creators::Base] +self+
65
- def add_setter
66
- target.class_eval setter
67
- self
68
- end
69
-
70
- private
71
-
72
- # @abstract
73
- def getter
74
- end
75
-
76
- # @abstract
77
- def setter
78
- end
79
-
80
- # @api hide
81
- # @raise [TypeError] if a target to add the instance parameter to
82
- # is not a class.
83
- def check_target
84
- return if target.is_a? Class
85
- fail TypeError.new "#{ target.inspect } is not a class"
86
- end
87
-
88
- # @api hide
89
- # @raise [TypeError] if the attribute name is neither a string nor symbol.
90
- def check_name_type
91
- return if name.is_a?(String) || name.is_a?(Symbol)
92
- fail TypeError.new "#{ name.inspect } is neither string nor symbol"
93
- end
94
-
95
- # @api hide
96
- # @raise [AttributeError] it the name is blank.
97
- def check_name_value
98
- return unless name.to_s == ""
99
- fail ArgumentError.new "Dependency should have a name"
100
- end
101
- end
102
- end
103
- end
@@ -1,82 +0,0 @@
1
- # encoding: utf-8
2
- require_relative "base"
3
-
4
- module Hexx
5
- module Creators
6
-
7
- # @api hide
8
- # Coerces class attribute getter and setter with given type.
9
- #
10
- # @example
11
- # Coercion.add MyClass, :name, Multibyte::Chars
12
- # object = MyClass.new
13
- #
14
- # object.name = "Ivo"
15
- # object.name
16
- # # => #<Multibyte::Chars @wrapped_string="Ivo" >
17
- class Coercion < Base
18
-
19
- # @api hide
20
- # @!scope class
21
- # @!method add(target, name, type)
22
- # Reloads the Base class initializer by adding the type of the attribute
23
- # to coerce with.
24
- #
25
- # @example (see Hexx::Creators::Coercion)
26
- # @param (see Hexx::Creators::Base.add)
27
- # @param [Module] type The type of the attribute.
28
- # @raise (see Hexx::Creators::Coercion#validate)
29
- # @return [Hexx::Creators::Coercion] the coercion object.
30
- def initialize(target, name, type)
31
- super target, name
32
- @type = type
33
- end
34
-
35
- # @!attribute type
36
- # The type to coerce the attribute with
37
- # @return [Class] the type of the attribute
38
- attr_accessor :type
39
-
40
- # @api hide
41
- # Validates parameters of the coercion declaration.
42
- #
43
- # Adds validation of the coercion type to the
44
- # {Hexx::Helper::Base#validate}.
45
- #
46
- # @raise (see Hexx::Creators::Base.validate)
47
- # @raise (see Hexx::Creators::Coercion#check_type)
48
- # @return [Hexx::Creators::Coercion] +self+
49
- def validate
50
- check_type
51
- super
52
- end
53
-
54
- private
55
-
56
- # @api hide
57
- # The definition of the coerced attribute getter.
58
- # To be reloaded for ActiveRecord models.
59
- def getter
60
- "def #{ name }=(value);
61
- @#{ name } = #{ type.name }.new(value);
62
- end"
63
- end
64
-
65
- # @api hide
66
- # The definition of the coerced attribute setter.
67
- # To be reloaded for ActiveRecord models.
68
- def setter
69
- "def #{ name };
70
- #{ type.name }.new(@#{ name });
71
- end"
72
- end
73
-
74
- # @api hide
75
- # @raise [TypeError] if type is not a class
76
- def check_type
77
- return if type.is_a? Class
78
- fail TypeError.new "#{ type.inspect } is not a class"
79
- end
80
- end
81
- end
82
- end
@@ -1,87 +0,0 @@
1
- # encoding: utf-8
2
- require_relative "base"
3
-
4
- module Hexx
5
- module Creators
6
-
7
- # @api hide
8
- # @abstract
9
- # The base class for both instance and module dependencies.
10
- class Dependency < Base
11
-
12
- # @api hide
13
- # @!scope class
14
- # @!method add(target, name, default)
15
- # Reloads the Base class initializer by adding the default implementation
16
- # for the dependency.
17
- #
18
- # @param (see Hexx::Creators::Base)
19
- # @param [Module] default The default implementation for the dependency.
20
- # @raise (see Hexx::Creators::Dependency#validate)
21
- # @return [Hexx::Creators::Dependency] the dependency object.
22
- def initialize(target, name, default)
23
- super target, name
24
- @default = default
25
- end
26
-
27
- # @!attribute default
28
- # The default implementation for the dependency
29
- # @return [Module] the default implementation
30
- attr_accessor :default
31
-
32
- # @api hide
33
- # Validates parameters for the dependency declaration.
34
- #
35
- # Adds validation of the dependency default implementation to the
36
- # {Hexx::Helper::Base#validate}.
37
- #
38
- # @raise (see Hexx::Creators::Base#validate)
39
- # @raise (see Hexx::Creators::Dependency#check_default)
40
- # @return [Hexx::Creators::Dependency] +self+
41
- def validate
42
- check_default
43
- super
44
- end
45
-
46
- private
47
-
48
- # @api hide
49
- # The dependency getter
50
- def getter
51
- "def #{ name };
52
- @#{ name } ||= #{ default_name };
53
- return @#{ name } if @#{ name };
54
- fail NotImplementedError
55
- .new \"DI: #{ target.name }##{ name } not implemented\";
56
- end"
57
- end
58
-
59
- # @api hide
60
- # The dependency setter
61
- def setter
62
- "def #{ name }=(value);
63
- if value.nil? || value.is_a?(Module);
64
- @#{ name } = value;
65
- #{ name };
66
- else;
67
- fail TypeError.new \"DI: \#{ value.inspect } is not a module\";
68
- end;
69
- end"
70
- end
71
-
72
- # @api hide
73
- # @raise [TypeError] if the default implementation is neither a class,
74
- # nor module
75
- def check_default
76
- return if default.nil? || default.is_a?(Module)
77
- fail TypeError.new "#{ default.inspect } is neither a class nor module"
78
- end
79
-
80
- # @api hide
81
- # Returns the name of the default implementation of the dependency.
82
- def default_name
83
- @default_name ||= default ? default.name : "nil"
84
- end
85
- end
86
- end
87
- end
@@ -1,57 +0,0 @@
1
- # encoding: utf-8
2
- require_relative "dependency"
3
-
4
- module Hexx
5
- module Creators
6
-
7
- # @api hide
8
- # Module dependency constructor.
9
- #
10
- # Adds the dependency to selected module.
11
- #
12
- # @example
13
- # ModuleDependency.add(MyModule, :some_module, DefaultImplementation)
14
- #
15
- # MyModule.some_module
16
- # # => DefaultImplementation
17
- #
18
- # MyModule.some_module = AnotherImplementation
19
- # # => AnotherImplementation
20
- #
21
- # MyModule.some_module = 1
22
- # # fails with #<TypeError @message="1 is not a module" >
23
- class ModuleDependency < Dependency
24
-
25
- # @api hide
26
- # Adds the dependency to given module
27
- # @example (see Hexx::Creators::ModuleDependency)
28
- # @param [Module] target The module to declare the dependency of.
29
- # @param [String, Symbol] name The name of the dependency.
30
- # @param [Module] default The default implementation of the dependency.
31
-
32
- # @api hide
33
- # Adds the module dependency getter
34
- # @return [ModuleDependency] +self+.
35
- def add_getter
36
- target.instance_eval getter
37
- self
38
- end
39
-
40
- # @api hide
41
- # Adds the module dependency setter
42
- # @return [ModuleDependency] +self+.
43
- def add_setter
44
- target.instance_eval setter
45
- self
46
- end
47
-
48
- private
49
-
50
- # @raise [TypeError] if a target to add the dependency is not a module.
51
- def check_target
52
- return if target.is_a? Module
53
- fail TypeError.new "#{ target.inspect } is not a module"
54
- end
55
- end
56
- end
57
- end