livery 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9346fcf616e20f17e894e0067d5608c37f6e616ed4d9e32cc493cc5b389e10e3
4
- data.tar.gz: 22d43934954cc145d5c0b3feec6c8513790de32b58b43f55cca8188b850f3b5b
3
+ metadata.gz: a4376e5c7d1405dadf06cadaec945198934e89cfc14c4174b733d090997e4642
4
+ data.tar.gz: b8e5851416f68c68db929caac0a37317c0aadbe42b3293f6d8f806e6970104b3
5
5
  SHA512:
6
- metadata.gz: ae804d9cbed9af03626966850e162f31e164ba7f011d6b6b2e71d2351ad8c78593a115c9c4f4926a6ecda92faff360065a0fb2e889c451d19644fc647383a228
7
- data.tar.gz: 96ceffc94eaeb28529663c5e2a17ce58ff8bfe9fdbb4af0ade4bbd608fb120c7fd019a5b6e7ae99e11ec59a8e818f8507dd8394284a1b6cba5fa8c174d9149fa
6
+ metadata.gz: 8bf641aecf3d12f80bddcc64d70f6713ec611aa104b4b0517169bc5fafc2ce691671c79b5ee571ebe38dd844301f3294607503e4dba0bd3f7e391b1d45d77253
7
+ data.tar.gz: e957e505db44c852a157d1fadb5722aeb76285cdb6e23fa21e0fb1ae01e3b186ec2b3b550cab3093e05e458f876a48a70b749f239ee6f9cbaaaac6f6f3c0b4b8
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.6.3
5
+ - 2.5.5
6
+
7
+ gemfile:
8
+ - gemfiles/active_support_5.1.0.gemfile
9
+ - gemfiles/active_support_5.2.0.gemfile
10
+ - gemfiles/active_support_6.0.0.rc1.gemfile
data/Appraisals ADDED
@@ -0,0 +1,11 @@
1
+ active_support_versions = %w(
2
+ 5.1.0
3
+ 5.2.0
4
+ 6.0.0.rc1
5
+ )
6
+
7
+ active_support_versions.each do |version|
8
+ appraise "active_support_#{version}" do
9
+ gem "activesupport", "~> #{version}"
10
+ end
11
+ end
data/Gemfile CHANGED
@@ -2,5 +2,4 @@ source "https://rubygems.org"
2
2
 
3
3
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
- # Specify your gem's dependencies in livery.gemspec
6
5
  gemspec
data/Gemfile.lock CHANGED
@@ -1,19 +1,22 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- livery (0.1.0)
5
- activesupport (~> 6.0.0.rc1)
4
+ livery (0.2.0)
5
+ activesupport (>= 5.1)
6
6
  i18n (>= 0.7, < 2)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activesupport (6.0.0.rc1)
11
+ activesupport (5.2.3)
12
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
13
  i18n (>= 0.7, < 2)
14
14
  minitest (~> 5.1)
15
15
  tzinfo (~> 1.1)
16
- zeitwerk (~> 2.1, >= 2.1.4)
16
+ appraisal (2.2.0)
17
+ bundler
18
+ rake
19
+ thor (>= 0.14.0)
17
20
  concurrent-ruby (1.1.5)
18
21
  diff-lcs (1.3)
19
22
  i18n (1.6.0)
@@ -33,19 +36,20 @@ GEM
33
36
  diff-lcs (>= 1.2.0, < 2.0)
34
37
  rspec-support (~> 3.8.0)
35
38
  rspec-support (3.8.0)
39
+ thor (0.20.3)
36
40
  thread_safe (0.3.6)
37
41
  tzinfo (1.2.5)
38
42
  thread_safe (~> 0.1)
39
- zeitwerk (2.1.6)
40
43
 
41
44
  PLATFORMS
42
45
  ruby
43
46
 
44
47
  DEPENDENCIES
48
+ appraisal
45
49
  bundler (~> 1.16)
