hey-you 1.0.1 → 1.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: aa6f17fe4c0da43b871befcc3b590393cc49ffd96fdd4191ac330a39a3663d1f
4
- data.tar.gz: 25e6a567dc7dcfbef8d1f90ad3fd2d6c5aa7e0e837ce674dc4319e6cef18df03
3
+ metadata.gz: 4d00b4135e266174d5c8a8a1090a34acedac8b2fbdc6c82c0dd19d9e30072ef3
4
+ data.tar.gz: ae481c0244a148df0620a2507b6eacb94dfdaa72f4cbc6ddeccd909ce2c6d914
5
5
  SHA512:
6
- metadata.gz: 9107c177d8ca761a216db6ea8b667fd29ec7f75829cca42b5610ba8c7e567a53f495c4b2c9fc9e708958a7036e1fed3931ca18a6e41d511094f41df4190e60c2
7
- data.tar.gz: 5c980f03a8528570b355ba4e7e425d27259768bc36ab679aeff93bb2a95e31e56975e0b8bf3b0c78cbfc24dfb63e96a293af505bcc0ba37dfcce5b8a65383e04
6
+ metadata.gz: 40ce68c45090a678097d965c98603eeec09fbf87f2946f7f3602137c92a46636320e89a88c329b17a146b4eb0543be6e716d7ccbac2e4036dba0fe7ef476f6ea
7
+ data.tar.gz: 538ceba1fd584b76ef57bad07583474d8ad17f52375f0521a467fd30208f5996ee76d9442f7927ae5ca8893ca41ec52e82c981df16a999e34e70aeef57c966db
data/.travis.yml CHANGED
@@ -1,10 +1,11 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.3
5
- - 2.4.2
6
- - 2.5.3
7
- - 2.6.1
4
+ - 2.3.0
5
+ - 2.4.0
6
+ - 2.5.0
7
+ - 2.6.0
8
+ - 2.7.0
8
9
  before_install: gem install bundler
9
10
  scripts:
