streamline 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: c06209f08a5c47cbef7e4e07932f563c3ff1e968
4
- data.tar.gz: b3106d614435e118dad49658fb08007e7af1effa
3
+ metadata.gz: 96df0fff0c9d69ff55d765607f44313c9cb2e6ea
4
+ data.tar.gz: 2a139d717a813da7b97865794391ac0f5eab3973
5
5
  SHA512:
6
- metadata.gz: f8f11ca2e4ba9cb215a3687e0dd5dbaf88aad2b7698a90f289998f13786e25aa3a215817da8d73fc4db13535cfd75afe367c435958740e48756a1e9a7649742b
7
- data.tar.gz: fae0281c6a9f6a360884704829ee10bcefadb2ab2f3d0c2aeb352de579849b66cff1c2d89d415320643f29f794daa8d40d9f2dc6f43a87b9fe420e05bda570ff
6
+ metadata.gz: 17597e0b643b68fe5043711332a46d17df2658283b4d56ef8849286be8c209cca1be942bf16c2f7ea74775635e0340f8aeec41d784bc8e04dbd15f34be5062fa
7
+ data.tar.gz: 02dd2c67218e9343f0058e9504989481345790fc520fb89d7e34c0dbdb27e2958ef42a325ed33082caaf63e6d50e37134749ba534efd81644c878a3850bcd000
data/README.md CHANGED
@@ -1,7 +1,73 @@
1
- # Airplane
1
+ # Streamline
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/airplane.svg)](https://badge.fury.io/rb/airplane)
4
- [![Code Climate](https://codeclimate.com/github/atipugin/airplane/badges/gpa.svg)](https://codeclimate.com/github/atipugin/airplane)
5
- [![Build Status](https://travis-ci.org/atipugin/airplane.svg?branch=master)](https://travis-ci.org/atipugin/airplane)
3
+ **Important! It's still early proof-of-concept. Use it on your own risk ;)**
6
4
 
7
- TODO: Write some meaningful description ;)
5
+ Streamline allows you to organize event-based behavior of your app way more simpler.
6
+
7
+ [![Gem Version](https://badge.fury.io/rb/streamline.svg)](https://badge.fury.io/rb/streamline)
8
+ [![Code Climate](https://codeclimate.com/github/atipugin/streamline/badges/gpa.svg)](https://codeclimate.com/github/atipugin/streamline)
9
+ [![Build Status](https://travis-ci.org/atipugin/streamline.svg?branch=master)](https://travis-ci.org/atipugin/streamline)
10
+
11
+ ## Installation
12
+
13
+ Add to your Gemfile:
14
+
15
+ ```ruby
16
+ gem 'streamline'
17
+ ```
18
+
19
+ And then execute:
20
+
21
+ ```shell
22
+ $ bundle
23
+ ```
24
+
25
+ Or install it system-wide:
26
+
27
+ ```
28
+ $ gem install streamline
29
+ ```
30
+
31
+ ## Setup
32
+
33
+ First of all, you have to select a [data store](#data-stores) for your events. Let's take ActiveRecord store for example:
34
+
35
+ ```shell
36
+ $ rails generate streamline:stores:active_record
37
+ ```
38
+
39
+ It will generate all neccessary files (a model and migration file in this case).
40
+
41
+ Next, you need to configure ActiveJob adapter (if you haven't done it yet). Streamline uses background jobs a lot and usage of ActiveJob allows us to support [as many queuing backends as possible](http://edgeguides.rubyonrails.org/active_job_basics.html#backends).
42
+
43
+ Imagine your app already uses Sidekiq. Just add the following line to your `application.rb`:
44
+
45
+ ```ruby
46
+ config.active_job.queue_adapter = :sidekiq
47
+ ```
48
+
49
+ Then add `streamline` queue to your `sidekiq.yml`.
50
+
51
+ You're almost done! It's time to set up handlers and track some events.
52
+
53
+ ## Handlers
54
+
55
+ ...
56
+
57
+ ## Event tracking
58
+
59
+ ...
60
+
61
+ ## Data stores
62
+
63
+ Streamline supports following event stores:
64
+
65
+ - ActiveRecord (PostgreSQL, MySQL, SQLite etc)
66
+
67
+ ## Contributing
68
+
69
+ 1. Fork it
70
+ 2. Create your feature branch (git checkout -b my-new-feature)
71
+ 3. Commit your changes (git commit -am 'Add some feature')
72
+ 4. Push to the branch (git push origin my-new-feature)
73
+ 5. Create new Pull Request
@@ -1,14 +1,12 @@
1
1
  class <%= migration_class_name %> < ActiveRecord::Migration
2
2
  def change
3
- create_table :streamline_events, id: false do |t|
4
- t.uuid :id, primary_key: true
3
+ create_table :streamline_events do |t|
5
4
  t.string :name, null: false
6
5
  t.<%= postgresql? ? (jsonb? ? 'jsonb' : 'json') : 'text' %> :properties
7
6
  t.datetime :occurred_at, null: false
8
7
  t.references :target, polymorphic: true
9
8
  end
10
9
 
11
- add_index :streamline_events, :id
12
10
  add_index :streamline_events, [:target_type, :target_id]
13
11
  end
14
12
  end
@@ -1,6 +1,5 @@
1
1
  require 'active_job'
2
2
  require 'yaml'
3
- require 'active_support/core_ext/hash/keys'
4
3
 
5
4
  require 'streamline/configuration'
6
5
  require 'streamline/stores'
@@ -6,11 +6,7 @@ module Streamline
6
6
  def_delegators :model, :count
7
7
 
8
8
  def save_event(attributes)
9
- event = model.new(attributes)
10
- event.id = generate_event_id
11
- event.save!
12
-
13
- event.id
9
+ model.create!(attributes).id
14
10
  end
15
11
 
16
12
  def find_event(id)
@@ -19,10 +19,6 @@ module Streamline
19
19
  fail NotImplementedError, 'You need to implement this method first'
20
20
  end
21
21
 
22
- def generate_event_id
23
- SecureRandom.uuid
24
- end
25
-
26
22
  def prepare_event(hsh)
27
23
  hsh.deep_stringify_keys
28
24
  end
@@ -1,3 +1,3 @@
1
1
  module Streamline
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -5,102 +5,17 @@ module Streamline
5
5
  include_context 'handler'
6
6
 
7
7
  let(:handler) { Streamline.registry[event_name].sample }
8
- let(:subsequent_events) { Streamline.store.find_subsequent_events(event) }
9
8
  let(:params) { { event_id: event_id, handler: handler } }
9
+ let(:params_dump) { YAML.dump(params) }
10
10
 
11
11
  before do
12
- handler_class.handle event_name, handler_options
12
+ handler_class.handle(event_name, handler_options)
13
13
  end
14
14
 
15
- describe '#conditions_satisfied?' do
16
- it 'returns true' do
17
- expect(subject.send(:conditions_satisfied?, handler, event))
18
- .to be(true)
19
- end
20
- end
21
-
22
- describe '#if_satisfied?' do
23
- let(:handler_options) { { if: FFaker::Lorem.word } }
24
-
25
- it 'returns false' do
26
- expect(subject.send(:if_satisfied?, handler, subsequent_events))
27
- .to be(false)
28
- end
29
-
30
- context 'when expected event is occurred' do
31
- before do
32
- Streamline.store.save_event(
33
- event_attributes.merge(
34
- name: handler_options[:if],
35
- occurred_at: 1.minute.from_now
36
- )
37
- )
38
- end
39
-
40
- it 'returns true' do
41
- expect(subject.send(:if_satisfied?, handler, subsequent_events))
42
- .to be(true)
43
- end
44
- end
45
- end
46
-
47
- describe '#unless_satisfied?' do
48
- let(:handler_options) { { unless: FFaker::Lorem.word } }
49
-
50
- it 'returns true' do
51
- expect(subject.send(:unless_satisfied?, handler, subsequent_events))
52
- .to be(true)
53
- end
54
-
55
- context 'when unexpected event is occurred' do
56
- before do
57
- Streamline.store.save_event(
58
- event_attributes.merge(
59
- name: handler_options[:unless],
60
- occurred_at: 1.minute.from_now
61
- )
62
- )
63
- end
64
-
65
- it 'returns false' do
66
- expect(subject.send(:unless_satisfied?, handler, subsequent_events))
67
- .to be(false)
68
- end
69
- end
70
- end
71
-
72
- describe '#apply_constraints' do
73
- let(:event_properties) { { user_id: rand(1..10) } }
74
- let(:handler_options) { { constraints: :user_id } }
75
-
76
- before do
77
- Streamline.store.save_event(
78
- event_attributes.merge(occurred_at: 1.minute.from_now)
79
- )
80
- end
81
-
82
- it 'returns suitable events' do
83
- expect(
84
- subject
85
- .send(:apply_constraints, handler, event, subsequent_events)
86
- .sample['properties']
87
- ).to include('user_id' => event_properties[:user_id])
88
- end
89
- end
90
-
91
- describe '#enqueue_repeat' do
92
- it 'does not enqueue itself again' do
93
- expect { subject.send(:enqueue_repeat, handler, params) }
94
- .not_to enqueue_a(described_class)
95
- end
96
-
97
- context 'when amount of handler repeats is greater than one' do
98
- let(:handler_options) { { repeats: 2 } }
99
-
100
- it 'enqueues itself again' do
101
- expect { subject.send(:enqueue_repeat, handler, params) }
102
- .to enqueue_a(described_class)
103
- end
15
+ describe '#perform' do
16
+ it 'runs handler' do
17
+ allow_any_instance_of(handler_class).to receive(:run).with(event)
18
+ subject.perform(params_dump)
104
19
  end
105
20
  end
106
21
  end
@@ -4,7 +4,6 @@ require 'simplecov'
4
4
  require 'database_cleaner'
5
5
 
6
6
  require 'active_record'
7
- require 'activeuuid'
8
7
 
9
8
  SimpleCov.start
10
9
 
@@ -1,15 +1,13 @@
1
1
  ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:'
2
2
 
3
3
  ActiveRecord::Schema.define do
4
- create_table :streamline_events, id: false do |t|
5
- t.uuid :id, primary_key: true
4
+ create_table :streamline_events do |t|
6
5
  t.string :name, null: false
7
6
  t.text :properties
8
7
  t.datetime :occurred_at, null: false
9
8
  t.references :target, polymorphic: true
10
9
  end
11
10
 
12
- add_index :streamline_events, :id
13
11
  add_index :streamline_events, [:target_type, :target_id]
14
12
  end
15
13
 
@@ -8,7 +8,7 @@ RSpec.shared_examples_for 'a store' do
8
8
  end
9
9
 
10
10
  it 'returns id of saved event' do
11
- expect(subject.save_event(event_attributes)).to be_a(String)
11
+ expect(subject.save_event(event_attributes)).to be
12
12
  end
13
13
  end
14
14
 
@@ -14,10 +14,8 @@ Gem::Specification.new do |spec|
14
14
  spec.require_paths = %w(lib)
15
15
 
16
16
  spec.add_dependency 'activejob'
17
- spec.add_dependency 'activesupport'
18
17
 
19
18
  spec.add_development_dependency 'activerecord'
20
- spec.add_development_dependency 'activeuuid'
21
19
  spec.add_development_dependency 'database_cleaner'
22
20
  spec.add_development_dependency 'ffaker'
23
21
  spec.add_development_dependency 'pry'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: streamline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Tipugin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-18 00:00:00.000000000 Z
11
+ date: 2016-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: activesupport
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: activerecord
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,20 +38,6 @@ dependencies:
52
38
  - - ">="
53
39
  - !ruby/object:Gem::Version
54
40
  version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: activeuuid
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
41
  - !ruby/object:Gem::Dependency
70
42
  name: database_cleaner
71
43
  requirement: !ruby/object:Gem::Requirement