46
50
  livery!
47
51
  rake (~> 10.0)
48
52
  rspec (~> 3.0)
49
53
 
50
54
  BUNDLED WITH
51
- 1.16.3
55
+ 1.17.2
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_RETRY: "1"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activesupport", "~> 5.1.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ livery (0.1.0)
5
+ activesupport (>= 5.1)
6
+ i18n (>= 0.7, < 2)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (5.1.7)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ appraisal (2.2.0)
17
+ bundler
18
+ rake
19
+ thor (>= 0.14.0)
20
+ concurrent-ruby (1.1.5)
21
+ diff-lcs (1.3)
22
+ i18n (1.6.0)
23
+ concurrent-ruby (~> 1.0)
24
+ minitest (5.11.3)
25
+ rake (10.5.0)
26
+ rspec (3.8.0)
27
+ rspec-core (~> 3.8.0)
28
+ rspec-expectations (~> 3.8.0)
29
+ rspec-mocks (~> 3.8.0)
30
+ rspec-core (3.8.2)
31
+ rspec-support (~> 3.8.0)
32
+ rspec-expectations (3.8.4)
33
+ diff-lcs (>= 1.2.0, < 2.0)
34
+ rspec-support (~> 3.8.0)
35
+ rspec-mocks (3.8.1)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.8.0)
38
+ rspec-support (3.8.2)
39
+ thor (0.20.3)
40
+ thread_safe (0.3.6)
41
+ tzinfo (1.2.5)
42
+ thread_safe (~> 0.1)
43
+
44
+ PLATFORMS
45
+ ruby
46
+
47
+ DEPENDENCIES
48
+ activesupport (~> 5.1.0)
49
+ appraisal
50
+ bundler (~> 1.16)
51
+ livery!
52
+ rake (~> 10.0)
53
+ rspec (~> 3.0)
54
+
55
+ BUNDLED WITH
56
+ 1.17.2
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activesupport", "~> 5.2.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,56 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ livery (0.1.0)
5
+ activesupport (>= 5.1)
6
+ i18n (>= 0.7, < 2)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (5.2.3)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ appraisal (2.2.0)
17
+ bundler
18
+ rake
19
+ thor (>= 0.14.0)
20
+ concurrent-ruby (1.1.5)
21
+ diff-lcs (1.3)
22
+ i18n (1.6.0)
23
+ concurrent-ruby (~> 1.0)
24
+ minitest (5.11.3)
25
+ rake (10.5.0)
26
+ rspec (3.8.0)
27
+ rspec-core (~> 3.8.0)
28
+ rspec-expectations (~> 3.8.0)
29
+ rspec-mocks (~> 3.8.0)
30
+ rspec-core (3.8.2)
31
+ rspec-support (~> 3.8.0)
32
+ rspec-expectations (3.8.4)
33
+ diff-lcs (>= 1.2.0, < 2.0)
34
+ rspec-support (~> 3.8.0)
35
+ rspec-mocks (3.8.1)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.8.0)
38
+ rspec-support (3.8.2)
39
+ thor (0.20.3)
40
+ thread_safe (0.3.6)
41
+ tzinfo (1.2.5)
42
+ thread_safe (~> 0.1)
43
+
44
+ PLATFORMS
45
+ ruby
46
+
47
+ DEPENDENCIES
48
+ activesupport (~> 5.2.0)
49
+ appraisal
50
+ bundler (~> 1.16)
51
+ livery!
52
+ rake (~> 10.0)
53
+ rspec (~> 3.0)
54
+
55
+ BUNDLED WITH
56
+ 1.17.2
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "activesupport", "~> 6.0.0.rc1"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,58 @@
1
+ PATH
2
+ remote: ..
3
+ specs:
4
+ livery (0.1.0)
5
+ activesupport (>= 5.1)
6
+ i18n (>= 0.7, < 2)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (6.0.0.rc1)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ zeitwerk (~> 2.1, >= 2.1.4)
17
+ appraisal (2.2.0)
18
+ bundler
19
+ rake
20
+ thor (>= 0.14.0)
21
+ concurrent-ruby (1.1.5)
22
+ diff-lcs (1.3)
23
+ i18n (1.6.0)
24
+ concurrent-ruby (~> 1.0)
25
+ minitest (5.11.3)
26
+ rake (10.5.0)
27
+ rspec (3.8.0)
28
+ rspec-core (~> 3.8.0)
29
+ rspec-expectations (~> 3.8.0)
30
+ rspec-mocks (~> 3.8.0)
31
+ rspec-core (3.8.2)
32
+ rspec-support (~> 3.8.0)
33
+ rspec-expectations (3.8.4)
34
+ diff-lcs (>= 1.2.0, < 2.0)
35
+ rspec-support (~> 3.8.0)
36
+ rspec-mocks (3.8.1)
37
+ diff-lcs (>= 1.2.0, < 2.0)
38
+ rspec-support (~> 3.8.0)
39
+ rspec-support (3.8.2)
40
+ thor (0.20.3)
41
+ thread_safe (0.3.6)
42
+ tzinfo (1.2.5)
43
+ thread_safe (~> 0.1)
44
+ zeitwerk (2.1.9)
45
+
46
+ PLATFORMS
47
+ ruby
48
+
49
+ DEPENDENCIES
50
+ activesupport (~> 6.0.0.rc1)
51
+ appraisal
52
+ bundler (~> 1.16)
53
+ livery!
54
+ rake (~> 10.0)
55
+ rspec (~> 3.0)
56
+
57
+ BUNDLED WITH
58
+ 1.17.2
@@ -1,8 +1,33 @@
1
1
  module Livery
