sharing_tags 0.0.9 → 0.0.10

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +94 -0
  3. data/.travis.yml +1 -0
  4. data/Gemfile +2 -1
  5. data/Guardfile +21 -11
  6. data/README.md +8 -1
  7. data/Rakefile +16 -0
  8. data/Todo.md +4 -1
  9. data/app/assets/images/sharing_tags/icons/line.svg +9 -9
  10. data/app/assets/javascripts/sharing_tags.js +10 -0
  11. data/app/assets/javascripts/sharing_tags/init.js.coffee.erb +5 -4
  12. data/app/assets/javascripts/sharing_tags/links.js.coffee +9 -7
  13. data/app/assets/javascripts/sharing_tags/share.js.coffee +82 -62
  14. data/app/assets/javascripts/sharing_tags/share/callback.js.coffee +14 -0
  15. data/app/assets/javascripts/sharing_tags/share/facebook.js.coffee +82 -0
  16. data/app/assets/stylesheets/sharing_tags/wave_animation.css.sass +33 -0
  17. data/app/views/sharing_tags/meta/_open_graphs.html.slim +1 -1
  18. data/app/views/sharing_tags/meta/_twitter_card.html.slim +12 -9
  19. data/circle.yml +9 -0
  20. data/lib/generators/sharing_tags/install/install_generator.rb +12 -14
  21. data/lib/generators/sharing_tags/install/templates/initializer.rb +3 -0
  22. data/lib/sharing_tags.rb +0 -5
  23. data/lib/sharing_tags/action_controller/filters.rb +13 -10
  24. data/lib/sharing_tags/action_controller/helpers.rb +11 -9
  25. data/lib/sharing_tags/action_view/asset_helper.rb +39 -35
  26. data/lib/sharing_tags/action_view/button_helper.rb +62 -53
  27. data/lib/sharing_tags/action_view/meta_helper.rb +11 -8
  28. data/lib/sharing_tags/config.rb +3 -4
  29. data/lib/sharing_tags/configuration.rb +17 -18
  30. data/lib/sharing_tags/context.rb +11 -14
  31. data/lib/sharing_tags/engine.rb +11 -0
  32. data/lib/sharing_tags/network.rb +64 -30
  33. data/lib/sharing_tags/network/facebook.rb +11 -8
  34. data/lib/sharing_tags/railtie.rb +6 -9
  35. data/lib/sharing_tags/version.rb +1 -1
  36. data/sharing_tags.gemspec +1 -0
  37. data/spec/controllers/main_controller_spec.rb +2 -2
  38. data/spec/dummy/app/helpers/application_helper.rb +1 -0
  39. data/spec/generators/install_generator_spec.rb +8 -6
  40. data/spec/helpers/asset_helper_spec.rb +3 -2
  41. data/spec/helpers/button_helper_spec.rb +70 -76
  42. data/spec/helpers/meta_tags_helper_spec.rb +1 -2
  43. data/spec/javascripts/fixtures/facebook.json +3 -1
  44. data/spec/javascripts/sharing_tags/share/{facebook_share_spec.coffee → facebook_spec.coffee} +73 -12
  45. data/spec/javascripts/sharing_tags/share/vkontakte_spec.coffee +29 -0
  46. data/spec/javascripts/sharing_tags/share_spec.coffee +193 -0
  47. data/spec/javascripts/sharing_tags/sharing_tags_spec.coffee +9 -14
  48. data/spec/models/configuration_spec.rb +12 -14
  49. data/spec/models/network_spec.rb +1 -4
  50. data/spec/models/running_in_context_spec.rb +19 -6
  51. data/spec/spec_helper.rb +1 -2
  52. data/spec/support/generator_support.rb +1 -3
  53. data/spec/teaspoon_env.rb +39 -39
  54. data/spec/views/meta_tags/facebook_meta_tags_erb_spec.rb +16 -17
  55. data/spec/views/meta_tags/meta_tags_erb_spec.rb +5 -7
  56. metadata +29 -13
  57. data/app/assets/javascripts/sharing_tags.js.coffee +0 -9
  58. data/app/assets/javascripts/sharing_tags/share/base.js.coffee +0 -38
  59. data/app/assets/javascripts/sharing_tags/share/facebook.coffee +0 -57
  60. data/app/assets/javascripts/sharing_tags/share/vkontakte.js.coffee +0 -13
  61. data/bin/rspec +0 -16
  62. data/spec/javascripts/sharing_tags/share/vkontakte_share_spec.coffee +0 -31
