active_seo 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 525080ce2aac2173b8502c54a0462e1107aa33ffbc7fd44ed1272c625bf914f2
4
- data.tar.gz: 98c4e96bca074d4b703c85245440dd07969a5ddaaac6b5497d738b1465dce9ba
3
+ metadata.gz: ccfaa6d6d06e56e1069ce9f772cdad765292afca2d5096e8660d7d3536ef7dab
4
+ data.tar.gz: 9eb42348cfc1cc48f4e4e714aef318bcb4b4000bbc27cac1250febc05bca4460
5
5
  SHA512:
6
- metadata.gz: 65fca055c8fb103c030efef90a2bd2c829eb4e094517bea8ef0773959d76b5b669ed7871fe7092f3433227a4c7254d92929639eb8bd99ed1d1d59e67e781dfeb
7
- data.tar.gz: 03b6ee51caade17b43ad8d3eff962a84dea0b9dcfa193d79026345fc446db7fd95c6d95a71822c780e245beaf6c43272d63c4aa4b95b7279a6734a0f95af5722
6
+ metadata.gz: 4bf0b1f6c3edd79892149b1b9593d85c85c836c106a8c8b6b5d0272a32987009421d2b3a0f9fd347983b5085d1241e0cb8c86ca8e771c2f08d9e5dae3e7de0b1
7
+ data.tar.gz: b9f80ca87e6e46870dc3822de98534a4120297234b9401aa7d1f662c622b198858327bfb2eba0bbc6173b18c6d1d0516dc571ae044d0cddb4375371880c35494
@@ -0,0 +1,67 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ active_seo (0.1.4)
5
+ actionview (~> 5.0)
6
+ active_delegate (~> 1.0)
7
+ activerecord (~> 5.0)
8
+ hashie (~> 3.5)
9
+
10
+ GEM
11
+ remote: https://rubygems.org/
12
+ specs:
13
+ actionview (5.2.2)
14
+ activesupport (= 5.2.2)
15
+ builder (~> 3.1)
16
+ erubi (~> 1.4)
17
+ rails-dom-testing (~> 2.0)
18
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
19
+ active_delegate (1.0.2)
20
+ activerecord (~> 5.0)
21
+ activemodel (5.2.2)
22
+ activesupport (= 5.2.2)
23
+ activerecord (5.2.2)
24
+ activemodel (= 5.2.2)
25
+ activesupport (= 5.2.2)
26
+ arel (>= 9.0)
27
+ activesupport (5.2.2)
28
+ concurrent-ruby (~> 1.0, >= 1.0.2)
29
+ i18n (>= 0.7, < 2)
30
+ minitest (~> 5.1)
31
+ tzinfo (~> 1.1)
32
+ arel (9.0.0)
33
+ builder (3.2.3)
34
+ concurrent-ruby (1.1.4)
35
+ crass (1.0.4)
36
+ erubi (1.8.0)
37
+ hashie (3.6.0)
38
+ i18n (1.4.0)
39
+ concurrent-ruby (~> 1.0)
40
+ loofah (2.2.3)
41
+ crass (~> 1.0.2)
42
+ nokogiri (>= 1.5.9)
43
+ mini_portile2 (2.4.0)
44
+ minitest (5.11.3)
45
+ nokogiri (1.10.0)
46
+ mini_portile2 (~> 2.4.0)
47
+ rails-dom-testing (2.0.3)
48
+ activesupport (>= 4.2.0)
49
+ nokogiri (>= 1.6)
50
+ rails-html-sanitizer (1.0.4)
51
+ loofah (~> 2.2, >= 2.2.2)
52
+ rake (10.5.0)
53
+ thread_safe (0.3.6)
54
+ tzinfo (1.2.5)
55
+ thread_safe (~> 0.1)
56
+
57
+ PLATFORMS
58
+ ruby
59
+
60
+ DEPENDENCIES
61
+ active_seo!
62
+ bundler (~> 1.14)
63
+ minitest (~> 5.0)
64
+ rake (~> 10.0)
65
+
66
+ BUNDLED WITH
67
+ 1.17.3
data/README.md CHANGED
@@ -170,12 +170,8 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
170
170
 
171
171
  ## Contributing
172
172
 
173
- Bug reports and pull requests are welcome on GitHub at https://github.com/hardpixel/active-seo. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
173
+ Bug reports and pull requests are welcome on GitHub at https://github.com/hardpixel/active-seo.
174
174
 