2
2
  module Controller
3
- extend ActiveSupport::Concern
3
+ def self.included(base)
4
+ base.extend(ClassMethods)
5
+ end
4
6
 
5
7
  module ClassMethods
8
+ # Overrides +AbstractController#view_assigns+ to return
9
+ # presenters set with the +present+ method.
10
+ #
11
+ # When you call this method in a controller class, instance
12
+ # variables set in actions will no longer be shared with views.
13
+ #
14
+ # ==== Examples
15
+ #
16
+ # # app/controllers/posts_controller.rb
17
+ # class PostController < ApplicationController
18
+ # include Livery::Controler
19
+ # use_presenters!
20
+ #
21
+ # def show
22
+ # @post = Post.find(params[:id])
23
+ # present(post_presenter: @post)
24
+ # end
25
+ # end
26
+ #
27
+ # In this example, the instance variable +@post+ will not be
28
+ # shared with the view. Instead, the +present+ method will
29
+ # create a presenter-wrapped object available as
30
+ # +@post_presenter+ in the view.
6
31
  def use_presenters!
7
32
  define_method "view_assigns" do
8
33
  @_presenters || {}
@@ -10,6 +35,81 @@ module Livery
10
35
  end
11
36
  end
12
37
 
38
+ # Pass presenters to the view. Must be used with the class method
39
+ # +use_presenters!+.
40
+ #
41
+ # +hsh+ A hash whose keys define the names of variables used in
42
+ # the view, and values the objects that will be presented. Each
43
+ # object must either be a presenter, or have a corresponding
44
+ # presenter class; e.g., a +Post+ model should have a
45
+ # +PostPresenter+ class. If an enumerable is passed, each object
46
+ # within is mapped over. An exception is raised otherwise.
47
+ #
48
+ # ==== Examples
49
+ #
50
+ # +present+ will wrap non-presenter objects with their presenter
51
+ # classes. Here, the +Post+ object is wrapped with a
52
+ # +PostPresenter+:
53
+ #
54
+ # # app/controllers/posts_controller.rb
55
+ # class PostsController < ApplicationController
56
+ # include Livery::Controller
57
+ # use_presenters!
58
+ #
59
+ # def show
60
+ # post = Post.find(params[:id])
61
+ #
62
+ # present(post: post)
63
+ # end
64
+ # end
65
+ #
66
+ # This is equivalent to (without using +use_presenters!+):
67
+ #
68
+ # # app/controllers/posts_controller.rb
69
+ # class PostsController < ApplicationController
70
+ # def show
71
+ # post = Post.find(params[:id])
72
+ #
73
+ # @post = PostPresenter.new(post)
74
+ # end
75
+ # end
76
+ #
77
+ # It can handle enumerables:
78
+ #
79
+ # # app/controllers/posts_controller.rb
80
+ # class PostsController < ApplicationController
81
+ # include Livery::Controller
82
+ # use_presenters!
83
+ #
84
+ # def index
85
+ # posts = Post.all
86
+ #
87
+ # # Equivalent to:
88
+ # # @posts = posts.map { |post| PostPresenter.new(post) }
89
+ # present(posts: posts)
90
+ # end
91
+ # end
92
+ #
93
+ # And presenter objects will not be re-wrapped:
94
+ #
95
+ # # app/controllers/posts_controller.rb
96
+ # class PostsController < ApplicationController
97
+ # include Livery::Controller
98
+ # use_presenters!
99
+ #
100
+ # def show
101
+ # post_presenter = PostPresenter.new(current_user.post)
102
+ #
103
+ # # Equivalent to:
104
+ # # @post = post_presenter
105
+ # present(post: post_presenter)
106
+ # end
107
+ # end
108
+ #
109
+ # Presenter classes are found via a simple naming convention; an
110
+ # object of some class +Model+ will be wrapped with a
111
+ # +ModelPresenter+. If a corresponding presenter class is not
112
+ # found, an error is raised.
13
113
  def present(hsh)