@@ -1,10 +1,13 @@
1
- module SharingTags::ActionView::MetaHelper
1
+ module SharingTags
2
+ module ActionView
3
+ module MetaHelper
4
+ def sharing_tags
5
+ SharingTags.config.within_context_params(self)
6
+ end
2
7
 
3
- def sharing_tags
4
- SharingTags.config.within_context_params(self)
5
- end
6
-
7
- def render_sharing_tags
8
- render template: "sharing_tags/meta_tags.html.slim"
9
- end
8
+ def render_sharing_tags
9
+ render template: "sharing_tags/meta_tags.html.slim"
10
+ end
11
+ end
12
+ end
10
13
  end
@@ -2,10 +2,9 @@ require "hashie/mash"
2
2
 
3
3
  module SharingTags
4
4
  class Config < ::Hashie::Mash
5
+ # TODO: initialize default param as Config.new
5
6
 
6
- # todo: initialize default param as Config.new
7
-
8
- # note: temporary code for working construction sharing_tags.switch_context_to
7
+ # NOTE: temporary code for working construction sharing_tags.switch_context_to
9
8
  def switch_context_to(name, *attrs)
10
9
  Rails.logger.debug "SharingTags: switch context from #{SharingTags.config.current_context.name} to #{name}"
11
10
  SharingTags.config.switch_context(name, *attrs)
@@ -17,7 +16,7 @@ module SharingTags
17
16
  lists.each do |divide_key|
18
17
  second_part[divide_key] =
19
18
  if self.key?(divide_key)
20
- self.delete(divide_key)
19
+ delete(divide_key)
21
20
  else
22
21
  self.class.new
23
22
  end
@@ -1,32 +1,36 @@
1
1
  module SharingTags
2
2
  class Configuration
3
-
4
- NETWORKS = %i{ google facebook twitter }
3
+ NETWORKS = %i( google facebook twitter )
5
4
 
6
5
  attr_accessor :running_context
6
+ attr_reader :default_context
7
7
 
8
8
  def initialize
9
9
  clear!
10
10
  end
11
11
 
12
12
  def context(name, &block)
13
- raise "please define context block params" unless block_given?
13
+ fail "please define context block params" unless block_given?
14
14
  (@contexts[name] ||= Context.new(name, self)).instance_exec(&block)
15
15
  end
16
16
 
17
- def switch_context(name = nil, *args)
17
+ def switch_context(name = nil, *args, &block)
18
18
  clean_params!
19
+ prev_context = current_context
20
+ prev_context_params = @current_context_params
21
+
19
22
  @current_context_params = args
20
- @prev_context = current_context
21
-
22
- @current_context =
23
- if name
24
- @contexts[name]
25
- else
26
- default_context
27
- end
23
+ @current_context = name && @contexts[name] || default_context
24
+ return unless block_given?
25
+
26
+ result = block.call
27
+
28
+ @current_context = prev_context
29
+ @current_context_params = prev_context_params
30
+
31
+ result
28
32
  end
29
- alias switch_context_to switch_context
33
+ alias_method :switch_context_to, :switch_context
30
34
 
31
35
  def clear!
32
36
  @contexts = {}
@@ -69,10 +73,5 @@ module SharingTags
69
73
  def method_missing(method_name, *arguments, &block)
70
74
  current_context.send(method_name, *arguments, &block)
71
75
  end
72
-
73
- def default_context
74
- @default_context
75
- end
76
-
77
76
  end
78
77
  end
@@ -1,6 +1,5 @@
1
1
  module SharingTags
2
2
  class Context
3
-
4
3
  attr_reader :name
5
4
  attr_reader :configuraton
6
5
 
@@ -9,8 +8,8 @@ module SharingTags
9
8
  @networks = {}
10
9
  @configuraton = configuraton
11
10
 
12
- Network.lists.each do |name|
13
- self.send(name)
11
+ Network.lists.each do |network_name|
12
+ send(network_name)
14
13
  end
15
14
  end
16
15
 
@@ -19,43 +18,43 @@ module SharingTags
19
18
  end
20
19
 
21
20
  def twitter(&block)
22
- (@networks[:twitter] ||= Network.new(:twitter, self)).tap do |twitter|
21
+ (@networks[:twitter] ||= Network.new(:twitter, self)).tap do |twitter|
23
22
  twitter.instance_exec(&block) if block_given?
