Skip to content

Commit

Permalink
Merge pull request #7 from lppjunior/develop
Browse files Browse the repository at this point in the history
Add pipeline pattern
  • Loading branch information
lppjunior authored Aug 25, 2020
2 parents fc1c917 + da72eac commit d470546
Show file tree
Hide file tree
Showing 16 changed files with 163 additions and 42 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.2.0] - 2020-08-25
### Feature
- Added pipeline pattern

## [1.1.0] - 2020-08-24
### Feature
- Added middleware pattern
Expand Down
63 changes: 43 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,39 @@ See many characteristics of this library:

| Available Patterns |
|--------------------------|
| [Observer](Observer) |
| [Middleware](Middleware) |
| [Middleware](#Middleware) |
| [Observer](#Observer) |
| [Pipeline](#Pipeline) |

## Middleware
A single implementation of Middleware pattern

**Class structure**
```js
class Middleware() {
use(callback: function)
process(...data: object)
}
```
## Example
```js
const middleware = new Middleware()

middleware.use((param1, param2, param3, next) => {
param1 = 'param 1 UPDATED'
console.log('Execution 1', param1, param2, param3)
next()
})

middleware.use((param1, param2, param3, next) => {
console.log('Execution 2', param1, param2, param3) // param1 = 'param 1 UPDATED'
next()
})

middleware.process('param 1', 'param 2', 'param 3')
```
## Observer
The instance (or model) maintains a collection of objects (observers) and will notify them of any changes in their state.
Expand All @@ -33,34 +64,26 @@ class Observer() {
observer.emit('test', { status: 'Observer emit successful' })
```
## Middleware
A single implementation of Middleware pattern
## Pipeline
A Pipeline pattern implementation
**Class structure**
```js
class Middleware() {
use(callback: function)
process(...data: object)
class Pipeline() {
pipe(callback: function)
process(data: object)
}
```
## Example
```js
const middleware = new Middleware()
const result = (new Pipeline())
.pipe((data) => data + 5)
.pipe((data) => data * 20)
.pipe((data) => data / 2)
.process(5) // result 100

middleware.use((param1, param2, param3, next) => {
param1 = 'param 1 UPDATED'
console.log('Execution 1', param1, param2, param3)
next()
})

middleware.use((param1, param2, param3, next) => {
console.log('Execution 2', param1, param2, param3) // param1 = 'param 1 UPDATED'
next()
})

middleware.process('param 1', 'param 2', 'param 3')
```
## Versioning
Expand Down
Binary file removed dist/favicon.png
Binary file not shown.
1 change: 0 additions & 1 deletion dist/index.html

This file was deleted.

12 changes: 0 additions & 12 deletions dist/main.js

This file was deleted.

2 changes: 0 additions & 2 deletions dist/patterns.min.js

This file was deleted.

1 change: 0 additions & 1 deletion dist/patterns.min.js.map

This file was deleted.

4 changes: 3 additions & 1 deletion src-example/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
<h1>Patter JS</h1>
<p>Open you inspection to see result</p>

<script src="main.js"></script>
<script src="middleware.js"></script>
<script src="observer.js"></script>
<script src="pipeline.js"></script>
</body>
</html>
23 changes: 23 additions & 0 deletions src-example/src/middleware.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
function testMiddleware () {
const middleware = new Middleware()
middleware.use((param1, param2, next) => {
param1.test += ' UPDATED'
console.log('[middleware] ', param1, param2)
next(param1, param2)
})

middleware.use((param1, param2, next) => {
param2 = param2 + ' UPDATED'
console.log('[middleware] ', param1, param2)
next(param1, param2)
})

middleware.use((param1, param2, next) => {
console.log('[middleware] ', param1, param2)
next(param1, param2)
})

middleware.process({ test: 123, value: 'aaa' }, 'test')
}

document.addEventListener('DOMContentLoaded', testMiddleware, false)
5 changes: 3 additions & 2 deletions src-example/main.js → src-example/src/observer.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ function runExample () {
}

function testObserver () {
console.log('[observer] ', 'test')
const observer = new Observer()
observer.on('test', (data) => console.log(data))
observer.on('test', (data) => console.log('Test 2 > ', data))
observer.on('test', (data) => console.log('[observer] ', data))
observer.on('test', (data) => console.log('[observer] ', 'Test 2 > ', data))
observer.emit('test', { status: 'Observer emit successful' })
}

Expand Down
20 changes: 20 additions & 0 deletions src-example/src/pipeline.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
function testPipeline () {
const result = (new Pipeline())
.pipe((data) => {
console.log('[pipeline] ', data + ' + ' + 5)
return data + 5
})
.pipe((data) => {
console.log('[pipeline] ', data + ' * ' + 3)
return data * 3
})
.pipe((data) => {
console.log('[pipeline] ', data + ' + ' + 150)
return data + 150
})
.process(5)

console.log('[pipeline] result: ', result)
}

document.addEventListener('DOMContentLoaded', testPipeline, false)
6 changes: 5 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
import Middleware from './pattern/middleware'
import Observer from './pattern/observer'
import Pipeline from './pattern/pipeline'

export {
Observer
Middleware,
Observer,
Pipeline
}
17 changes: 17 additions & 0 deletions src/pattern/pipeline/Pipeline.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
class Pipeline {
constructor () {
this.pipelines = []
}

pipe (callback) {
this.pipelines.push(callback)
return this
}

process (data) {
let result = data
return this.pipelines.map(fn => (result = fn(result))).pop()
}
}

export default Pipeline
40 changes: 40 additions & 0 deletions src/pattern/pipeline/__tests__/Pipeline.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import Pipeline from '../Pipeline'

describe('Test Pipeline call all methods', () => {
const pipeline = new Pipeline()

test('should assert method pipeline.pipe was called', () => {
jest.spyOn(pipeline, 'pipe')
pipeline.pipe(() => {})
expect(pipeline.pipe).toHaveBeenCalled()
})

test('should assert method pipeline.process was called', () => {
jest.spyOn(pipeline, 'process')
pipeline.process(() => {})
expect(pipeline.process).toHaveBeenCalled()
})
})

describe('Test Pipeline call perfect scenaries', () => {
const result = (new Pipeline())
.pipe((data) => {
test('Data should be 5', () => {
expect(data).toBe(5)
})

return data + 5
})
.pipe((data) => {
test('Data should be 10', () => {
expect(data).toBe(10)
})

return data * 2
})
.process(5)

test('Result should be 20', () => {
expect(result).toBe(20)
})
})
3 changes: 3 additions & 0 deletions src/pattern/pipeline/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import Pipeline from './Pipeline'

export default Pipeline
4 changes: 2 additions & 2 deletions webpack.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ module.exports = {
patterns: './src'
},
output: {
filename: '[name].min.js',
filename: 'src/[name].min.js',
path: path.resolve(__dirname, 'dist'),
libraryTarget: 'umd'
},
Expand All @@ -22,7 +22,7 @@ module.exports = {
}),
new CopyPlugin({
patterns: [
{ from: 'src-example/main.js', to: '' }
path.resolve(__dirname, 'src-example', 'src')
]
})
],
Expand Down

0 comments on commit d470546

Please sign in to comment.