journal-cli 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f6418ebb3162bf5ea530b0d82e17b6db4be008be8ce11281a523bf272b9f78e5
4
+ data.tar.gz: 1676b529f2aa848b70dd590eeae443441a67fa3f1e55d6cb698b051f44f4548d
5
+ SHA512:
6
+ metadata.gz: e854efc466d05f9cec2e2f96f2f80c86c7b4126bf826cc2215a37afb449dc7e43225eca8db007060cc9030cd46ca77923716363d75af97a23e4b7d4850269b2f
7
+ data.tar.gz: bb990eb2af72e2a949a38ca69ead4b1f3d637070315bb49be647aae6e1896c6afbd01fd64f3b9dad039eeaa320f5f745b35a65bd2373c3749f3efdd7646821fa
@@ -0,0 +1,11 @@
1
+ ARG VARIANT="3"
2
+
3
+ FROM mcr.microsoft.com/vscode/devcontainers/ruby:${VARIANT}
4
+
5
+ USER vscode
6
+ WORKDIR /home/vscode
7
+
8
+ RUN mkdir -p .config/git \
9
+ && echo ".vscode/*" >> .config/git/ignore \
10
+ && echo "*.code-workspace" >> .config/git/ignore \
11
+ && echo ".history/" >> .config/git/ignore
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "Ruby",
3
+ "build": {
4
+ "dockerfile": "Dockerfile",
5
+ "args": {
6
+ "VARIANT": "3"
7
+ }
8
+ },
9
+ "extensions": [
10
+ "rebornix.Ruby",
11
+ "ms-vsliveshare.vsliveshare",
12
+ "EditorConfig.EditorConfig",
13
+ "esbenp.prettier-vscode"
14
+ ],
15
+ "postCreateCommand": "bundle install",
16
+ "remoteUser": "vscode"
17
+ }
data/.editorconfig ADDED
@@ -0,0 +1,9 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+ indent_style = space
9
+ indent_size = 2
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: Setup
3
+ description: Setup Ruby and install dependencies.
4
+
5
+ inputs:
6
+ ruby_version:
7
+ description: The Ruby version.
8
+ required: false
9
+ default: '3.2.0'
10
+ install_dependencies:
11
+ description: Install dependencies.
12
+ required: false
13
+ default: 'true'
14
+ gem_credentials:
15
+ description: Gem credentials.
16
+ required: false
17
+
18
+ runs:
19
+ using: composite
20
+ steps:
21
+ - name: Setup credentials
22
+ if: inputs.gem_credentials
23
+ shell: bash
24
+ run: |
25
+ mkdir -p ~/.gem
26
+ echo "$GEM_CREDENTIALS" > ~/.gem/credentials
27
+ chmod 600 ~/.gem/credentials
28
+ env:
29
+ GEM_CREDENTIALS: ${{ inputs.gem_credentials }}
30
+ - name: Setup Ruby
31
+ uses: ruby/setup-ruby@v1
32
+ with:
33
+ bundler-cache: ${{ inputs.install_dependencies == 'true' }}
34
+ ruby-version: ${{ inputs.ruby_version }}
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: _build
3
+
4
+ on:
5
+ workflow_call:
6
+ inputs:
7
+ ruby_version:
8
+ description: The Ruby version.
9
+ type: string
10
+ required: false
11
+ default: '3.2.0'
12
+ outputs:
13
+ artifact_name:
14
+ description: The artifact name.
15
+ value: build-${{ github.sha }}
16
+
17
+ jobs:
18
+ build:
19
+ name: Gem
20
+ runs-on: ubuntu-latest
21
+ timeout-minutes: 30
22
+ steps:
23
+ - name: Checkout
24
+ uses: actions/checkout@v3
25
+ - name: Setup
26
+ uses: ./.github/actions/setup
27
+ with:
28
+ ruby_version: ${{ inputs.ruby_version }}
29
+ - name: Build
30
+ run: bundle exec rake build
31
+ - name: Upload artifact
32
+ uses: actions/upload-artifact@v3
33
+ with:
34
+ name: build-${{ github.sha }}
35
+ if-no-files-found: error
36
+ path: pkg/
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: _publish
3
+
4
+ on:
5
+ workflow_call:
6
+ inputs:
7
+ artifact_name:
8
+ description: The artifact name.
9
+ type: string
10
+ required: true
11
+ registry_key:
12
+ description: The gem registry credentials key.
13
+ type: string
14
+ required: true
15
+ registry_host:
16
+ description: The gem registry host.
17
+ type: string
18
+ required: true
19
+ secrets:
20
+ registry_credentials:
21
+ description: The gem registry credentials.
22
+ required: true
23
+
24
+ jobs:
25
+ publish:
26
+ name: Publish gem
27
+ runs-on: ubuntu-latest
28
+ timeout-minutes: 30
29
+ steps:
30
+ - name: Checkout
31
+ uses: actions/checkout@v3
32
+ - name: Setup
33
+ uses: ./.github/actions/setup
34
+ with:
35
+ install_dependencies: 'false'
36
+ gem_credentials: ':${{ inputs.registry_key }}: ${{ secrets.registry_credentials }}'
37
+ - name: Download artifact
38
+ uses: actions/download-artifact@v3
39
+ with:
40
+ name: ${{ inputs.artifact_name }}
41
+ path: pkg/
42
+ - name: Publish
43
+ run: gem push --key $REGISTRY_KEY --host $REGISTRY_HOST $GEM_ARTIFACTS/*
44
+ env:
45
+ REGISTRY_KEY: ${{ inputs.registry_key }}
46
+ REGISTRY_HOST: ${{ inputs.registry_host }}
47
+ GEM_ARTIFACTS: pkg
@@ -0,0 +1,112 @@
1
+ ---
2
+ name: Check
3
+
4
+ on:
5
+ push:
6
+ branches:
7
+ - '**'
8
+
9
+ jobs:
10
+ test:
11
+ name: Test (Ruby ${{ matrix.ruby }} on ${{ matrix.os_name }})
12
+ runs-on: ${{ matrix.os }}
13
+ timeout-minutes: 30
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ os:
18
+ - ubuntu-latest
19
+ - macos-latest
20
+ - windows-latest
21
+ ruby:
22
+ - '3.0'
23
+ - '3.1'
24
+ - '3.2'
25
+ include:
26
+ - os: ubuntu-latest
27
+ os_name: Linux
28
+ - os: macos-latest
29
+ os_name: macOS
30
+ - os: windows-latest
31
+ os_name: Windows
32
+ steps:
33
+ - name: Checkout
34
+ uses: actions/checkout@v3
35
+ - name: Setup
36
+ uses: ./.github/actions/setup
37
+ with:
38
+ ruby_version: ${{ matrix.ruby }}
39
+ - name: Test
40
+ run: bundle exec rake test
41
+ lint:
42
+ name: Lint (Ruby ${{ matrix.ruby }})
43
+ runs-on: ubuntu-latest
44
+ timeout-minutes: 30
45
+ strategy:
46
+ fail-fast: false
47
+ matrix:
48
+ ruby:
49
+ - '3.0'
50
+ - '3.1'
51
+ - '3.2'
52
+ steps:
53
+ - name: Checkout
54
+ uses: actions/checkout@v3
55
+ - name: Setup
56
+ uses: ./.github/actions/setup
57
+ with:
58
+ ruby_version: ${{ matrix.ruby }}
59
+ - name: Lint
60
+ run: bundle exec rake lint
61
+ build:
62
+ name: Build
63
+ uses: ./.github/workflows/_build.yml
64
+ install:
65
+ name: Install (Ruby ${{ matrix.ruby }} on ${{ matrix.os_name }})
66
+ runs-on: ${{ matrix.os }}
67
+ timeout-minutes: 30
68
+ needs: build
69
+ strategy:
70
+ fail-fast: false
71
+ matrix:
72
+ os:
73
+ - ubuntu-latest
74
+ - macos-latest
75
+ - windows-latest
76
+ ruby:
77
+ - '3.0'
78
+ - '3.1'
79
+ - '3.2'
80
+ include:
81
+ - os: ubuntu-latest
82
+ os_name: Linux
83
+ - os: macos-latest
84
+ os_name: macOS
85
+ - os: windows-latest
86
+ os_name: Windows
87
+ steps:
88
+ - name: Setup Ruby
89
+ uses: ruby/setup-ruby@v1
90
+ with:
91
+ ruby-version: ${{ matrix.ruby }}
92
+ - name: Download artifact
93
+ uses: actions/download-artifact@v3
94
+ with:
95
+ name: ${{ needs.build.outputs.artifact_name }}
96
+ path: .
97
+ - name: Find gems
98
+ uses: tj-actions/glob@v16
99
+ id: gems
100
+ with:
101
+ files: '*.gem'
102
+ - name: Create main.rb
103
+ uses: DamianReeves/write-file-action@v1.2
104
+ with:
105
+ write-mode: overwrite
106
+ path: main.rb
107
+ contents: |
108
+ require 'journal-cli'
109
+ - name: Install
110
+ run: gem install ${{ steps.gems.outputs.paths }}
111
+ - name: Run
112
+ run: ruby main.rb
@@ -0,0 +1,41 @@
1
+ ---
2
+ name: Format
3
+
4
+ on:
5
+ pull_request:
6
+ branches:
7
+ - main
8
+ workflow_dispatch: {}
9
+
10
+ jobs:
11
+ fix:
12
+ name: Commit fixes
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 30
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v3
18
+ with:
19
+ ref: ${{ github.head_ref }}
20
+ token: ${{ secrets.GH_TOKEN }}
21
+ - name: Import GPG key
22
+ uses: crazy-max/ghaction-import-gpg@v5
23
+ with:
24
+ git_user_signingkey: true
25
+ git_commit_gpgsign: true
26
+ git_committer_name: ${{ secrets.GIT_USER_NAME }}
27
+ git_committer_email: ${{ secrets.GIT_USER_EMAIL }}
28
+ gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
29
+ passphrase: ${{ secrets.GPG_PASSPHRASE }}
30
+ - name: Setup
31
+ uses: ./.github/actions/setup
32
+ - name: Format
33
+ run: bundle exec rake format
34
+ - name: Commit
35
+ uses: stefanzweifel/git-auto-commit-action@v4
36
+ if: always()
37
+ with:
38
+ commit_message: Run format
39
+ commit_user_name: ${{ secrets.GIT_USER_NAME }}
40
+ commit_user_email: ${{ secrets.GIT_USER_EMAIL }}
41
+ commit_author: ${{ secrets.GIT_USER_NAME }} <${{ secrets.GIT_USER_EMAIL }}>
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: Publish
3
+
4
+ run-name: Publish ${{ github.ref_name }}
5
+
6
+ on:
7
+ push:
8
+ tags:
9
+ - v*
10
+
11
+ jobs:
12
+ build:
13
+ name: Build
14
+ uses: ./.github/workflows/_build.yml
15
+ release:
16
+ name: GitHub Releases
17
+ runs-on: ubuntu-latest
18
+ timeout-minutes: 30
19
+ needs: build
20
+ steps:
21
+ - name: Checkout
22
+ uses: actions/checkout@v3
23
+ - name: Download artifact
24
+ uses: actions/download-artifact@v3
25
+ with:
26
+ name: ${{ needs.build.outputs.artifact_name }}
27
+ path: pkg/
28
+ - name: Create GitHub release
29
+ uses: softprops/action-gh-release@v1
30
+ with:
31
+ token: ${{ secrets.GH_TOKEN }}
32
+ fail_on_unmatched_files: true
33
+ prerelease: ${{ contains(github.ref_name, 'pre') }}
34
+ files: pkg/*
35
+ rubygems:
36
+ name: RubyGems.org
37
+ uses: ./.github/workflows/_publish.yml
38
+ needs: build
39
+ with:
40
+ artifact_name: ${{ needs.build.outputs.artifact_name }}
41
+ registry_key: rubygems
42
+ registry_host: https://rubygems.org
43
+ secrets:
44
+ registry_credentials: ${{ secrets.RUBYGEMS_API_KEY }}
45
+ github:
46
+ name: GitHub Packages
47
+ uses: ./.github/workflows/_publish.yml
48
+ permissions:
49
+ packages: write
50
+ needs: build
51
+ with:
52
+ artifact_name: ${{ needs.build.outputs.artifact_name }}
53
+ registry_key: github
54
+ registry_host: https://rubygems.pkg.github.com/${{ github.repository_owner }}
55
+ secrets:
56
+ registry_credentials: Bearer ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: Version
3
+
4
+ run-name: Cut ${{ github.event.inputs.version }}
5
+
6
+ on:
7
+ workflow_dispatch:
8
+ inputs:
9
+ version:
10
+ description: Version to cut
11
+ required: true
12
+
13
+ jobs:
14
+ tag:
15
+ name: Tag
16
+ runs-on: ubuntu-latest
17
+ timeout-minutes: 30
18
+ steps:
19
+ - name: Checkout
20
+ uses: actions/checkout@v3
21
+ with:
22
+ token: ${{ secrets.GH_TOKEN }}
23
+ - name: Import GPG key
24
+ uses: crazy-max/ghaction-import-gpg@v5
25
+ with:
26
+ git_user_signingkey: true
27
+ git_commit_gpgsign: true
28
+ git_committer_name: ${{ secrets.GIT_USER_NAME }}
29
+ git_committer_email: ${{ secrets.GIT_USER_EMAIL }}
30
+ gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
31
+ passphrase: ${{ secrets.GPG_PASSPHRASE }}
32
+ - name: Setup
33
+ uses: ./.github/actions/setup
34
+ - name: Cut ${{ github.event.inputs.version }} version
35
+ run: bundle exec gem bump --no-commit --version ${{ github.event.inputs.version }}
36
+ - name: Update Gemfile.lock
37
+ run: |
38
+ bundle config set --local deployment 'false'
39
+ bundle install
40
+ - name: Get meta
41
+ id: meta
42
+ run: |
43
+ version=$(bundle exec parse-gemspec-cli parse *.gemspec | jq -r .version)
44
+ echo "version=${version}" >> $GITHUB_OUTPUT
45
+ - name: Tag ${{ github.event.inputs.version }} version
46
+ run: |
47
+ git add .
48
+ git commit --sign -m "${VERSION}"
49
+ git tag --sign "v${VERSION}" -m "${VERSION}"
50
+ git push --follow-tags
51
+ env:
52
+ VERSION: ${{ steps.meta.outputs.version }}
data/.gitignore ADDED
@@ -0,0 +1,67 @@
1
+ # Parts of this file were adapted from
2
+ # GitHub’s collection of .gitignore file templates
3
+ # which are Copyright (c) 2023 GitHub, Inc.
4
+ # and released under the MIT License.
5
+ # For more details, visit the project page:
6
+ # https://github.com/github/gitignore
7
+
8
+ # rspec failure tracking
9
+ .rspec_status
10
+
11
+ *.gem
12
+ *.rbc
13
+ /.config
14
+ /coverage/
15
+ /InstalledFiles
16
+ /pkg/
17
+ /spec/reports/
18
+ /spec/examples.txt
19
+ /test/tmp/
20
+ /test/version_tmp/
21
+ /tmp/
22
+
23
+ # Used by dotenv library to load environment variables.
24
+ # .env
25
+
26
+ # Ignore Byebug command history file.
27
+ .byebug_history
28
+
29
+ ## Specific to RubyMotion:
30
+ .dat*
31
+ .repl_history
32
+ build/
33
+ *.bridgesupport
34
+ build-iPhoneOS/
35
+ build-iPhoneSimulator/
36
+
37
+ ## Specific to RubyMotion (use of CocoaPods):
38
+ #
39
+ # We recommend against adding the Pods directory to your .gitignore. However
40
+ # you should judge for yourself, the pros and cons are mentioned at:
41
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
42
+ #
43
+ # vendor/Pods/
44
+
45
+ ## Documentation cache and generated files:
46
+ /.yardoc/
47
+ /_yardoc/
48
+ /doc/
49
+ /rdoc/
50
+
51
+ ## Environment normalization:
52
+ /.bundle/
53
+ /vendor/bundle
54
+ /lib/bundler/man/
55
+
56
+ # for a library or gem, you might want to ignore these files since the code is
57
+ # intended to run in multiple environments; otherwise, check them in:
58
+ # Gemfile.lock
59
+ # .ruby-version
60
+ # .ruby-gemset
61
+
62
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
63
+ .rvmrc
64
+
65
+ # Used by RuboCop. Remote config files pulled in from inherit_from directive.
66
+ # .rubocop-https?--*
67
+ html
data/.rspec ADDED
@@ -0,0 +1,4 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
4
+ --pattern "{spec,lib}/**/*_spec.rb"
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.2.0
data/CHANGELOG.md ADDED
@@ -0,0 +1,39 @@
1
+ ### 1.0.4
2
+
3
+ 2023-09-06 09:23
4
+
5
+ #### NEW
6
+
7
+ - Initial journal command
8
+ - Multiple journals, multiple sections
9
+
10
+ ### 1.0.3
11
+
12
+ 2023-09-06 09:10
13
+
14
+ #### NEW
15
+
16
+ - Initial journal command
17
+ - Multiple journals, multiple sections
18
+
19
+ ### 1.0.2
20
+
21
+ 2023-09-06 09:09
22
+
23
+ #### NEW
24
+
25
+ - Initial journal command
26
+ - Multiple journals, multiple sections
27
+
28
+ ### 1.0.1
29
+
30
+ 2023-09-06 09:07
31
+
32
+ #### NEW
33
+
34
+ - Initial journal command
35
+ - Multiple journals, multiple sections
36
+
37
+ ### 1.0.0
38
+
39
+ 2023-09-05 16:46
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in journal-cli.gemspec.
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,99 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ journal-cli (1.0.1)
5
+ chronic (~> 0.10, >= 0.10.2)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ansi (1.5.0)
11
+ ast (2.4.2)
12
+ chronic (0.10.2)
13
+ diff-lcs (1.5.0)
14
+ docile (1.4.0)
15
+ gem-release (2.2.2)
16
+ json (2.6.3)
17
+ language_server-protocol (3.17.0.2)
18
+ multi_json (1.15.0)
19
+ parallel (1.22.1)
20
+ parse_gemspec (1.0.0)
21
+ parse_gemspec-cli (1.0.0)
22
+ multi_json
23
+ parse_gemspec
24
+ thor
25
+ parser (3.1.3.0)
26
+ ast (~> 2.4.1)
27
+ rainbow (3.1.1)
28
+ rake (13.0.6)
29
+ regexp_parser (2.6.1)
30
+ rexml (3.2.5)
31
+ rspec (3.12.0)
32
+ rspec-core (~> 3.12.0)
33
+ rspec-expectations (~> 3.12.0)
34
+ rspec-mocks (~> 3.12.0)
35
+ rspec-core (3.12.0)
36
+ rspec-support (~> 3.12.0)
37
+ rspec-expectations (3.12.1)
38
+ diff-lcs (>= 1.2.0, < 2.0)
39
+ rspec-support (~> 3.12.0)
40
+ rspec-mocks (3.12.1)
41
+ diff-lcs (>= 1.2.0, < 2.0)
42
+ rspec-support (~> 3.12.0)
43
+ rspec-support (3.12.0)
44
+ rubocop (1.40.0)
45
+ json (~> 2.3)
46
+ parallel (~> 1.10)
47
+ parser (>= 3.1.2.1)
48
+ rainbow (>= 2.2.2, < 4.0)
49
+ regexp_parser (>= 1.8, < 3.0)
50
+ rexml (>= 3.2.5, < 4.0)
51
+ rubocop-ast (>= 1.23.0, < 2.0)
52
+ ruby-progressbar (~> 1.7)
53
+ unicode-display_width (>= 1.4.0, < 3.0)
54
+ rubocop-ast (1.24.1)
55
+ parser (>= 3.1.1.0)
56
+ rubocop-performance (1.15.1)
57
+ rubocop (>= 1.7.0, < 2.0)
58
+ rubocop-ast (>= 0.4.0)
59
+ ruby-progressbar (1.11.0)
60
+ simplecov (0.22.0)
61
+ docile (~> 1.1)
62
+ simplecov-html (~> 0.11)
63
+ simplecov_json_formatter (~> 0.1)
64
+ simplecov-console (0.9.1)
65
+ ansi
66
+ simplecov
67
+ terminal-table
68
+ simplecov-html (0.12.3)
69
+ simplecov_json_formatter (0.1.4)
70
+ standard (1.20.0)
71
+ language_server-protocol (~> 3.17.0.2)
72
+ rubocop (= 1.40.0)
73
+ rubocop-performance (= 1.15.1)
74
+ terminal-table (3.0.2)
75
+ unicode-display_width (>= 1.1.1, < 3)
76
+ thor (1.2.1)
77
+ unicode-display_width (2.3.0)
78
+
79
+ PLATFORMS
80
+ arm64-darwin-21
81
+ x64-mingw-ucr
82
+ x64-mingw-ucrt
83
+ x64-mingw32
84
+ x86_64-darwin
85
+ x86_64-linux
86
+
87
+ DEPENDENCIES
88
+ bundler (~> 2.0)
89
+ gem-release (~> 2.2)
90
+ journal-cli!
91
+ parse_gemspec-cli (~> 1.0)
92
+ rake (~> 13.0)
93
+ rspec (~> 3.0)
94
+ simplecov (~> 0.21)
95
+ simplecov-console (~> 0.9)
96
+ standard (~> 1.3)
97
+
98
+ BUNDLED WITH
99
+ 2.4.1
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2023 Brett Terpstra
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.