24
23
  end
25
24
  end
26
25
 
27
26
  def facebook(&block)
28
- (@networks[:facebook] ||= Network::Facebook.new(:facebook, self)).tap do |facebook|
27
+ (@networks[:facebook] ||= Network::Facebook.new(:facebook, self)).tap do |facebook|
29
28
  facebook.instance_exec(&block) if block_given?
30
29
  end
31
30
  end
32
31
 
33
32
  def google(&block)
34
- (@networks[:google] ||= Network.new(:google, self)).tap do |google|
33
+ (@networks[:google] ||= Network.new(:google, self)).tap do |google|
35
34
  google.instance_exec(&block) if block_given?
36
35
  end
37
36
  end
38
37
 
39
38
  def vkontakte(&block)
40
- (@networks[:vkontakte] ||= Network.new(:vkontakte, self)).tap do |vkontakte|
39
+ (@networks[:vkontakte] ||= Network.new(:vkontakte, self)).tap do |vkontakte|
41
40
  vkontakte.instance_exec(&block) if block_given?
42
41
  end
43
42
  end
44
43
 
45
44
  def line(&block)
46
- (@networks[:line] ||= Network.new(:line, self)).tap do |line|
45
+ (@networks[:line] ||= Network.new(:line, self)).tap do |line|
47
46
  line.instance_exec(&block) if block_given?
48
47
  end
49
48
  end
50
49
 
51
50
  def odnoklassniki(&block)
52
- (@networks[:odnoklassniki] ||= Network.new(:odnoklassniki, self)).tap do |odnoklassniki|
51
+ (@networks[:odnoklassniki] ||= Network.new(:odnoklassniki, self)).tap do |odnoklassniki|
53
52
  odnoklassniki.instance_exec(&block) if block_given?
54
53
  end
55
54
  end
56
55
 
57
56
  def linkedin(&block)
58
- (@networks[:linkedin] ||= Network.new(:linkedin, self)).tap do |vkontakte|
57
+ (@networks[:linkedin] ||= Network.new(:linkedin, self)).tap do |vkontakte|
59
58
  vkontakte.instance_exec(&block) if block_given?
60
59
  end
61
60
  end
@@ -73,14 +72,13 @@ module SharingTags
73
72
  def fetch_params(context_args = nil, default_config_params = Config.new)
74
73
  default_context_params = fetch_default_context_params(context_args, default_config_params || Config.new)
75
74
 
76
- @networks.inject(Config.new) do |result, (name, network)|
75
+ @networks.each_with_object(Config.new) do |(name, network), result|
77
76
  param = (result[name] ||= Config.new)
78
77
 
79
78
  default_network_params = default_context_params[name]
80
79
  param.deep_update network.attributes_for(context_args, default_network_params)
81
80
 
82
81
  result[name] = param
83
- result
84
82
  end
85
83
  end
86
84
 
@@ -99,10 +97,9 @@ module SharingTags
99
97
 
100
98
  def method_missing(method_name, *arguments, &block)
101
99
  unless default_network.class.available_attributes.include?(method_name.to_sym)
102
- raise Network::Error.new("Error didn't find #{method_name} attribute in network")
100
+ fail Network::Error, "Error didn't find #{method_name} attribute in network"
103
101
  end
104
102
  default_network.send(method_name, *arguments, &block)
105
103
  end
106
-
107
104
  end
108
105
  end
@@ -2,5 +2,16 @@ module SharingTags
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace SharingTags
4
4
 
5
+ if Rails.env.development?
6
+ config.to_prepare do
7
+ require_dependency Rails.root.join('config', 'initializers', 'sharing_tags.rb').to_s
8
+ end
9
+
10
+ config.after_initialize do
11
+ # optional, without it will call `to_prepend` only when a file changes,
12
+ # not on every request
13
+ Rails.application.config.reload_classes_only_on_change = false
14
+ end
15
+ end
5
16
  end
6
17
  end
@@ -1,15 +1,38 @@
1
+ require 'uri'
2
+
1
3
  module SharingTags
2
4
  class Network
3
-
4
- # todo: add default values
5
+ # TODO: add default values
5
6
 
6
7
  class Error < StandardError
7
8
  end
8
9
 