175
175
  ## License
176
176
 
177
177
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
178
-
179
- ## Code of Conduct
180
-
181
- Everyone interacting in the ActiveSeo project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/hardpixel/active-seo/blob/master/CODE_OF_CONDUCT.md).
@@ -1,5 +1,5 @@
1
1
  require 'active_support'
2
- require 'action_view'
2
+ require 'stringex'
3
3
  require 'hashie'
4
4
  require 'active_delegate'
5
5
  require 'active_seo/version'
@@ -7,7 +7,6 @@ require 'active_seo/version'
7
7
  module ActiveSeo
8
8
  extend ActiveSupport::Concern
9
9
 
10
- # Autoload modules
11
10
  autoload :Config, 'active_seo/config'
12
11
  autoload :Helpers, 'active_seo/helpers'
13
12
  autoload :Contextualize, 'active_seo/contextualize'
@@ -17,13 +16,10 @@ module ActiveSeo
17
16
  autoload :SeoMetum, 'active_seo/seo_metum'
18
17
  autoload :Loader, 'active_seo/loader'
19
18
 
20
- # Set attr accessors
21
19
  mattr_accessor :config
22
20
 
23
- # Set config options
24
21
  @@config = Config.new
25
22
 
26
- # Setup module config
27
23
  def self.setup
28
24
  yield config
29
25
  end
@@ -1,6 +1,15 @@
1
1
  module ActiveSeo
2
+ class OpenGraphConfig < Hashie::Mash
3
+ self.disable_warnings
4
+ end
5
+
6
+ class TwitterCardConfig < Hashie::Mash
7
+ self.disable_warnings
8
+ end
9
+
2
10
  class Config < Hashie::Dash
3
- # Set properties and defaults
11
+ property :class_name, default: 'ActiveSeo::SeoMetum'
12
+ property :locale_accessors, default: false
4
13
  property :title_limit, default: 70
5
14
  property :description_limit, default: 160
6
15
  property :keywords_limit, default: 255
@@ -11,12 +20,12 @@ module ActiveSeo
11
20
  property :twitter, default: {}
12
21
 
13
22
  def opengraph_setup(&block)
14
- self.opengraph = Hashie::Mash.new
23
+ self.opengraph = OpenGraphConfig.new
15
24
  yield self.opengraph
16
25
  end
17
26
 
18
27
  def twitter_setup(&block)
19
- self.twitter = Hashie::Mash.new
28
+ self.twitter = TwitterCardConfig.new
20
29
  yield self.twitter
21
30
  end
22
31
  end
@@ -5,7 +5,6 @@ module ActiveSeo
5
5
  included do
6
6
  attr_accessor :record, :config, :opengraph, :twitter
7
7
 
8
- # Set class attributes
9
8
  class_attribute :model_og_meta
10
9
  class_attribute :model_twitter_meta
11
10
 
@@ -19,41 +19,41 @@ module ActiveSeo
19
19
 
20
20
  private
21
21
 
22
- def parse_meta(options)
23
- meta = {}
24
-
25
- if options.is_a? Hash
26
- options.each do |key, value|
27
- meta[key] = parse_values(key, value)
28
- end
29
- else
22
+ def parse_meta(options)
23
+ meta = {}
24
+
25
+ if options.is_a? Hash
26
+ options.each do |key, value|
30
27
  meta[key] = parse_values(key, value)
31
28
  end
32
-
33
- meta
29
+ else
30
+ meta[key] = parse_values(key, value)
34
31
  end
35
32
 
36
- def parse_values(key, value)
37
- data = nil
33
+ meta
34
+ end
38
35
 
39
- case value
40
- when Symbol
41
- data = get_record_value value
42
- when Proc
43
- data = call_record_proc value
44
- else
45
- data = value
46
- end
36
+ def parse_values(key, value)
37
+ data = nil
47
38
 
48
- data
39
+ case value
40
+ when Symbol
41
+ data = get_record_value value
42
+ when Proc
43
+ data = call_record_proc value
44
+ else
45
+ data = value
49
46
  end
50
47
 
51
- def get_record_value(attribute)
52
- try(attribute) || record.try(attribute)
53
- end
48
+ data
49
+ end
54
50
 
