active_seo 0.1.4 → 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: 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/