10
+ class NetworkRunningContext
11
+ def initialize(network, context)
12
+ @network_name = network.name
13
+ @context = context
14
+ @context_name = @context.name
15
+ end
16
+
17
+ def network
18
+ @network_name
19
+ end
20
+
21
+ def context
22
+ @context_name
23
+ end
24
+
25
+ def method_missing(method_name, *arguments, &block)
26
+ return unless @context && @context.configuraton
27
+ @context.configuraton.running_context.send(method_name, *arguments, &block)
28
+ end
29
+ end
30
+
9
31
  NETWORKS = %i( facebook google twitter vkontakte odnoklassniki line linkedin )
10
32
 
11
- ATTRIBUTES = %i( share_url title description page_url share_url_params link_params
12
- image_url image digested_image digested_image_url )
33
+ ATTRIBUTES =
34
+ %i( share_url title description page_url share_url_params link_params
35
+ image_url image digested_image digested_image_url )
13
36
 
14
37
  attr_reader :name, :attributes
15
38
 
@@ -22,12 +45,12 @@ module SharingTags
22
45
  def initialize(name, context = nil)
23
46
  @name = name
24
47
  @context = context
48
+ @running_context = NetworkRunningContext.new(self, context)
25
49
  clear!
26
50
  end
27
51
 
28
52
  def clear!
29
53
  @attributes = {}
30
- @share_url_params = nil
31
54
  end
32
55
 
33
56
  def self.available_attributes
@@ -46,16 +69,16 @@ module SharingTags
46
69
  attributes[:description] = store_value(value, &block)
47
70
  end
48
71
 
49
- # def image_url(new_image = nil, size = nil, content_type = nil, options, &block)
72
+ # TODO: activate rubycop Metrics
73
+ # rubocop:disable Metrics/AbcSize
74
+ # image_url(new_image = nil, size = nil, content_type = nil, options, &block)
50
75
  def image_url(*arguments, &block)
51
76
  options = arguments.extract_options!
52
77
  new_image, size, content_type = arguments
53
78
 
54
- if options[:digested] == false && !block_given?
55
- block = proc { without_digest_asset_url(new_image) }
56
- end
79
+ block = proc { without_digest_asset_url(new_image) } if options[:digested] == false && block_given? == false
57
80
 
58
- # todo: add another class for storing image
81
+ # TODO: add another class for storing image
59
82
  attributes[:image] = store_value(new_image, &block)
60
83
 
61
84
  # add size and content type for block value
@@ -64,41 +87,42 @@ module SharingTags
64
87
  attributes[:image_size] = store_value(size.split("x").map(&:to_i)) if size
65
88
  attributes[:image_content_type] = store_value(content_type) if content_type
66
89
  end
67
- alias :image :image_url
90
+ alias_method :image, :image_url
91
+ # rubocop:enable Metrics/AbcSize
68
92
 
69
- # todo: add image_size
70
- # todo: add_image_type
93
+ # TODO: add image_size
94
+ # TODO: add_image_type
71
95
 
72
96
  def digested_image_url(*arguments, &block)
73
97
  options = arguments.extract_options!
74
- options.merge!(:digested => false)
98
+ options.merge!(digested: false)
75
99
 
76
100
  wrap_block = proc { |*args| without_digest_asset_url(block.call(*args)) } if block_given?
77
101
  image_url(*arguments, options, &wrap_block)
78
102
  end
79
- alias :digested_image :digested_image_url
103
+ alias_method :digested_image, :digested_image_url
80
104
 
81
105
  def page_url(new_url = nil, &block)
82
106
  attributes[:page_url] = store_value(new_url, &block)
83
107
  end
84
108
 
85
109
  def share_url_params(params = nil, &block)
86
- @share_url_params = store_value(params, &block)
110
+ attributes[:share_url_params] = store_value(params, &block)
87
111
  end
88
- alias :link_params :share_url_params
112
+ alias_method :link_params, :share_url_params
89
113
 
90
114
  def attributes_for(context_params = nil, default_params = Config.new)
91
- # todo: merge default params after get all values of attributes
92
- @attributes.inject(default_params.dup) do |result, (name, value)|
93
- result[name] = get_value(value, context_params)
94
- result
95
- end.tap do |attrs|
96
- #todo: fix assign share_url from page_url
97
- attrs[:share_url] = attrs[:page_url].dup if !attrs[:share_url] && attrs[:page_url]
98
- attrs[:share_url] = ("#{attrs[:share_url]}?" + @share_url_params.to_query) if attrs[:share_url] && @share_url_params
99
-
100
- attrs[:network] = name if attrs.present?
115
+ # TODO: merge default params after get all values of attributes
116
+ attrs = @attributes.each_with_object(default_params.dup) do |(a_name, value), result|
117
+ result[a_name] = get_value(value, context_params)
101
118
  end