55
- def call_record_proc(proc_method)
56
- proc_method.call record
57
- end
51
+ def get_record_value(attribute)
52
+ try(attribute) || record.try(attribute)
53
+ end
54
+
55
+ def call_record_proc(proc_method)
56
+ proc_method.call record
57
+ end
58
58
  end
59
59
  end
@@ -1,9 +1,6 @@
1
1
  module ActiveSeo
2
2
  module Helpers
3
- include ActionView::Helpers::SanitizeHelper
4
-
5
3
  class << self
6
- # Generate an array of keywords
7
4
  def generate_keywords(text)
8
5
  return [] unless text
9
6
 
@@ -20,9 +17,8 @@ module ActiveSeo
20
17
  text.scan(/\w+/).join(' ').downcase
21
18
  end
22
19
 
23
- # Strip tags
24
20
  def strip_tags(html)
25
- full_sanitizer.sanitize(html)
21
+ html.strip_html_tags.squish
26
22
  end
27
23
  end
28
24
  end
@@ -3,7 +3,6 @@ module ActiveSeo
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  class_methods do
6
- # Helper to include ActiveSeo::Meta
7
6
  def has_seo(options={})
8
7
  include ActiveSeo::Meta
9
8
 
@@ -3,26 +3,19 @@ module ActiveSeo
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- # Include modules
7
6
  include ActiveDelegate
8
7
 
9
- # Set class attributes
10
8
  class_attribute :seo_config, instance_predicate: false
11
9
  class_attribute :seo_context, instance_predicate: false
12
10
 
13
- # Set class attibute defaults
14
11
  self.seo_config = ActiveSeo.config
15
12
 
16
- # Has associations
17
- has_one :seo_metum, as: :seoable, class_name: 'ActiveSeo::SeoMetum', autosave: true, dependent: :destroy
13
+ has_one :seo_metum, as: :seoable, class_name: seo_class_name, autosave: true, dependent: :destroy
14
+ delegate_attributes to: :seo_metum, prefix: 'seo', allow_nil: true, localized: seo_locale_accessors?
18
15
 
19
- # Delegate attributes
20
- delegate_attributes to: :seo_metum, prefix: 'seo', allow_nil: true
21
-
22
- # Add validations
23
16
  define_seo_validations
17
+ define_seo_locale_accessors
24
18
 
25
- # Action callbacks
26
19
  before_validation do
27
20
  ActiveSeo::Helpers.sanitize_keywords(seo_keywords) if seo_keywords?
28
21
  end
@@ -41,23 +34,41 @@ module ActiveSeo
41
34
  end
42
35
 
43
36
  class_methods do
44
- # Setup seo
37
+ def seo_class_name
38
+ @seo_class_name ||= ActiveSeo.config.class_name
39
+ end
40
+
41
+ def seo_locale_accessors?
42
+ @seo_locale_accessors ||= ActiveSeo.config.locale_accessors
43
+ end
44
+
45
45
  def seo_setup(options={})
46
46
  self.seo_config = ActiveSeo::Config.new(options.reverse_merge(seo_config))
47
47
  define_seo_validations
48
48
  end
49
49
 
50
- # Set meta contextualizer
51
50
  def seo_contextualizer(name)
52
51
  self.seo_context = name
53
52
  end
54
53
 
55
- # Set validations
56
54
  def define_seo_validations
57
55
  validates :seo_title, length: { maximum: seo_config.title_limit }, allow_blank: true
58
56
  validates :seo_description, length: { maximum: seo_config.description_limit }, allow_blank: true
59
57
  validates :seo_keywords, length: { maximum: seo_config.keywords_limit }, allow_blank: true
60
58
  end
59
+
60
+ def define_seo_locale_accessors
61
+ return unless seo_locale_accessors?
62
+
63
+ I18n.available_locales.each do |locale|
64
+ attr_name = "seo_meta_#{locale.to_s.downcase.tr('-', '_')}"
65
+
66
+ define_method attr_name do
67
+ instance_variable_get("@#{attr_name}") ||
68
+ instance_variable_set("@#{attr_name}", ActiveSeo::SeoMeta.new(self, locale).result)
69
+ end
70
+ end
71
+ end
61
72
  end
62
73
 
63
74
  def seo_meta
@@ -1,36 +1,35 @@
1
1
  module ActiveSeo
2
2
  class SeoMeta