10
11
  - bundle exec rspec
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ # Changelog for hey-you gem
2
+
3
+ ### 1.2.0
4
+ - Feature: data source extensions (check readme for more information)
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # HeyYou [Alpha]
1
+ # HeyYou
2
2
  [![Build Status](https://travis-ci.com/QNester/hey-you.svg?branch=master)](https://travis-ci.com/QNester/hey-you#)
3
3
  [![Gem Version](https://badge.fury.io/rb/hey-you.svg)](https://badge.fury.io/rb/hey-you)
4
4
 
@@ -44,15 +44,18 @@ Or install it yourself as:
44
44
  First, you must configure HeyYou. Example:
45
45
  ```ruby
46
46
  HeyYou::Config.configure do
47
- config.collection_files = ['config/notifications.yml']
47
+ config.data_source.options = { collection_files: ['config/notifications.yml'] }
48
48
  config.email.from = 'noreply@example-mail.com'
49
49
  config.push.fcm_token = 'fcm_server_key'
50
50
  end
51
51
  ```
52
52
  #### Required settings
53
53
  Options for gem base work.
54
- ##### Base
55
- * __config.collection_files__ - File or files contained all your notifications texts.
54
+ ##### Data Source
55
+ * __config.data_source.source_class__ - Class implemented instance method `load_collections` returning hash (by default HeyYou::DataSource::Yaml)
56
+ * __config.data_source.options__ - Arguments for source_class. This options will be passed to init `source_class`
57
+ OR
58
+ * __config.data_source.source_instance__ - Instance of source class implemented `load_collections`
56
59
  ##### Push
57
60
  * __config.push.fcm_token__ - Required setting for push channel. You can not send
58
61
  push messages if setting was not set. You should set it to equal your fcm server key.
@@ -77,9 +80,10 @@ notifications for build should be nested in `I18n.locale` key. Default: `false`.
77
80
  # config/initializers/hey-you.rb
78
81
  HeyYou::Config.configure do
79
82
  ...
80
- config.collection_files = Rails.application.config.i18n.available_locales.map do |locale|
83
+ i18n_files = Rails.application.config.i18n.available_locales.map do |locale|
81
84
  "config/notifications/#{locale}.yml"
82
85
  end
86
+ config.data_source.options = { collection_files: i18n_files }
83
87
  ...
84
88
  end
85
89
  ```
@@ -187,7 +191,7 @@ for method? This is string key for builder. Read next to understand it.
187
191
 
188
192
  ### Build your notification
189
193
  HeyYou Notification Builder - good system for store your notifications in one place.
190
- You need create yml file with follow format:
194
+ By default you need create yml file with follow format:
191
195
  ```yaml
192
196
  # config/notifications/collection.yml
193
197
  any_key:
@@ -214,6 +218,46 @@ notification will send for all available channels for receiver:
214
218
  1) Send push via fcm
215
219
  2) Send email
216
220
 
221
+ #### Data Source
222
+ Often we need store our notification text in another data source, not int yml files. HeyYou has flexible
223
+ system for data source. All what you need - make your own provider source and pass it to config. For example:
224
+
225
+ ```ruby
226
+ class NotificationText < ApplicationRecord
227
+ def self.load_collections
228
+ # load colelctions from database to hash
229
+ # THIS METHOD MUST returns hash!
230
+ end
231
+ end
232
+ ```
233
+
234
+ ```ruby
235
+ HeyYou::Config.configure do
236
+ # NotificationText is a rails model
237
+ config.data_source.source_instance = NotificationText
238
+ end
239
+ ```
240
+
241
+ HeyYou will pull texts from database to memory with initialize your application after this configuration. Builder
242
+ will build your texts successfully.
243
+
244
+ HeyYou by default contains only two data sources:
245
+ 1. `HeyYou::DataSource::Yaml` - for store notifications collections in data. For example:
246
+ ```ruby
247
+ HeyYou::Config.configure do
248
+ config.data_source.source_class = HeyYou::DataSource::Yaml
249
+ config.data_source.options = { collection_files: ['config/notifications.yml'] }
250
+ end
251
+ ```
252
+ 2. `HeyYou::DataSource::Hash` - store notification everywhere you want and pass to HeyYou only hash
253
+ ```ruby
254
+ config.data_source.source_class = HeyYou::DataSource::Yaml
255
+ config.data_source.options = { data: { welcome: { email: { ... }, push: { ... } } } }
256
+ ```
257
+
258
+ __Pay attention__: for difference source we should pass difference options.
259
+
260
+
217
261
  ### Send notification
218
262
  Receiver not only one way to send notification. You can send it using `HeyYou::Sender`.
219
263
  Just use method `#send` for HeyYou::Sender and pass notification key and `to` options
@@ -2,6 +2,7 @@ require 'yaml'
2
2
  require 'hey_you/config/conigurable'
3
3
  require 'hey_you/config/push'
4
4
  require 'hey_you/config/email'
5
+ require 'hey_you/config/data_source'
5
6
 
6
7
  #
7
8
  # @config REQUIRED collection_file [String] - File path for general notifications file
@@ -34,9 +35,8 @@ module HeyYou
34
35
 
35
36
  attr_reader :collection, :env_collection, :configured, :registered_receivers
36
37
  attr_accessor(
37
- :collection_files, :env_collection_file, :splitter,
38
- :registered_channels, :localization, :logger, :log_tag,
39
- :require_all_channels
38
+ :splitter, :registered_channels, :localization, :logger, :log_tag,
39
+ :require_all_channels, :data_source
40
40
  )
41
41
 
42
42
  def initialize
@@ -49,13 +49,6 @@ module HeyYou
49
49
  define_ch_config_methods
50
50
  end
51
51
 
52
- def collection_file
53
- @collection_files || raise(
54
- CollectionFileNotDefined,
55
- 'You must define HeyYou::Config.collection_files'
56
- )
57
- end
58
-
59
52
  def collection
60
53
  @collection ||= load_collection
61
54
  end
@@ -84,6 +77,10 @@ module HeyYou
84
77
  logger&.info("[#{log_tag}] #{msg} ")
85
78
  end
86
79
 
80
+ def data_source
81
+ DataSource.instance
82
+ end
83
+
87
84
  private
88
85
 
89
86
  def define_ch_config_methods
@@ -101,21 +98,8 @@ module HeyYou
101
98
  self.class.send(:define_method, ch, method_proc)
102
99
  end
103
100
 
104
- # Load yaml from collection_file and merge it with yaml from env_collection_file
105
101
  def load_collection
106
- @collection_files = [collection_files] if collection_files.is_a?(String)
107
- notification_collection = {}
108
- collection_files.each do |file|
109
- notification_collection.merge!(YAML.load_file(file))
110
- end
111
- notification_collection.merge!(env_collection)
112
- end
113
-
114
- def load_env_collection
115
- if env_collection_file
116
- return YAML.load_file(env_collection_file) rescue { }
117
- end
118
- {}
102
+ data_source.load_data
119
103
  end
120
104
  end
121
105
  end
@@ -0,0 +1,38 @@
1
+ require 'hey_you/config/conigurable'
2
+ require 'hey_you/data_source/yaml'
3
+ require 'hey_you/data_source/hash'
4
+
5
+ module HeyYou
6
+ class Config
7
+ class DataSource
8
+ extend Configurable
9
+
10
+ attr_accessor :source_class, :options, :source_instance
11
+
12
+ def initialize
13
+ @type = DEFAULTS[:type]
14
+ @options = DEFAULTS[:options]
15
+ @source_class = HeyYou::DataSource::Yaml
16
+ end
17
+
18
+ def load_data
19
+ return source_instance.load_collections if source_instance
20
+
21
+ if source_class.nil?
22
+ raise InvalidDataSourceError, 'You must pass `config.data_source.source_class` in configuration.'
23
+ end
24
+
25
+ source_class.new(options).load_collections
26
+ rescue ArgumentError => err
27
+ problem_fields =
28
+ err.message.gsub(/missing keyword(.?):\s/, '').split(', ').map { |f| "`#{f}`" }.join(', ')
29
+ field_word = problem_fields.split(', ').size > 1 ? 'fields' : 'field'
30
+ msg = "You must pass #{field_word} #{problem_fields} for `config.data_source.options` in configuration"
31
+
32
+ raise InvalidOptionsError, msg
33
+ end
34
+
35
+ class InvalidOptionsError < StandardError; end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,9 @@
1
+ module HeyYou
2
+ module DataSource
3
+ class Base
4
+ def load_notifications
5
+ raise NotImplementedError
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ require 'hey_you/data_source/_base'
2
+
3
+ module HeyYou
4
+ module DataSource
5
+ class Hash < Base
6
+ attr_reader :data
7
+
8
+ def initialize(data:)
9
+ @data = data
10
+ end
11
+
12
+ def load_collections
13
+ data
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ require 'hey_you/data_source/_base'
2
+
3
+ module HeyYou
4
+ module DataSource
5
+ class Yaml < Base
6
+ attr_reader :collection_files, :env_collection_file
7
+
8
+ def initialize(collection_files:, env_collection_file: nil)
9
+ @collection_files = collection_files
10
+ @collection_files = [collection_files] if collection_files.is_a?(String)
11
+ @env_collection_file = env_collection_file
12
+ end
13
+
14
+ # Load yaml from collection_file and merge it with yaml from env_collection_file
15
+ def load_collections
16
+ notification_collection = {}
17
+ collection_files.each do |file|
18
+ notification_collection.merge!(YAML.load_file(file))
19
+ end
20
+ notification_collection.merge!(env_collection)
21
+ end
22
+
23
+ def env_collection
24
+ @env_collection ||= load_env_collection
25
+ end
26
+
27
+ private
28
+
29
+ def load_env_collection
30
+ if env_collection_file
31
+ return YAML.load_file(env_collection_file) rescue { }
32
+ end
33
+ {}
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module HeyYou
2
- VERSION = "1.0.1"
2
+ VERSION = "1.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hey-you
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Nesterov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-19 00:00:00.000000000 Z
11
+ date: 2020-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fcm
@@ -121,6 +121,7 @@ files:
121
121
  - ".rspec"
122
122
  - ".rubocop.yml"
123
123
  - ".travis.yml"
124
+ - CHANGELOG.md
124
125
  - Gemfile
125
126
  - README.md
126
127
  - Rakefile
@@ -137,8 +138,12 @@ files:
137
138
  - lib/hey_you/channels/push.rb
138
139
  - lib/hey_you/config.rb
139
140
  - lib/hey_you/config/conigurable.rb
141
+ - lib/hey_you/config/data_source.rb
140
142
  - lib/hey_you/config/email.rb
141
143
  - lib/hey_you/config/push.rb
144
+ - lib/hey_you/data_source/_base.rb
145
+ - lib/hey_you/data_source/hash.rb
146
+ - lib/hey_you/data_source/yaml.rb
142
147
  - lib/hey_you/helper.rb
143
148
  - lib/hey_you/receiver.rb
144
149
  - lib/hey_you/sender.rb