119
+
120
+ # TODO: fix assign share_url from page_url
121
+ attrs[:share_url] = attrs[:page_url].dup if !attrs[:share_url] && attrs[:page_url]
122
+ attrs[:share_url] = add_params_to_url(attrs[:share_url], attrs[:share_url_params]) if attrs[:share_url] && attrs[:share_url_params].present?
123
+ attrs[:network] = name if attrs.present?
124
+
125
+ attrs
102
126
  end
103
127
 
104
128
  protected
@@ -113,10 +137,9 @@ module SharingTags
113
137
 
114
138
  def get_value(value, context_params)
115
139
  if value.is_a?(Proc)
116
-
117
- if @context && running_context = @context.configuraton.running_context
140
+ if @context && @running_context
118
141
  # execute proc within the view context with context_params
119
- running_context.instance_exec(*context_params, &value)
142
+ @running_context.instance_exec(*context_params, &value)
120
143
  else
121
144
  value.call(context_params)
122
145
  end
@@ -124,5 +147,16 @@ module SharingTags
124
147
  value
125
148
  end
126
149
  end
150
+
151
+ def add_params_to_url(url, params = {})
152
+ uri = URI.parse(url)
153
+ new_query_array = URI.decode_www_form(uri.query || '') + params.to_a
154
+ uri.query = URI.encode_www_form(new_query_array)
155
+
156
+ uri.to_s.html_safe
157
+ rescue URI::Error
158
+ # TODO: raise error
159
+ url
160
+ end
127
161
  end
128
162
  end
@@ -1,14 +1,17 @@
1
1
  module SharingTags
2
- class Network::Facebook < Network
2
+ class Network
3
+ class Facebook < Network
4
+ def self.available_attributes
5
+ super + %i( app_id provider )
6
+ end
3
7
 
4
- def self.available_attributes
5
- super + %i( app_id )
6
- end
8
+ def provider(provider = 'auto', &block)
9
+ attributes[:provider] = store_value(provider, &block)
10
+ end
7
11
 
8
- def app_id(app_id = nil, &block)
9
- attributes[:app_id] = store_value(app_id, &block)
12
+ def app_id(app_id = nil, &block)
13
+ attributes[:app_id] = store_value(app_id, &block)
14
+ end
10
15
  end
11
-
12
16
  end
13
-
14
17
  end
@@ -1,17 +1,11 @@
1
1
  module SharingTags
2
- class Railtie < Rails::Railtie
3
-
4
- # config.eager_load_namespaces << SharingTags
5
-
2
+ # = Sharing Tags Railtie
3
+ class Railtie < Rails::Railtie # :nodoc:
6
4
  generators do
7
5
  require "generators/sharing_tags/install/install_generator"
8
6
  end
9
7
 
10
- # rake_tasks do
11
- # load "rspec/rails/tasks/rspec.rake"
12
- # end
13
-
14
- initializer "sharing_tags.configure_view_controller" do |app|
8
+ initializer "sharing_tags.configure_view_controller" do
15
9
  ActiveSupport.on_load :action_view do
16
10
  include SharingTags::ActionView::MetaHelper
17
11
  include SharingTags::ActionView::ButtonHelper
@@ -27,5 +21,8 @@ module SharingTags
27
21
  end
28
22
  end
29
23
 
24
+ console do
25
+ ApplicationController.new.view_context
26
+ end
30
27
  end
31
28
  end
@@ -1,3 +1,3 @@
1
1
  module SharingTags
2
- VERSION = "0.0.9"
2
+ VERSION = "0.0.10"
3
3
  end
@@ -39,6 +39,7 @@ Gem::Specification.new do |spec|
39
39
  spec.add_development_dependency 'guard', '~> 2.12'
40
40
  spec.add_development_dependency 'guard-rspec', '~> 4.5'
41
41
  spec.add_development_dependency 'guard-teaspoon', '~> 0.8'
42
+ spec.add_development_dependency 'guard-rubocop', '>= 1.2.0'
42
43
  spec.add_development_dependency 'sqlite3', '~> 1.3'
43
44
  spec.add_development_dependency 'pry', '~> 0.10'
44
45