3
- attr_accessor :record, :config, :context
3
+ attr_accessor :record, :config, :context, :locale
4
4
 
5
- # Initializer method
6
- def initialize(record)
5
+ def initialize(record, locale=I18n.locale)
7
6
  @record = record
7
+ @locale = locale
8
8
  @config = record.class.seo_config
9
9
  @context = contextualizer.new(record)
10
10
  end
11
11
 
12
- # Set base seo meta
13
12
  def result
14
13
  data = [:title, :description, :keywords, :noindex, :nofollow, :og, :twitter]
15
14
  Hash[data.map { |i| [i, send(i)] }]
16
15
  end
17
16
 
18
17
  def title
19
- attribute = :seo_title
20
- defaults = [:title, :name]
18
+ attribute = localized_attribute(:seo_title)
19
+ defaults = localized_attributes(:title, :name)
21
20
 
22
21
  attribute_fallbacks_for(attribute, defaults, config.title_fallback)
23
22
  end
24
23
 
25
24
  def description
26
- attribute = :seo_description
27
- defaults = [:content, :description, :excerpt, :body]
25
+ attribute = localized_attribute(:seo_description)
26
+ defaults = localized_attributes(:content, :description, :excerpt, :body)
28
27
 
29
28
  attribute_fallbacks_for(attribute, defaults, config.description_fallback)
30
29
  end
31
30
 
32
31
  def keywords
33
- text = record.try :seo_keywords
32
+ text = record.try localized_attribute(:seo_keywords)
34
33
  text = "#{title} #{description}" if generate_keywords?(text)
35
34
 
36
35
  helpers.generate_keywords(text)
@@ -54,38 +53,56 @@ module ActiveSeo
54
53
 
55
54
  private
56
55
 
57
- def contextualizer
58
- "#{record.class.seo_context}".safe_constantize ||
59
- "#{record.class.name}Contextualizer".safe_constantize ||
60
- 'ActiveSeo::Contextualizer'.constantize
61
- end
56
+ def contextualizer
57
+ "#{record.class.seo_context}".safe_constantize ||
58
+ "#{record.class.name}Contextualizer".safe_constantize ||
59
+ 'ActiveSeo::Contextualizer'.constantize
60
+ end
62
61
 
63
- def helpers
64
- ActiveSeo::Helpers
65
- end
62
+ def helpers
63
+ ActiveSeo::Helpers
64
+ end
66
65
 
67
- def generate_keywords?(text=nil)
68
- config.generate_keywords and text.blank?
69
- end
66
+ def localized?
67
+ record.class.seo_locale_accessors?
68
+ end
69
+
70
+ def generate_keywords?(text=nil)
71
+ config.generate_keywords and text.blank?
72
+ end
70
73
 
71
- def attribute_fallbacks_for(attribute, defaults, fallback)
72
- candidates = [attribute]
74
+ def localized_attribute(attr_name)
75
+ localized_name = "#{attr_name}_#{locale}"
76
+ localized? && record.respond_to?(localized_name) ? localized_name : attr_name
77
+ end
78
+
79
+ def localized_attributes(*attr_names)
80
+ localized? ? attr_names.map { |a| localized_attribute(a) } : attr_names
81
+ end
73
82
 
74
- case fallback
75
- when TrueClass
76
- candidates.concat(defaults)
77
- when Symbol
78
- candidates << fallback
79
- when Array
80
- candidates.concat(fallback)
81
- end
83
+ def attribute_fallbacks_for(attribute, defaults, fallback)
84
+ candidates = [attribute]
82
85
 
83
- attribute_fallbacks(candidates)
86
+ case fallback
87
+ when TrueClass
88
+ candidates.concat(defaults)
89
+ when Symbol
90
+ candidates << fallback
91
+ when Array
92
+ candidates.concat(fallback)
84
93
  end
85
94
 