14
114
  @_presenters ||= {}
15
115
  hsh.each_with_object(@_presenters) do |(k, v), acc|
@@ -25,13 +25,15 @@ module Livery
25
25
  end
26
26
 
27
27
  def presenter_association(*names, source: nil, namespace: nil)
28
+ raise ArgumentError, '`source` must be a block' unless source.nil? || source.is_a?(Proc)
29
+
28
30
  names.each do |name|
29
31
  instance_variable_name = "@#{name}".to_sym
30
32
 
31
33
  define_method name do
32
34
  return instance_variable_get(instance_variable_name) if instance_variable_defined?(instance_variable_name)
33
35
 
34
- association_resource = source.present? ? @resource.instance_exec(&source) : @resource.public_send(name)
36
+ association_resource = source.nil? ? @resource.public_send(name) : @resource.instance_exec(&source)
35
37
 
36
38
  association_presenter = Presenter.to_presenter(association_resource, namespace: namespace)
37
39
 
@@ -42,7 +44,8 @@ module Livery
42
44
  end
43
45
 
44
46
  def presenterize(klass, namespace: nil)
45
- [namespace.presence, "#{klass}Presenter"].compact.join('::').constantize
47
+ presenter_klass_string = [namespace, "#{klass}Presenter"].compact.join('::')
48
+ ActiveSupport::Inflector.constantize(presenter_klass_string)
46
49
  end
47
50
 
48
51
  def resource(sym)
@@ -72,11 +75,11 @@ module Livery
72
75
  end
73
76
 
74
77
  def t(*args)
75
- I18n.t(self.class.name.underscore + args.shift, *args)
78
+ I18n.t(ActiveSupport::Inflector.underscore(self.class.name) + args.shift, *args)
76
79
  end
77
80
 
78
81
  def t!(*args)
79
- I18n.t!(self.class.name.underscore + args.shift, *args)
82
+ I18n.t!(ActiveSupport::Inflector.underscore(self.class.name) + args.shift, *args)
80
83
  end
81
84
 
82
85
  def to_model
