faithteams-api 4.4.0 → 4.6.2

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: 5eebefdf4e9bede5d027923cd5a90d20ee1e127d75108e1ac1fa9959137a17c4
4
- data.tar.gz: f9856698e3a8f6121de80db4d0b5d1ec3d650a42fd75e36a22e811ee36173b95
3
+ metadata.gz: 1aec219baf9e280f2684ac5457185faa130dbab2dd6c1df7697eab9ba64531fe
4
+ data.tar.gz: 1d33fb74c60916e51b80508aaa1d1f13ee505809def08ec53680ffb487802553
5
5
  SHA512:
6
- metadata.gz: ab0dc289ad48586c3c82db322fdddfde8c35f62e5dc62746a274f792f10552dcd09bb4ee3df932f751c5c05559f96d0f6245cb160ad34c208eae6127cc0dcc89
7
- data.tar.gz: e36503ba66dae11eb177f88d102c7a3ff394ca81bcf10b699e486f001bde8267e867892fe2e86b2ae6e14af665e281e67d354c7fbd6974406e8310ad1bda46af
6
+ metadata.gz: 19e2536a3ca5cdc975367d79fe171d1910b970ea5bbcea2551fa10e62c706bace12100c485bae76397ed32f35adf245b263b8ba907d2e88de2dbd5ee7c157ed0
7
+ data.tar.gz: a9bbddfba4867de680cdd08ff34a59c566af5673040dceaa198394be1cf8cdeec7bce8ec396d71d16d252e072b76e8608384a050654d388cf43dd6cbb795209a
data/CHANGELOG.md CHANGED
@@ -7,6 +7,39 @@ All notable changes to this project will be documented in this file.
7
7
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
8
8
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
9
9
 
10
+ ## [4.6.2]
11
+
12
+ ### Removed
13
+
14
+ 1. Remove `thunder-tests/`, a dead Thunder Client collection fully superseded by the Bruno collection already checked in - it held a live FaithTeams test-tenant `auth_token` in a committed, unencrypted environment file, which the gem's file filter didn't exclude, so it shipped inside every published gem version on RubyGems. (SEC25-778)
15
+
16
+ ### Fixed
17
+
18
+ 1. Switch the gemspec's packaging filter from a denylist (`reject test/spec/features`) to an allowlist (`lib/`, `exe/`, plus README/LICENSE/CHANGELOG). The denylist required remembering to add every new dev-tooling directory - that's exactly how `thunder-tests/` went unnoticed. The Bruno collection, `AGENTS.md`, `CLAUDE.md`, `Guardfile`, `.github/`, and other dev-only content were also shipping in the gem unintentionally; none of them are needed at runtime. (SEC25-778)
19
+
20
+ ## [4.6.1]
21
+
22
+ ### Changed
23
+
24
+ 1. Use GH actions for Node 24. (ISG-92)
25
+
26
+ ### Fixed
27
+
28
+ 1. Lock rubygems.yml ruby version to 3.3. (ISG-92)
29
+
30
+ ## [4.6.0]
31
+
32
+ ### Changed
33
+
34
+ 1. Relax patch-level dependency pins to minor-level to allow security patch updates. (ISG-92)
35
+ 1. Remove transitive dependencies (logger, ostruct, rexml, thor) from gemspec; add rexml and thor as Gemfile security floor constraints. (ISG-92)
36
+
37
+ ## [4.5.0]
38
+
39
+ ### Added
40
+
41
+ 1. Add Bruno API Client (to eventually replace ThunderClient). (IN-2728)
42
+
10
43
  ## [4.4.0]
11
44
 
12
45
  ### Changed
data/README.md CHANGED
@@ -29,6 +29,25 @@ Or install it yourself as:
29
29
 
30
30
  `gem install faithteams`
31
31
 