86
- def attribute_fallbacks(candidates)
87
- method = candidates.find { |item| record.try(item).present? }
88
- helpers.strip_tags(record.try(method).to_s) unless method.nil?
89
- end
95
+ name = attribute.to_s.remove(/^seo_/, /_#{locale}$/)
96
+ size = config[:"#{name}_limit"]
97
+ text = attribute_fallbacks(candidates)
98
+ text = text.truncate(size, separator: ' ') if text && size
99
+
100
+ text
101
+ end
102
+
103
+ def attribute_fallbacks(candidates)
104
+ method = candidates.find { |item| record.try(item).present? }
105
+ helpers.strip_tags(record.try(method).to_s) unless method.nil?
106
+ end
90
107
  end
91
108
  end
@@ -1,13 +1,10 @@
1
1
  module ActiveSeo
2
2
  class SeoMetum < ActiveRecord::Base
3
- # Set table name
4
3
  self.table_name = 'seo_meta'
5
4
 
6
- # Set attributes
7
5
  attribute :noindex, :boolean, default: false
8
6
  attribute :nofollow, :boolean, default: false
9
7
 
10
- # Belongs associations
11
8
  belongs_to :seoable, polymorphic: true, optional: true
12
9
  end
13
10
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveSeo
2
- VERSION = '0.1.4'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -1,4 +1,6 @@
1
1
  ActiveSeo.setup do |config|
2
+ # config.class_name = 'ActiveSeo::SeoMetum'
3
+ # config.locale_accessors = false
2
4
  # config.title_limit = 70
3
5
  # config.description_limit = 160
4
6
  # config.keywords_limit = 255
metadata CHANGED
@@ -1,57 +1,63 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_seo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Olibia Tsati
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-13 00:00:00.000000000 Z
11
+ date: 2019-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '5.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '7.0'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: '5.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '7.0'
27
33
  - !ruby/object:Gem::Dependency
28
- name: actionview
34
+ name: active_delegate
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '5.0'
39
+ version: '1.0'
34
40
  type: :runtime
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: '5.0'
46
+ version: '1.0'
41
47
  - !ruby/object:Gem::Dependency
42
- name: active_delegate
48
+ name: stringex
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '0.1'
53
+ version: '2.0'
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '0.1'
60
+ version: '2.0'
55
61
  - !ruby/object:Gem::Dependency
56
62
  name: hashie
57
63
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +78,14 @@ dependencies:
72
78
  requirements:
73
79
  - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: '1.14'
81
+ version: '2.0'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
86
  - - "~>"
81
87
  - !ruby/object:Gem::Version
82
- version: '1.14'
88
+ version: '2.0'
83
89
  - !ruby/object:Gem::Dependency
84
90
  name: rake
85
91
  requirement: !ruby/object:Gem::Requirement
@@ -116,8 +122,8 @@ executables: []
116
122
  extensions: []
117
123
  extra_rdoc_files: []
118
124
  files:
119
- - CODE_OF_CONDUCT.md
120
125
  - Gemfile
126
+ - Gemfile.lock
121
127
  - LICENSE.txt
122
128
  - README.md
123
129
  - Rakefile
@@ -153,8 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
159
  - !ruby/object:Gem::Version
154
160
  version: '0'
155
161
  requirements: []
156
- rubyforge_project:
157
- rubygems_version: 2.7.6
162
+ rubygems_version: 3.0.6
158
163
  signing_key:
159
164
  specification_version: 4
160
165
  summary: Add SEO meta to ActiveRecord models
@@ -1,74 +0,0 @@
1
- # Contributor Covenant Code of Conduct
2
-
3
- ## Our Pledge
4
-
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, gender identity and expression, level of experience,
9
- nationality, personal appearance, race, religion, or sexual identity and
10
- orientation.
11
-
12
- ## Our Standards
13
-
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
16
-
17
- * Using welcoming and inclusive language
18
- * Being respectful of differing viewpoints and experiences
19
- * Gracefully accepting constructive criticism
20
- * Focusing on what is best for the community
21
- * Showing empathy towards other community members
22
-
23
- Examples of unacceptable behavior by participants include:
24
-
25
- * The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- * Trolling, insulting/derogatory comments, and personal or political attacks
28
- * Public or private harassment
29
- * Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
31
- * Other conduct which could reasonably be considered inappropriate in a
32
- professional setting
33
-
34
- ## Our Responsibilities
35
-
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
39
-
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
45
-
46
- ## Scope
47
-
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
54
-
55
- ## Enforcement
56
-
57
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at olibia@hardpixel.eu. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
63
-
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
67
-
68
- ## Attribution
69
-
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at [http://contributor-covenant.org/version/1/4][version]
72
-
73
- [homepage]: http://contributor-covenant.org
74
- [version]: http://contributor-covenant.org/version/1/4/