@@ -4,7 +4,7 @@ module Livery
4
4
  def presenter_receives_instance_doubles!
5
5
  before(:each) do
6
6
  allow(Livery::Presenter).to receive(:to_presenter_single) do |obj, namespace: nil|
7
- next nil unless obj.present?
7
+ next nil unless obj
8
8
 
9
9
  klass = obj.instance_variable_get(:@doubled_module).target
10
10
  Livery::Presenter.presenterize(klass, namespace: namespace).new(obj)
@@ -1,3 +1,3 @@
1
1
  module Livery
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
data/lib/livery.rb CHANGED
@@ -1,4 +1,5 @@
1
- require "active_support/all"
1
+ require "active_support/i18n"
2
+ require "active_support/inflector"
2
3
 
3
4
  require "livery/version"
4
5
  require "livery/presenter"
data/livery.gemspec CHANGED
@@ -28,7 +28,8 @@ Gem::Specification.new do |spec|
28
28
  spec.add_development_dependency "bundler", "~> 1.16"
29
29
  spec.add_development_dependency "rake", "~> 10.0"
30
30
  spec.add_development_dependency "rspec", "~> 3.0"
31
+ spec.add_development_dependency "appraisal"
31
32
 
32
- spec.add_dependency "activesupport", "~> 6.0.0.rc1"
33
+ spec.add_dependency "activesupport", ">= 5.1"
33
34
  spec.add_dependency "i18n", ">= 0.7", "< 2"
34
35
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: livery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Hoy
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-06-28 00:00:00.000000000 Z
13
+ date: 2019-07-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -54,20 +54,34 @@ dependencies:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
56
  version: '3.0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: appraisal
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
57
71
  - !ruby/object:Gem::Dependency
58
72
  name: activesupport
59
73
  requirement: !ruby/object:Gem::Requirement
60
74
  requirements:
61
- - - "~>"
75
+ - - ">="
62
76
  - !ruby/object:Gem::Version
63
- version: 6.0.0.rc1
77
+ version: '5.1'
64
78
  type: :runtime
65
79
  prerelease: false
66
80
  version_requirements: !ruby/object:Gem::Requirement
67
81
  requirements:
68
- - - "~>"
82
+ - - ">="
69
83
  - !ruby/object:Gem::Version
70
- version: 6.0.0.rc1
84
+ version: '5.1'
71
85
  - !ruby/object:Gem::Dependency
72
86
  name: i18n
73
87
  requirement: !ruby/object:Gem::Requirement
@@ -97,6 +111,8 @@ extra_rdoc_files: []
97
111
  files:
98
112
  - ".gitignore"
99
113
  - ".rspec"
114
+ - ".travis.yml"
115
+ - Appraisals
100
116
  - Gemfile
101
117
  - Gemfile.lock
102
118
  - LICENSE
@@ -106,6 +122,13 @@ files:
106
122
  - bin/rake
107
123
  - bin/rspec
108
124
  - bin/setup
125
+ - gemfiles/.bundle/config
126
+ - gemfiles/active_support_5.1.0.gemfile
127
+ - gemfiles/active_support_5.1.0.gemfile.lock
128
+ - gemfiles/active_support_5.2.0.gemfile
129
+ - gemfiles/active_support_5.2.0.gemfile.lock
130
+ - gemfiles/active_support_6.0.0.rc1.gemfile
131
+ - gemfiles/active_support_6.0.0.rc1.gemfile.lock
109
132
  - lib/livery.rb
110
133
  - lib/livery/controller.rb
111
134
  - lib/livery/presenter.rb
@@ -131,7 +154,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
154
  - !ruby/object:Gem::Version
132
155
  version: '0'
133
156
  requirements: []
134
- rubygems_version: 3.0.3
157
+ rubyforge_project:
158
+ rubygems_version: 2.7.3
135
159
  signing_key:
136
160
  specification_version: 4
137
161
  summary: A library for presenter objects for use in Rails.