32
+ ## VS Code Bruno Extension
33
+
34
+ We are now using the [Bruno API Client](https://docs.usebruno.com/introduction/what-is-bruno) for developing and testing 2nd party API requests. You can use a desktop app or VS Code extension to use Bruno.
35
+
36
+ ### Desktop App
37
+
38
+ 1. Simply follow these instructions for your desktop app [installation options](https://docs.usebruno.com/get-started/bruno-basics/download).
39
+
40
+ ### VS Code Extension
41
+
42
+ 1. If you don't already have it, install the VS Code Bruno Extension.
43
+ 1. After opening the extension, click the + button to open a "collection".
44
+ 1. Find the root level '[second_party]-api' directory. (ie 'faithteams-api')
45
+ 1. Make a copy of the .env.template file (and make sure to just call it .env) and fill in the necessary values from 1Password.
46
+ 1. In the left pane, open the ... menu beside faithteams-api and select *settings*.
47
+ 1. Select your desired environment to use with this collection in the upper right (most likely *FaithTeams*).
48
+ 1. You should now be ready to make some API calls!
49
+ 1. See Bruno's [VS Code Extension Documentation](https://docs.usebruno.com/vs-code-extension/overview) for more details.
50
+
32
51
  ## Contributing
33
52
 
34
53
  ### How to Contribute
@@ -24,30 +24,32 @@ Gem::Specification.new do |spec|
24
24
  spec.metadata["documentation_uri"] = "https://github.com/tithely/faithteams-api/blob/master/README.md"
25
25
 
26
26
  # Specify which files should be added to the gem when it is released.
27
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
+ # Allowlisted, not denylisted: only what the gem needs at runtime plus a
28
+ # few standard root docs. A denylist has to be remembered and updated
29
+ # every time a new dev-tooling directory shows up in the repo - that's
30
+ # how thunder-tests/ (and its live test-tenant credential) ended up
31
+ # shipping in the published gem unnoticed.
28
32
  spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
29
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
33
+ `git ls-files -z`.split("\x0").select do |f|
34
+ f.match(%r{^(lib|exe)/}) || %w[README.md LICENSE CHANGELOG.md faithteams-api.gemspec].include?(f)
35
+ end
30
36
  end
31
37
  spec.bindir = "exe"
32
38
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
33
39
  spec.require_paths = ["lib"]
34
40
 
35
- spec.add_dependency "activesupport", "~> 7.2.2"
41
+ spec.add_dependency "activesupport", "~> 7.2"
36
42
  spec.add_dependency "http", "~> 5.1"
37
- spec.add_dependency "logger", "~> 1.6.1"
38
- spec.add_dependency "ostruct", "~> 0.6.0"
39
- spec.add_dependency "rexml", "~> 3.3.9" # only needs to be specified to address security warning
40
- spec.add_dependency "thor", "~> 1.4.0"
41
43
 
42
44
  spec.add_development_dependency "byebug", "~> 11.1"
43
45
  spec.add_development_dependency "guard-rspec", "~> 4.7"
44
46
  spec.add_development_dependency "simplecov", "~> 0.21"
45
47
  spec.add_development_dependency "rake", "~> 13.0"
46
48
  spec.add_development_dependency "rspec", "~> 3.12"
47
- spec.add_development_dependency "rubocop", "~> 1.73.2"
48
- spec.add_development_dependency "rubocop-performance", "~> 1.24.0"
49
- spec.add_development_dependency "rubocop-rake", "~> 0.7.1"
50
- spec.add_development_dependency "rubocop-rspec", "~> 3.5.0"
49
+ spec.add_development_dependency "rubocop", "~> 1.73"
50
+ spec.add_development_dependency "rubocop-performance", "~> 1.24"
51
+ spec.add_development_dependency "rubocop-rake", "~> 0.7"
52
+ spec.add_development_dependency "rubocop-rspec", "~> 3.5"
51
53
  spec.add_development_dependency "webmock", "~> 3.18"
52
- spec.add_development_dependency "yard", "~> 0.9.36"
54
+ spec.add_development_dependency "yard", "~> 0.9"
53
55
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module FaithTeams
4
4
  # Current version number.
5
- VERSION = "4.4.0"
5
+ VERSION = "4.6.2"
6
6
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faithteams-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.0
4
+ version: 4.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tithe.ly Integrations
8
+ autorequire:
8
9
  bindir: exe
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-08-11 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: activesupport
@@ -15,14 +16,14 @@ dependencies:
15
16
  requirements:
16
17
  - - "~>"
17
18
  - !ruby/object:Gem::Version
18
- version: 7.2.2
19
+ version: '7.2'
19
20
  type: :runtime
20
21
  prerelease: false
21
22
  version_requirements: !ruby/object:Gem::Requirement
22
23
  requirements:
23
24
  - - "~>"
24
25
  - !ruby/object:Gem::Version
25
- version: 7.2.2
26
+ version: '7.2'
26
27
  - !ruby/object:Gem::Dependency
27
28
  name: http
28
29
  requirement: !ruby/object:Gem::Requirement
@@ -37,62 +38,6 @@ dependencies:
37
38
  - - "~>"
38
39
  - !ruby/object:Gem::Version
39
40
  version: '5.1'
40
- - !ruby/object:Gem::Dependency
41
- name: logger
42
- requirement: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: 1.6.1
47
- type: :runtime
48
- prerelease: false
49
- version_requirements: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: 1.6.1
54
- - !ruby/object:Gem::Dependency
55
- name: ostruct
56
- requirement: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: 0.6.0
61
- type: :runtime
62
- prerelease: false
63
- version_requirements: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: 0.6.0
68
- - !ruby/object:Gem::Dependency
69
- name: rexml
70
- requirement: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: 3.3.9
75
- type: :runtime
76
- prerelease: false
77
- version_requirements: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: 3.3.9
82
- - !ruby/object:Gem::Dependency
83
- name: thor
84
- requirement: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: 1.4.0
89
- type: :runtime
90
- prerelease: false
91
- version_requirements: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: 1.4.0
96
41
  - !ruby/object:Gem::Dependency
97
42
  name: byebug
98
43
  requirement: !ruby/object:Gem::Requirement
@@ -169,56 +114,56 @@ dependencies:
169
114
  requirements:
170
115
  - - "~>"
171
116
  - !ruby/object:Gem::Version
172
- version: 1.73.2
117
+ version: '1.73'
173
118
  type: :development
174
119
  prerelease: false
175
120
  version_requirements: !ruby/object:Gem::Requirement
176
121
  requirements:
177
122
  - - "~>"
178
123
  - !ruby/object:Gem::Version
179
- version: 1.73.2
124
+ version: '1.73'
180
125
  - !ruby/object:Gem::Dependency
181
126
  name: rubocop-performance
182
127
  requirement: !ruby/object:Gem::Requirement
183
128
  requirements:
184
129
  - - "~>"
185
130
  - !ruby/object:Gem::Version
186
- version: 1.24.0
131
+ version: '1.24'
187
132
  type: :development
188
133
  prerelease: false
189
134
  version_requirements: !ruby/object:Gem::Requirement
190
135
  requirements:
191
136
  - - "~>"
192
137
  - !ruby/object:Gem::Version
193
- version: 1.24.0
138
+ version: '1.24'
194
139
  - !ruby/object:Gem::Dependency
195
140
  name: rubocop-rake
196
141
  requirement: !ruby/object:Gem::Requirement
197
142
  requirements:
198
143
  - - "~>"
199
144
  - !ruby/object:Gem::Version
200
- version: 0.7.1
145
+ version: '0.7'
201
146
  type: :development
202
147
  prerelease: false
203
148
  version_requirements: !ruby/object:Gem::Requirement
204
149
  requirements:
205
150
  - - "~>"
206
151
  - !ruby/object:Gem::Version
207
- version: 0.7.1
152
+ version: '0.7'
208
153
  - !ruby/object:Gem::Dependency
209
154
  name: rubocop-rspec
210
155
  requirement: !ruby/object:Gem::Requirement
211
156
  requirements:
212
157
  - - "~>"
213
158
  - !ruby/object:Gem::Version
214
- version: 3.5.0
159
+ version: '3.5'
215
160
  type: :development
216
161
  prerelease: false
217
162
  version_requirements: !ruby/object:Gem::Requirement
218
163
  requirements:
219
164
  - - "~>"
220
165
  - !ruby/object:Gem::Version
221
- version: 3.5.0
166
+ version: '3.5'
222
167
  - !ruby/object:Gem::Dependency
223
168
  name: webmock
224
169
  requirement: !ruby/object:Gem::Requirement
@@ -239,14 +184,14 @@ dependencies:
239
184
  requirements:
240
185
  - - "~>"
241
186
  - !ruby/object:Gem::Version
242
- version: 0.9.36
187
+ version: '0.9'
243
188
  type: :development
244
189
  prerelease: false
245
190
  version_requirements: !ruby/object:Gem::Requirement
246
191
  requirements:
247
192
  - - "~>"
248
193
  - !ruby/object:Gem::Version
249
- version: 0.9.36
194
+ version: '0.9'
250
195
  description: Provides methods and utilities for interacting with the faithteams API.
251
196
  email:
252
197
  - integrations@tithe.ly
@@ -254,32 +199,10 @@ executables: []
254
199
  extensions: []
255
200
  extra_rdoc_files: []
256
201
  files:
257
- - ".editorconfig"
258
- - ".github/CODEOWNERS"
259
- - ".github/CONTRIBUTING.md"
260
- - ".github/PULL_REQUEST_TEMPLATE.md"
261
- - ".github/workflows/editorconfig.yml"
262
- - ".github/workflows/rubocop.yml"
263
- - ".github/workflows/rubygems.yml"
264
- - ".github/workflows/tester.yml"
265
- - ".github/workflows/yard.yml"
266
- - ".gitignore"
267
- - ".rspec"
268
- - ".rubocop.yml"
269
- - ".tool-versions"
270
202
  - CHANGELOG.md
271
- - CODE_OF_CONDUCT.md
272
- - Gemfile
273
- - Gemfile.lock
274
- - Guardfile
275
203
  - LICENSE
276
204
  - README.md
277
- - Rakefile
278
- - bin/console
279
- - bin/setup
280
205
  - faithteams-api.gemspec
281
- - guides/api_client_interface.md
282
- - guides/release-process.md
283
206
  - lib/faithteams.rb
284
207
  - lib/faithteams/api.rb
285
208
  - lib/faithteams/api/v2.rb
@@ -305,11 +228,6 @@ files:
305
228
  - lib/faithteams/api/v2/resource/fund.rb
306
229
  - lib/faithteams/api/v2/resource/person.rb
307
230
  - lib/faithteams/version.rb
308
- - thunder-tests/.gitignore
309
- - thunder-tests/collections/tc_col_faithteams-api.json
310
- - thunder-tests/collections/tc_col_faithteams-app.json
311
- - thunder-tests/environments/tc_env_faithteams.json
312
- - thunder-tests/faithteams.env.template
313
231
  homepage: https://github.com/tithely/faithteams-api
314
232
  licenses:
315
233
  - MIT
@@ -321,6 +239,7 @@ metadata:
321
239
  changelog_uri: https://github.com/tithely/faithteams-api/blob/master/CHANGELOG.md
322
240
  bug_tracker_uri: https://github.com/tithely/faithteams-api/issues
323
241
  documentation_uri: https://github.com/tithely/faithteams-api/blob/master/README.md
242
+ post_install_message:
324
243
  rdoc_options: []
325
244
  require_paths:
326
245
  - lib
@@ -335,7 +254,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
335
254
  - !ruby/object:Gem::Version
336
255
  version: '0'
337
256
  requirements: []
338
- rubygems_version: 3.6.9
257
+ rubygems_version: 3.5.22
258
+ signing_key:
339
259
  specification_version: 4
340
260
  summary: A Faithteams API client gem.
341
261
  test_files: []
data/.editorconfig DELETED
@@ -1,11 +0,0 @@
1
- [*]
2
- end_of_line = lf
3
- trim_trailing_whitespace = true
4
- insert_final_newline = true
5
- indent_style = space
6
- indent_size = 2
7
- charset = utf-8
8
-
9
- [*.{json,md}]
10
- indent_style = space
11
- indent_size = 4
data/.github/CODEOWNERS DELETED
@@ -1 +0,0 @@
1
- * @tithely/integrations
@@ -1,35 +0,0 @@
1
- # Introduction
2
-
3
- First off, thank you for considering contributing to Tithely open source. We strive to be the best platform for developers to build tools for the church and want to thank you for your bug report or pull requests.
4
-
5
- Following these guidelines helps to communicate that you respect the time of the developers managing and developing this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests.
6
-
7
- ## What We Look For
8
-
9
- We welcome any bug reports and documentation corrections or additions. If you have a fix or a bit of functionality you would like to see introduced, please follow our guidelines for submitting a PR. We will work with you to determine if we can incorporate your work right now or plan for it in the future.
10
-
11
- # Ground Rules
12
-
13
- * We respect all members and welcome diverse viewpoints and contributions. For more information, check out our [Code of Conduct](https://github.com/tithely/tithely-transaction-gem/blob/master/CODE_OF_CONDUCT.md).
14
- * Keep pull requests as short and direct as possible.
15
- * Tests must accompany any pull request to show additional or changed behavior.
16
-
17
- # Reporting a Bug
18
-
19
- If you find a security vulnerability, do NOT open an issue. Email integrations@tithe.ly instead.
20
-
21
- For any other bug report, please open an issue [here](https://github.com/tithely/tithely-transaction-gem/issues/new?assignees=&labels=fix&template=bug_report.md&title=).
22
-
23
- Follow along with the template and please provide as much information as possible.
24
-
25
- # Suggesting a Feature
26
-
27
- Before submitting a feature request, check out our [Roadmap](https://github.com/tithely/tithely-transaction-gem/wiki/2020-Roadmap) and active [Projects](https://github.com/tithely/tithely-transaction-gem/projects) to make sure that we aren't currently working on it.
28
-
29
- For any other requests, please open an issue [here](https://github.com/tithely/tithely-transaction-gem/issues/new?assignees=&labels=new&template=feature_request.md&title=).
30
-
31
- Follow along with the template and please provide as much information as possible.
32
-
33
- # Submitting a Pull Request
34
-
35
- When submitting a pull request, please follow along with our template and ensure that everything is passing. As a rule, we generally will not take a look at code before all checks have passed.
@@ -1,8 +0,0 @@
1
- # Summary
2
-
3
-
4
-
5
- ## Checklist
6
-
7
- * [ ] Did we think two weeks into the future and not two years? Is this addition malleable to be changed tomorrow without being over-engineered today?
8
- * [ ] Have you updated the changelog with this behavior?
@@ -1,23 +0,0 @@
1
- name: EditorConfig
2
-
3
- on:
4
- pull_request:
5
- types: [ opened, reopened, synchronize ]
6
- workflow_dispatch:
7
-
8
- jobs:
9
- build:
10
- name: Check
11
- runs-on: ubuntu-latest
12
- steps:
13
- - name: Checkout Code
14
- uses: actions/checkout@v4
15
- - name: Setup Node
16
- uses: actions/setup-node@v4
17
- with:
18
- node-version: 20
19
- - name: Install editorconfig-checker
20
- run: npm install --global editorconfig-checker
21
- - name: Run editorconfig-checker
22
- run: |
23
- editorconfig-checker -verbose -exclude "(thunder-tests|Gemfile.lock|.csv)"
@@ -1,21 +0,0 @@
1
- name: Rubocop
2
-
3
- on:
4
- pull_request:
5
- types: [ opened, reopened, synchronize ]
6
- workflow_dispatch:
7
-
8
- jobs:
9
- check:
10
- name: Check
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v4
14
- - name: Set up Ruby
15
- uses: ruby/setup-ruby@v1
16
- with:
17
- ruby-version: 3.3
18
- - name: Install dependencies
19
- run: bundle install
20
- - name: Run Rubocop
21
- run: bundle exec rubocop --parallel
@@ -1,36 +0,0 @@
1
- # Builds and pushes a gem to RubyGems.
2
- name: RubyGems
3
-
4
- on:
5
- pull_request:
6
- # Only on the production branch
7
- branches:
8
- - production
9
- # Only when closed
10
- types:
11
- - closed
12
- workflow_dispatch:
13
-
14
- jobs:
15
- push:
16
- if: github.event.pull_request.merged == true
17
- runs-on: ubuntu-latest
18
-
19
- permissions:
20
- contents: write
21
- id-token: write
22
-
23
- # If you configured a GitHub environment on RubyGems, you must use it here.
24
- environment: release
25
-
26
- steps:
27
- # Set up
28
- - uses: actions/checkout@v4
29
- - name: Set up Ruby
30
- uses: ruby/setup-ruby@v1
31
- with:
32
- bundler-cache: true
33
- ruby-version: ruby
34
-
35
- # Release
36
- - uses: rubygems/release-gem@v1
@@ -1,21 +0,0 @@
1
- name: Tester
2
-
3
- on:
4
- pull_request:
5
- types: [ opened, reopened, synchronize ]
6
- workflow_dispatch:
7
-
8
- jobs:
9
- build:
10
- name: Test
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v4
14
- - name: Set up Ruby
15
- uses: ruby/setup-ruby@v1
16
- with:
17
- ruby-version: 3.3
18
- - name: Install dependencies
19
- run: bundle install
20
- - name: Run tests
21
- run: bundle exec rake
@@ -1,21 +0,0 @@
1
- name: Yard
2
-
3
- on:
4
- pull_request:
5
- types: [ opened, reopened, synchronize ]
6
- workflow_dispatch:
7
-
8
- jobs:
9
- check:
10
- name: Check
11
- runs-on: ubuntu-latest
12
- steps:
13
- - uses: actions/checkout@v4
14
- - name: Set up Ruby
15
- uses: ruby/setup-ruby@v1
16
- with:
17
- ruby-version: 3.3
18
- - name: Install dependencies
19
- run: bundle install
20
- - name: Run Yard
21
- run: bundle exec yard stats --list-undoc --fail-on-warning
data/.gitignore DELETED
@@ -1,16 +0,0 @@
1
- /.bundle/
2
- /.byebug_history
3
- /.yardoc
4
- /_yardoc/
5
- /doc/
6
- /coverage/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
10
-
11
- # rspec failure tracking
12
- .rspec_status
13
-
14
- .idea/*
15
-
16
- .DS_Store
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --require spec_helper